3 minutes
データサイエンス100本ノックをPythonでやってみた [21-30]
データサイエンス 100 本ノックとは
The-Japan-DataScientist-Society/100knocks-preprocess: データサイエンス 100 本ノック(構造化データ加工編)
Google Colab で データサイエンス 100 本ノックをするにあたって
以下の ipynb ファイルを使用させていただきました。
実行ファイル
データサイエンス 100 本ノック by tomowarkar
021
P-021: レシート明細データフレーム(df_receipt)に対し、件数をカウントせよ。
len(df_receipt) #> 104681
022
P-022: レシート明細データフレーム(df_receipt)の顧客 ID(customer_id)に対し、ユニーク件数をカウントせよ。
df_receipt.customer_id.nunique() #> 8307
pandas.Series.nunique
を使います。
023
P-023: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)と売上数量(quantity)を合計せよ。
df_receipt[["store_cd", "amount", "quantity"]]\
.groupby("store_cd").sum().head(10)
amount quantity
store_cd
S12007 638761 2099
S12013 787513 2425
S12014 725167 2358
S12029 794741 2555
S12030 684402 2403
S13001 811936 2347
S13002 727821 2340
S13003 764294 2197
S13004 779373 2390
S13005 629876 2004
024
P-024: レシート明細データフレーム(df_receipt)に対し、顧客 ID(customer_id)ごとに最も新しい売上日(sales_ymd)を求め、10 件表示せよ。
df_receipt[["customer_id", "sales_ymd"]]\
.groupby("customer_id").max().head(10)
sales_ymd
customer_id
CS001113000004 20190308
CS001114000005 20190731
CS001115000010 20190405
CS001205000004 20190625
CS001205000006 20190224
CS001211000025 20190322
CS001212000027 20170127
CS001212000031 20180906
CS001212000046 20170811
CS001212000070 20191018
025
P-025: レシート明細データフレーム(df_receipt)に対し、顧客 ID(customer_id)ごとに最も古い売上日(sales_ymd)を求め、10 件表示せよ。
df_receipt[["customer_id", "sales_ymd"]]\
.groupby("customer_id").min().head(10)
sales_ymd
customer_id
CS001113000004 20190308
CS001114000005 20180503
CS001115000010 20171228
CS001205000004 20170914
CS001205000006 20180207
CS001211000025 20190322
CS001212000027 20170127
CS001212000031 20180906
CS001212000046 20170811
CS001212000070 20191018
026
P-026: レシート明細データフレーム(df_receipt)に対し、顧客 ID(customer_id)ごとに最も新しい売上日(sales_ymd)と古い売上日を求め、両者が異なるデータを 10 件表示せよ。
df_receipt.groupby("customer_id")\
.agg(sales_ymd_max=("sales_ymd", "max"), sales_ymd_min=("sales_ymd", "min"))\
.query("sales_ymd_max != sales_ymd_min")\
.head(10)
sales_ymd_max sales_ymd_min
customer_id
CS001114000005 20190731 20180503
CS001115000010 20190405 20171228
CS001205000004 20190625 20170914
CS001205000006 20190224 20180207
CS001214000009 20190902 20170306
CS001214000017 20191006 20180828
CS001214000048 20190929 20171109
CS001214000052 20190617 20180208
CS001215000005 20181021 20170206
CS001215000040 20171022 20170214
027
P-027: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の平均を計算し、降順で TOP5 を表示せよ。
df_receipt.groupby("store_cd").agg({"amount":"mean"})\
.sort_values("amount", ascending=False).head(5)
amount
store_cd
S13052 402.867470
S13015 351.111960
S13003 350.915519
S14010 348.791262
S13001 348.470386
028
P-028: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の中央値を計算し、降順で TOP5 を表示せよ。
df_receipt.groupby("store_cd").agg({"amount":"median"})\
.sort_values("amount", ascending=False).head(5)
amount
store_cd
S13052 190
S14010 188
S14050 185
S14040 180
S13003 180
029
P-029: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに商品コード(product_cd)の最頻値を求めよ。
df_receipt.groupby("store_cd")\
.agg(product_cd_mode=("product_cd", lambda x: x.mode()[0])).head(10)
product_cd_mode
store_cd
S12007 P060303001
S12013 P060303001
S12014 P060303001
S12029 P060303001
S12030 P060303001
S13001 P060303001
S13002 P060303001
S13003 P071401001
S13004 P060303001
S13005 P040503001
030
P-030: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の標本分散を計算し、降順で TOP5 を表示せよ。
df_receipt.groupby("store_cd")\
.agg(sample_var=("amount", lambda x: x.var(ddof=0)))\
.sort_values("sample_var", ascending=False).head(5)
sample_var
store_cd
S13052 440088.701311
S14011 306314.558164
S14034 296920.081011
S13001 295431.993329
S13015 295294.361116