【Python】100本ノックやってます。p‐89
P-089: 売上実績がある顧客を、予測モデル構築のため学習用データとテスト用データに分割したい。それぞれ8:2の割合でランダムにデータを分割せよ。
pip install scikit-learn
して
from sklearn.model_selection import train_test_split
した上で
df_train, df_test = train_test_split(df_sales_customer, test_size=0.2)
【Python】100本ノックやってます。p‐87~p-88
P-087: 顧客データ(df_customer)では、異なる店舗での申込みなどにより同一顧客が複数登録されている。名前(customer_name)と郵便番号(postal_cd)が同じ顧客は同一顧客とみなして1顧客1レコードとなるように名寄せした名寄顧客データを作成し、顧客データの件数、名寄顧客データの件数、重複数を算出せよ。ただし、同一顧客に対しては売上金額合計が最も高いものを残し、売上金額合計が同一もしくは売上実績がない顧客については顧客ID(customer_id)の番号が小さいものを残すこととする。
P-088: 087で作成したデータを元に、顧客データに統合名寄IDを付与したデータを作成せよ。ただし、統合名寄IDは以下の仕様で付与するものとする。
・重複していない顧客:顧客ID(customer_id)を設定
・重複している顧客:前設問で抽出したレコードの顧客IDを設定顧客IDのユニーク件数と、統合名寄IDのユニーク件数の差も確認すること。
この二つめちゃくちゃ難しかった、、、何だろうはまった、、、
考え方としては
ダブっている人を抜かしたリストを作る。(名寄席顧客データ)
それと元の顧客リストを名前と郵便番号で内部結合すると。
そうするとダブった人のところにも残す人のcustomer_idが入ると。
難しくなさそうなのになんかはまった・・・
【Python】100本ノックやってます。p‐84~p-86
P-084: 顧客データ(df_customer)の全顧客に対して全期間の売上金額に占める2019年売上金額の割合を計算し、新たなデータを作成せよ。ただし、売上実績がない場合は0として扱うこと。そして計算した割合が0超のものを抽出し、結果を10件表示せよ。また、作成したデータに欠損が存在しないことを確認せよ。
スムーズな方法になってるかはわからないけど、昨日理解したapplyを使いこなしたくて使ってみた!あまり時間かからずできた!
P-085: 顧客データ(df_customer)の全顧客に対し、郵便番号(postal_cd)を用いてジオコードデータ(df_geocode)を紐付け、新たな顧客データを作成せよ。ただし、1つの郵便番号(postal_cd)に複数の経度(longitude)、緯度(latitude)情報が紐づく場合は、経度(longitude)、緯度(latitude)の平均値を算出して使用すること。また、作成結果を確認するために結果を10件表示せよ。
突然簡単になってびっくりだったけど、次へのつながりがあるのか。
P-086: 085で作成した緯度経度つき顧客データに対し、会員申込店舗コード(application_store_cd)をキーに店舗データ(df_store)と結合せよ。そして申込み店舗の緯度(latitude)・経度情報(longitude)と顧客住所(address)の緯度・経度を用いて申込み店舗と顧客住所の距離(単位:km)を求め、顧客ID(customer_id)、顧客住所(address)、店舗住所(address)とともに表示せよ。計算式は以下の簡易式で良いものとするが、その他精度の高い方式を利用したライブラリを利用してもかまわない。結果は10件表示せよ。
math.sin、math.cos、math.acosが分かれば問題なし。
mathにはデータフレームは渡せないからapply使わないといけない。
【Python】100本ノックやってます。p‐81~p-83
P-081: 単価(unit_price)と原価(unit_cost)の欠損値について、それぞれの平均値で補完した新たな商品データを作成せよ。なお、平均値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
平均出して、fillna使う。
[inplace=True]をつけないと反映されないの不思議。要注意。
P-082: 単価(unit_price)と原価(unit_cost)の欠損値について、それぞれの中央値で補完した新たな商品データを作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
中央値出してfillna使う。
P-083: 単価(unit_price)と原価(unit_cost)の欠損値について、各商品のカテゴリ小区分コード(category_small_cd)ごとに算出した中央値で補完した新たな商品データを作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
小区分コードごとの中央値は出せるけど、それをNaNにどう入れれば・・・
大変だった、、、3~4時間悩んでしまった・・・
先に全部マージして、NaNのところに入れるということが思いつかず。
いまいちapplyの使い方がつかみ切れてなくて。
xをなんとするかが難しかった・・・
【Python】100本ノックやってます。p‐81~p-83
P-081: 単価(unit_price)と原価(unit_cost)の欠損値について、それぞれの平均値で補完した新たな商品データを作成せよ。なお、平均値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
平均出して、fillna使う。
[inplace=True]をつけないと反映されないの不思議。要注意。
P-082: 単価(unit_price)と原価(unit_cost)の欠損値について、それぞれの中央値で補完した新たな商品データを作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
中央値出してfillna使う。
P-083: 単価(unit_price)と原価(unit_cost)の欠損値について、各商品のカテゴリ小区分コード(category_small_cd)ごとに算出した中央値で補完した新たな商品データを作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
小区分コードごとの中央値は出せるけど、それをNaNにどう入れれば・・・
大変だった、、、3~4時間悩んでしまった・・・
先に全部マージして、NaNのところに入れるということが思いつかず。
いまいちapplyの使い方がつかみ切れてなくて。
xをなんとするかが難しかった・・・
【Python】100本ノックやってます。p‐75~p-80
P-075: 顧客データ(df_customer)からランダムに1%のデータを抽出し、先頭から10件表示せよ。
これはfracで問題なく。
P-076: 顧客データ(df_customer)から性別コード(gender_cd)の割合に基づきランダムに10%のデータを層化抽出し、性別コードごとに件数を集計せよ。
素直にgroupbyしてそれぞれの人数出して、10%の人数出したんだけど、解答例はまた知らないのでてきた。
「# sklearn.model_selection.train_test_splitを使用した例」
P-077: レシート明細データ(df_receipt)の売上金額を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。なお、外れ値は売上金額合計を対数化したうえで平均と標準偏差を計算し、その平均から3σを超えて離れたものとする(自然対数と常用対数のどちらでも可)。結果は10件表示せよ。
外れ値って何ぞやがわからないことが問題、コード組むこと自体は問題なし。
P-078: レシート明細データ(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を第1四分位と第3四分位の差であるIQRを用いて、「第1四分位数-1.5×IQR」を下回るもの、または「第3四分位数+1.5×IQR」を超えるものとする。結果は10件表示せよ。
P-079: 商品データ(df_product)の各項目に対し、欠損数を確認せよ。
df_product.isnull().sum()
P-080: 商品データ(df_product)のいずれかの項目に欠損が発生しているレコードを全て削除した新たな商品データを作成せよ。なお、削除前後の件数を表示させ、079で確認した件数だけ減少していることも確認すること。
.dropna()
でNaNが削除できる!
【Python】100本ノックやってます。p‐70~p-74
P-070: レシート明細データ(df_receipt)の売上日(sales_ymd)に対し、顧客データ(df_customer)の会員申込日(application_date)からの経過日数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。
型を調べると
sales_ymd int64 customer_id object application_date int64 dtype: object
どちらも数値じゃん。
そして20181103みたいな形は、一旦文字列にしてからdate型にしないといけないらしい。
astypeで2列ともdate一気にしたかったのにエラー出ちゃってできないので、とりあえず1行ずつ変換した。
とりあえず答えは出たのでいいかしら、、、
P-071: レシート明細データ(df_receipt)の売上日(sales_ymd)に対し、顧客データ(df_customer)の会員申込日(application_date)からの経過月数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1ヶ月未満は切り捨てること。
算数的に難しかった・・・(馬鹿)
「1か月未満は切り捨て」ってどっち方面???=-1どっちにも必要???
で躓きまくってました・・・
紙に線書いてるのにワカラナイのwww馬鹿すぎるwww
P-072: レシート明細データ(df_receipt)の売上日(df_customer)に対し、顧客データ(df_customer)の会員申込日(application_date)からの経過年数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1年未満は切り捨てること。
daysを365日で割ろうと思ったけど、型が違うからかな、できなかった。
なので、P-071で出したmonthsを12で割ってみた。
P-073: レシート明細データ(df_receipt)の売上日(sales_ymd)に対し、顧客データ(df_customer)の会員申込日(application_date)からのエポック秒による経過時間を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。なお、時間情報は保有していないため各日付は0時0分0秒を表すものとする。
dt.apply(lambda x: int(x.timestamp()))
を使って引き算。
解答は違ったのでちゃんと理解しておく。
P-074: レシート明細データ(df_receipt)の売上日(sales_ymd)に対し、当該週の月曜日からの経過日数を計算し、売上日、直前の月曜日付とともに10件表示せよ(sales_ymdは数値でデータを保持している点に注意)。
●日前(変数)を引く方法に四苦八苦。
-pd.to_timedelta(df_sales["sales_weekday"],unit='d')
でいけた!