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

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

【Python】100本ノックやってます。p‐51~p-55

P-051: レシート明細データ(df_receipt)の売上エポック秒を日付型に変換し、「日」だけ取り出してレシート番号(receipt_no)、レシートサブ番号(receipt_sub_no)とともに10件表示せよ。なお、「日」は0埋め2桁で取り出すこと。

P-50やれば瞬殺。

 

P-052: レシート明細データ(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計の上、売上金額合計に対して2,000円以下を0、2,000円より大きい金額を1に二値化し、顧客ID、売上金額合計とともに10件表示せよ。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。

 

total["amount"].map(lambda x : 0 if x <= 2000 else 1)

この書き方慣れない、、、、

 

P-053: 顧客データ(df_customer)の郵便番号(postal_cd)に対し、東京(先頭3桁が100〜209のもの)を1、それ以外のものを0に二値化せよ。さらにレシート明細データ(df_receipt)と結合し、全期間において売上実績のある顧客数を、作成した二値ごとにカウントせよ。

解答例とまた全然違うの作った、、、不細工なコードだなーとは思うんだけど。

df_customer["flag"] = df_customer["postal_cd"].str[0:3].astype(int).\
    map(lambda x : 1 if x >= 100 and x <= 209 else 0)

receipt_sum = df_receipt[~df_receipt["customer_id"].str.startswith("Z")][["customer_id","amount"]].\
    groupby("customer_id").sum().reset_index()

total = pd.merge(receipt_sum[["customer_id","amount"]], df_customer[["customer_id","postal_cd","flag"]], \
                 how="left", on="customer_id")

total[["flag","customer_id"]].groupby("flag").count()

アウトプットは一緒なのでとりあえずおけ。

 

P-054: 顧客データ(df_customer)の住所(address)は、埼玉県、千葉県、東京都、神奈川県のいずれかとなっている。都道府県毎にコード値を作成し、顧客ID、住所とともに10件表示せよ。値は埼玉県を11、千葉県を12、東京都を13、神奈川県を14とすること。

 

# 都道府県の抽出する正規表現パターンをつくる
pattern = '東京都|(千葉|埼玉|神奈川)県'

df_customer["pref"] = df_customer["address"].apply(lambda x:re.match(pattern,x).group())
df_customer[["customer_id","address","pref"]].\
    replace({'pref': {"埼玉県": 11, "千葉県": 12, "東京都": 13, "神奈川県": 14}}).head(10)

不細工な書き方(いったん別列に切り出してるところ)だなぁと思う。

解答の方も住所の最初3文字を取り出すっていうので神奈川だけ微妙な扱いにしてるの気持ち悪いけど。

 

P-055: レシート明細(df_receipt)データの売上金額(amount)を顧客ID(customer_id)ごとに合計し、その合計金額の四分位点を求めよ。その上で、顧客ごとの売上金額合計に対して以下の基準でカテゴリ値を作成し、顧客ID、売上金額合計とともに10件表示せよ。カテゴリ値は順に1〜4とする。

最小値以上第1四分位未満 ・・・ 1を付与 第1四分位以上第2四分位未満 ・・・ 2を付与 第2四分位以上第3四分位未満 ・・・ 3を付与 第3四分位以上 ・・・ 4を付与

複数条件による分岐の時どうするんだろうと思って、地道な方法しか思い浮かばなかったけど、applyを使って関数呼び出す感じが模範回答だった。そっちの方がいい気がする。applyまだ全然なじんでない感じがするなぁ・・・

 

total = df_receipt[["customer_id","amount"]].groupby("customer_id").sum()
quantile1,quantile2,quantile3 = total["amount"].quantile([0.25, 0.5, 0.75])

total.loc[total["amount"] < quantile1 ,"flag"] = 1
total.loc[(quantile1 <= total["amount"]) & (total["amount"] < quantile2), "flag"] = 2
total.loc[(quantile2 <= total["amount"]) & (total["amount"] < quantile3), "flag"] = 3
total.loc[quantile3 <= total["amount"],"flag"] = 4

total.head(10)

アウトプットは同じだったので及第点。