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

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

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

P-075: 顧客データ(df_customer)からランダムに1%のデータを抽出し、先頭から10件表示せよ。

これはfracで問題なく。

smart-hint.com

P-076: 顧客データ(df_customer)から性別コード(gender_cd)の割合に基づきランダムに10%のデータを層化抽出し、性別コードごとに件数を集計せよ。

素直にgroupbyしてそれぞれの人数出して、10%の人数出したんだけど、解答例はまた知らないのでてきた。

# sklearn.model_selection.train_test_splitを使用した例」

 

P-077: レシート明細データ(df_receipt)の売上金額を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。なお、外れ値は売上金額合計を対数化したうえで平均と標準偏差を計算し、その平均から3σを超えて離れたものとする(自然対数と常用対数のどちらでも可)。結果は10件表示せよ。

happy-analysis.com

外れ値って何ぞやがわからないことが問題、コード組むこと自体は問題なし。

P-078: レシート明細データ(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を第1四分位と第3四分位の差であるIQRを用いて、「第1四分位数-1.5×IQR」を下回るもの、または「第3四分位数+1.5×IQR」を超えるものとする。結果は10件表示せよ。

 

qiita.com

P-079: 商品データ(df_product)の各項目に対し、欠損数を確認せよ。

df_product.isnull().sum()

 

P-080: 商品データ(df_product)のいずれかの項目に欠損が発生しているレコードを全て削除した新たな商品データを作成せよ。なお、削除前後の件数を表示させ、079で確認した件数だけ減少していることも確認すること。

.dropna()

でNaNが削除できる!

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

P-070: レシート明細データ(df_receipt)の売上日(sales_ymd)に対し、顧客データ(df_customer)の会員申込日(application_date)からの経過日数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。

型を調べると

sales_ymd            int64
customer_id         object
application_date     int64
dtype: object

どちらも数値じゃん。

そして20181103みたいな形は、一旦文字列にしてからdate型にしないといけないらしい。

astypeで2列ともdate一気にしたかったのにエラー出ちゃってできないので、とりあえず1行ずつ変換した。

とりあえず答えは出たのでいいかしら、、、

 

P-071: レシート明細データ(df_receipt)の売上日(sales_ymd)に対し、顧客データ(df_customer)の会員申込日(application_date)からの経過月数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1ヶ月未満は切り捨てること。

算数的に難しかった・・・(馬鹿)

「1か月未満は切り捨て」ってどっち方面???=-1どっちにも必要???

で躓きまくってました・・・

紙に線書いてるのにワカラナイのwww馬鹿すぎるwww

 

P-072: レシート明細データ(df_receipt)の売上日(df_customer)に対し、顧客データ(df_customer)の会員申込日(application_date)からの経過年数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1年未満は切り捨てること。

daysを365日で割ろうと思ったけど、型が違うからかな、できなかった。

なので、P-071で出したmonthsを12で割ってみた。

 

P-073: レシート明細データ(df_receipt)の売上日(sales_ymd)に対し、顧客データ(df_customer)の会員申込日(application_date)からのエポック秒による経過時間を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。なお、時間情報は保有していないため各日付は0時0分0秒を表すものとする。

dt.apply(lambda x: int(x.timestamp()))

を使って引き算。

解答は違ったのでちゃんと理解しておく。

 

P-074: レシート明細データ(df_receipt)の売上日(sales_ymd)に対し、当該週の月曜日からの経過日数を計算し、売上日、直前の月曜日付とともに10件表示せよ(sales_ymdは数値でデータを保持している点に注意)。

●日前(変数)を引く方法に四苦八苦。

-pd.to_timedelta(df_sales["sales_weekday"],unit='d')

でいけた!

 

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

P-066: 商品データ(df_product)の各商品について、利益率が30%となる新たな単価を求めよ。今回は、1円未満を丸めること(四捨五入または偶数への丸めで良い)。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)には欠損が生じていることに注意せよ。

偶数への丸めはround()。

単品だったらmath、複数だったらnumpyを使う。

私lambda使っちゃったけど、解答の方が楽。わざわざ使う必要なかったな。

 

P-067: 商品データ(df_product)の各商品について、利益率が30%となる新たな単価を求めよ。今回は、1円未満を切り上げること。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)には欠損が生じていることに注意せよ。

切り上げはceil()

 

P-068: 商品データ(df_product)の各商品について、消費税率10%の税込み金額を求めよ。1円未満の端数は切り捨てとし、結果を10件表示せよ。ただし、単価(unit_price)には欠損が生じていることに注意せよ。

切り捨てはfloor()

 

P-069: レシート明細データ(df_receipt)と商品データ(df_product)を結合し、顧客毎に全商品の売上金額合計と、カテゴリ大区分コード(category_major_cd)が"07"(瓶詰缶詰)の売上金額合計を計算の上、両者の比率を求めよ。抽出対象はカテゴリ大区分コード"07"(瓶詰缶詰)の売上実績がある顧客のみとし、結果を10件表示せよ。

道筋を立てるのに四苦八苦・・・

 

まず2つをマージしてから色々いじろうかと思ってたんだけど、なんかうまくいかなくて、、、

なので一回頭をリセットして「①全顧客ごとの売上金額合計リスト」を作って。

そのあと別に「カテゴリ7を含むproduct_cdのリスト」をレシートデータにぶつけて「カテゴリ7を買った顧客リスト」を作って。

その「カテゴリ7を買った顧客リスト」の「②顧客ごとのカテゴリ7売上金額合計リスト」を作って。

 

②←①を左結合。(③)

 

③の2つの売上金額の割合を計算。

 

とても泥臭い・・・

でも解答例1と似てるかな?

私1行にできてないから泥臭く見えるけど、考え方は同じっぽい。

商品データのカテゴリ7の絞り込みをマージの時に一緒にやってるんだな。

df_product.query('category_major_cd == "07"')

でもaggって今までずっと使ってなかったから見といたほうがよさそう。(今回は別にsumでいける)

vector-ium.com

 

有休的には余裕があるけど、5/1-2は働きます。

再来週推し事で平日に休みまくるから・・・

でも周りが休みなのでやることなさそうなので、引き続き100本ノックできるかな。

寝なければ。。。

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

P-062: レシート明細データ(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を自然対数化(底e)して顧客ID、売上金額合計とともに10件表示せよ。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。

61やってればほぼコピペ。

 

P-063: 商品データ(df_product)の単価(unit_price)と原価(unit_cost)から各商品の利益額を算出し、結果を10件表示せよ。

 

P-064: 商品データ(df_product)の単価(unit_price)と原価(unit_cost)から、各商品の利益率の全体平均を算出せよ。ただし、単価と原価には欠損が生じていることに注意せよ。

 

P-065: 商品データ(df_product)の各商品について、利益率が30%となる新たな単価を求めよ。ただし、1円未満は切り捨てること。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)には欠損が生じていることに注意せよ。

 

算数。lambda使っちゃったけど、普通に算数で良かったっぽい。

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

P-062: レシート明細データ(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を自然対数化(底e)して顧客ID、売上金額合計とともに10件表示せよ。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。

61やってればほぼコピペ。

 

P-063: 商品データ(df_product)の単価(unit_price)と原価(unit_cost)から各商品の利益額を算出し、結果を10件表示せよ。

 

P-064: 商品データ(df_product)の単価(unit_price)と原価(unit_cost)から、各商品の利益率の全体平均を算出せよ。ただし、単価と原価には欠損が生じていることに注意せよ。

 

P-065: 商品データ(df_product)の各商品について、利益率が30%となる新たな単価を求めよ。ただし、1円未満は切り捨てること。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)には欠損が生じていることに注意せよ。

 

算数。lambda使っちゃったけど、普通に算数で良かったっぽい。

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

P-058: 顧客データ(df_customer)の性別コード(gender_cd)をダミー変数化し、顧客ID(customer_id)とともに10件表示せよ。

ダミー変数とは何ぞやから始まる。

self-methods.com

これがわかれば特に難しいことはなし。

 

P-059: レシート明細データ(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を平均0、標準偏差1に標準化して顧客ID、売上金額合計とともに10件表示せよ。標準化に使用する標準偏差は、分散の平方根、もしくは不偏分散の平方根のどちらでも良いものとする。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。

ritsu-programming.hatenablog.com

意味が分からなすぎた、、、

www.codexa.net

 

標準化=一般的に平均0、分散と標準偏差が1になるように値を変化させる
正規化=一般的に最大値を1、最小値0にする

 

pandasに見慣れてしまったので、他のはちょっと、、、ってなって、pandasで解決したけど、解答を見るとまた違う感じ。

手段なんてものは調べれば出てくるので、そもそも正規化・標準化の意味を知る方が優先かな・・・(;´∀`)

 

P-060: レシート明細データ(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を最小値0、最大値1に正規化して顧客ID、売上金額合計とともに10件表示せよ。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。

59で見たサイトを見てそのままやってみた。

pandasがやっぱりわかりやすい。

 

P-061: レシート明細データ(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を常用対数化(底10)して顧客ID、売上金額合計とともに10件表示せよ。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。

Numpy使えば難しくはないんだけど、解答で+0.5してるのなんで・・・?これもまた数学的な知識不足のせいだな。

infoma-study.com

 

ほぼもう答えだけど笑。その理由がここに書いてあった。

omathin.com

これで完了ではありますが、常用対数化には注意点が必要です。

それは常用対数化するデータの中に0が含まれている場合の対応です。 常用対数化する際には10(0)は計算できないのです。高校数学で学ぶ真数条件というものですね。これに対処するために、一般的には1を加える対応を行います。なぜ1なのかという理由は特に存在しないようです。

 

そもそも対数化の目的がわからないのと、対数が何を示しているのかがわからないから、1を足してもいい理由がわからない・・・

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

P-056: 顧客データ(df_customer)の年齢(age)をもとに10歳刻みで年代を算出し、顧客ID(customer_id)、生年月日(birth_day)とともに10件表示せよ。ただし、60歳以上は全て60歳代とすること。年代を表すカテゴリ名は任意とする。

P-043で年代やってたからすんなり。

 

P-057: 056の抽出結果と性別コード(gender_cd)により、新たに性別×年代の組み合わせを表すカテゴリデータを作成し、10件表示せよ。組み合わせを表すカテゴリの値は任意とする。

strとかの型が合わないとかで色々躓いた、、、

str.cutが使えなくて、、、結局「+」で。

 

今日はふたつだけ。