Help us understand the problem. What is going on with this article?

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

これはデータサイエンティストの卵がわけもわからないまま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でコケた筆者に数学の暴力が襲う!
模試?プログラミングで点数稼いでたわ!

sola_wing529
某健康業界からIT業界へ。 専門学校でそれなりに資格を取るも、わからないことが多すぎる状態。 書き方が汚いのは口が悪い証拠。悪気はありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした