LoginSignup
1
4

More than 3 years have passed since last update.

データサイエンス100本ノック~初心者未満の戦いpart4

Last updated at Posted at 2020-06-24

これはデータサイエンティストの卵がわけもわからないまま100本ノックを行っていく奮闘録である。
完走できるか謎。途中で消えてもQiitaにあげてないだけと思ってください。

100本ノックの記事
100本ノックのガイド

ネタバレも含みますのでやろうとされている方は注意

ココでグダグダ書いているのはネタバレ防止に1ページ分くらいの尺を稼いでいるからです()

途中で飽きたのでDockerの中身を掘り掘りしてました。

コレは見づらい!この書き方は危険!等ありましたら教えていただきたいです。心にダメージを負いながら糧とさせていただきます。

今回は23~28まで。
[前回]19~22
[目次付き初回]

23本目

mine23.py
df=df_receipt
df=df.groupby('store_cd').agg({'amount':'sum','quantity':'sum'}).reset_index()
df.head(10)

はい、いきなり新しい書き方来ました。
参考ページを見るに、データの集計に使えるらしい。

Excelでも同じみなsum、min、maxはわかるが思わずaveと書いてしまう平均……
stdとか受験生の頃にお世話になって以降使ってないけどこれからお世話になるんだろうなぁ……

min':最小値
'max':最大値
'mean':平均値
'median':中央値
'std':標準偏差

あと、一見だとわかりにくいですが

df.groupby('A').agg({'B': ['min', 'max'], 'C': 'sum'})

の部分で「A」毎の「B」の最大と最小 という書き方が載っています。
ただ、この書き方をすると階層が出来てしまいます。参考書には便利とあるがコレがとても鬱陶しい

余談

yodan.py
df=df_receipt
df=df.groupby('customer_id').agg({'sales_ymd':['max','min']})

df['sales_ymd']#'sales_ymd'のインデックスが消えて'max''min'の列が射影

df['sales_ymd'][['max']]#'max'列のみ射影

階層内を参照したいときこうしないといけないのがとてもめんどくさい
23~27で四苦八苦したので一応載せておきます

24,25本目

mine24.py
df=df_receipt
df.groupby('customer_id').agg({'sales_ymd':'max'}).reset_index().head(10)

23のmaxバージョンですね(というか余談はコレを書き換えた)

mine25.py
'''模範解答'''
df_receipt.groupby('customer_id').agg({'sales_ymd':'min'}).head(10)

こっちは模範解答にしておきます。
最近カンニングしないと分からないか簡単なものが多かったので模範解答が静かだった。

26本目

P-026: レシート明細データフレーム(df_receipt)に対し、顧客ID(customer_id)ごとに最も新しい売上日(sales_ymd)と古い売上日を求め、両者が異なるデータを10件表示せよ。

mine26.py
df=df_receipt
df=df.groupby('customer_id').agg({'sales_ymd':['max','min']}).reset_index()
df=df[df['sales_ymd']['max'] != df['sales_ymd']['min']]
df.head(10)

'''模範解答'''
df_tmp = df_receipt.groupby('customer_id').agg({'sales_ymd':['max','min']}).reset_index()
df_tmp.columns = ["_".join(pair) for pair in df_tmp.columns]
df_tmp.query('sales_ymd_max != sales_ymd_min').head(10)

なんだこの模範解答の2行目は……
階層を消してるのは分かるが。

これをした自分の出力結果が

customer_id sales_ymd
max min

こんな感じになるのに対して

customer_id_ sales_ymd_max sales_ymd_min

こうなってきれいに見えるのは分かるけどやっぱり階層が邪魔

27,28本目

mine27.py
df=df_receipt
df=df.groupby('store_cd').agg({'amount':['mean']}).reset_index()
df.columns=['store_id','amount_mean']
df=df.sort_values('amount_mean',ascending= False)
df.head(5)

'''模範解答'''
df_receipt.groupby('store_cd').agg({'amount':'mean'}).reset_index().sort_values('amount', ascending=False).head(5)
mine28.py
df=df_receipt
df=df.groupby('store_cd').agg({'amount':['median']}).reset_index()
df.columns=['store_id','amount_median']
df=df.sort_values('amount_median',ascending= False)
df.head(5)

'''模範解答'''
df_receipt.groupby('store_cd').agg({'amount':'median'}).reset_index().sort_values('amount', ascending=False).head(5)

27と28は並び替えが入ったものですね。aveと書いたのは内緒
ここまでは参考サイトに載っていたものなのである程度スムーズにいきました
問題は次回です。

今回はここまで

次回、数ⅡBでコケた筆者に数学の暴力が襲う!
模試?プログラミングで点数稼いでたわ!

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4