アラフォーから色々始めるリケジョの独り言

アラフォーになって色々始めてみました手探りでがんばります。

【Python】100本ノックやってます。p‐38~p‐43

本日はp‐38~p‐43。

 

目標はクラウドワークスでPythonで案件ができるようになること。

最初からちゃんとメモで残しておけばよかった、、、途中からだけどメモを残しとこうかなと。

割と回答と違うコードを描いてるけど、アウトプットは同じだからまあいいや。

 

P-038: 顧客データ(df_customer)とレシート明細データ(df_receipt)から、顧客ごとの売上金額合計を求め、10件表示せよ。ただし、売上実績がない顧客については売上金額を0として表示させること。また、顧客は性別コード(gender_cd)が女性(1)であるものを対象とし、非会員(顧客IDが"Z"から始まるもの)は除外すること。

レシートデータを顧客idごとにgroupbyして合計したものと

顧客データから女性を抽出したもの

を顧客データを左にして左外部結合

 

P-039: レシート明細データ(df_receipt)から、売上日数の多い顧客の上位20件を抽出したデータと、売上金額合計の多い顧客の上位20件を抽出したデータをそれぞれ作成し、さらにその2つを完全外部結合せよ。ただし、非会員(顧客IDが"Z"から始まるもの)は除外すること。

レシートデータの顧客idごとの行数をカウントして(デフォルトで昇順になってる)、カラム名を変える。

レシートデータの顧客idごとのamountを合計する。

2つを顧客idをキーに外部結合する。

 

P-040: 全ての店舗と全ての商品を組み合わせたデータを作成したい。店舗データ(df_store)と商品データ(df_product)を直積し、件数を計算せよ。

総当たりで組み合わせるのは「how="cross"」

 

P-041: レシート明細データ(df_receipt)の売上金額(amount)を日付(sales_ymd)ごとに集計し、前回売上があった日からの売上金額増減を計算せよ。そして結果を10件表示せよ。

レシートデータを売上日でgroupbyしてamountを合計する。

差分を出すのはdiff。(新しい列を追加する)

 

P-042: レシート明細データ(df_receipt)の売上金額(amount)を日付(sales_ymd)ごとに集計し、各日付のデータに対し、前回、前々回、3回前に売上があった日のデータを結合せよ。そして結果を10件表示せよ。

解答例だとforまわしてるけど回さなくてもできるよな、、、

どっちが良いんだろう?

レシートデータを売上日でgroupbyしてamountを合計する。

前回、前々回、3回前のデータをshiftしてそれぞれ新しい列を作って代入する。

 

P-043: レシート明細データ(df_receipt)と顧客データ(df_customer)を結合し、性別コード(gender_cd)と年代(ageから計算)ごとに売上金額(amount)を合計した売上サマリデータを作成せよ。性別コードは0が男性、1が女性、9が不明を表すものとする。

ただし、項目構成は年代、女性の売上金額、男性の売上金額、性別不明の売上金額の4項目とすること(縦に年代、横に性別のクロス集計)。また、年代は10歳ごとの階級とすること。

めちゃくちゃ時間かかった。

年代はcutを使ってみた。↓の記事が一番わかりやすかった。

【Python】データをビニング(ビン分割)する方法|cut | Smart-Hint

解答例を見ると「pivot_table」って言うのがあるらしい。

「クロス集計」っていう言葉が出てきたときに察しないといけなかったってことだよね。反省。

 

ちなみに私の泥臭いコード

amount = df_receipt.groupby("customer_id")["amount"].sum().reset_index()
df_summery = pd.merge(df_customer, amount, how="left", on="customer_id").fillna(0)
df_summery.groupby(["gender_cd", "age"])["amount"].sum().reset_index()

#年代(0歳より大きく10歳以下
bin = [0,9,19,29,39,49,59,69,79,89,99]
ages = pd.cut(df_summery["age"], bin, labels=['0s','10s','20s','30s','40s','50s','60s','70s','80s','90s']).reset_index()

df_summery["ages"] = ages[:]["age"]
df_summery["woman_amount"] = df_summery["amount"][df_summery["gender_cd"] == 1].fillna(0)
df_summery["man_amount"] = df_summery["amount"][df_summery["gender_cd"] == 0].fillna(0)
df_summery["fumei_amount"] = df_summery["amount"][df_summery["gender_cd"] == 9].fillna(0)

df_summery[["ages","man_amount","woman_amount","fumei_amount"]].groupby("ages")[["man_amount","woman_amount","fumei_amount"]].sum().reset_index() 

 

 

今日のメモ分で5時間弱ぐらいやってたかな?

中々遅いと思うけど、自分なりにアウトプットが出せてるので良し。