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

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


[100本ノックの記事](https://codezine.jp/article/detail/12456)
[100本ノックのガイド](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess/blob/master/docker/doc/100knocks_guide.pdf)

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

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

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

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

今回は２３～２８まで。
[[前回]](https://qiita.com/sola_wing529/items/06fc1f9458ddd043616e)１９～２２
[[目次付き初回]](https://qiita.com/sola_wing529/items/5fdbd97308dd88da28eb)

#23本目
```mine23.py
df=df_receipt
df=df.groupby('store_cd').agg({'amount':'sum','quantity':'sum'}).reset_index()
df.head(10)
```
はい、いきなり新しい書き方来ました。
[参考ページ](https://pycarnival.com/agg_pandas/)を見るに、データの集計に使えるらしい。

Excelでも同じみなsum、min、maxはわかるが思わずaveと書いてしまう平均……
stdとか受験生の頃にお世話になって以降使ってないけどこれからお世話になるんだろうなぁ……
>min':最小値
'max':最大値
'mean':平均値
'median':中央値
'std':標準偏差

あと、一見だとわかりにくいですが
>`df.groupby('A').agg({'B': ['min', 'max'], 'C': 'sum'})`

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

##余談
```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でコケた筆者に数学の暴力が襲う！
~~模試？プログラミングで点数稼いでたわ！~~