
- はじめに
- 問71 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からの経過月数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1ヶ月未満は切り捨てること。
- 問72 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からの経過年数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1年未満は切り捨てること。
- 問73 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からのエポック秒による経過時間を計算し、顧客ID(customer_id)、売上日、会員申込日とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。なお、時間情報は保有していないため各日付は0時0分0秒を表すものとする。
- 問74 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、当該週の月曜日からの経過日数を計算し、売上日、当該週の月曜日付とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値でデータを保持している点に注意)。
- Pythonのコードやライブラリーについて知りたい場合
- 独学でデータ分析をしている方へ
はじめに
問71~問74のコードの説明を初心者や初学者でもわかるような方法でまとめました。
データサイエンス100本ノックのはじめ方は、ブログ記事を参考にしてください。
>>【Google Colabはじめ方】データサイエンス100本ノックーデータサイエンティスト協会
問71 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からの経過月数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1ヶ月未満は切り捨てること。
問70と途中までは同じ処理です。
レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からの経過月数を計算する必要があります。
まず、顧客ID(customer_id)、売上日(sales_ymd)、会員申込日(application_date)が抽出項目なので、(df_receipt)と(df_customer)を内部結合します。
df_tmp = pd.merge(df_receipt[['customer_id', 'sales_ymd']], df_customer[['customer_id', 'application_date']], how='inner', on='customer_id')
drop_duplicates()で、重複した行を削除します。
df_tmp = df_tmp.drop_duplicates()
次に、「sales_ymdは数値、application_dateは文字列でデータを保持している」ため、それらを用いて計算するためには、(application_date)と売上日(sales_ymd)をpd.to_datetimeで日付型に変換する必要があります。
変換方法の詳細は問46、問47を参考にしてください。
df_tmp['sales_ymd'] = pd.to_datetime(df_tmp['sales_ymd'],format='%Y%m%d')
df_tmp['application_date'] = pd.to_datetime(df_tmp['application_date'],format='%Y%m%d')
問70と違う点は、1ヶ月未満は切り捨て、経過月数を計算する必要があります。
relativedelta(time1, time2)を使用すると、time1からtime2への経過時間を取得することができます。
結果をyears、months、daysで返すため、yearsに12を掛ければ、月数を求めることができます。
なお、axis=1を指定しないと、各レコードにおけるsales_ymdとapplication_date間の経過を算出できません。
上記の結果をelapsed_monthのカラムに入れましょう。
df_tmp['elapsed_month'] = df_tmp[['sales_ymd','application_date']].apply(lambda x :relativedelta(x[0],x[1]).years*12 + relativedelta(x[0],x[1]).months,axis=1)
問72 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からの経過年数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1年未満は切り捨てること。
問71と途中までは同じ処理です。
問70と違う点は、1年未満は切り捨て、経過年数を計算する必要があります。
df_tmp['elased_year'] = df_tmp[['sales_ymd','application_date']].apply(lambda x :relativedelta(x[0],x[1]).years,axis=1)
問73 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からのエポック秒による経過時間を計算し、顧客ID(customer_id)、売上日、会員申込日とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。なお、時間情報は保有していないため各日付は0時0分0秒を表すものとする。
問71、問72と途中までは同じ処理です。
問71、問72と違う点は、時間情報は保有していないため各日付は0時0分0秒を表すこと、エポック秒による経過時間を計算する点です。
問48で記したとおり、「エポック秒による経過時間」とは、UTC時刻における1970年1月1日午前0時0分0秒(UNIXエポック)からの経過秒数です(UNIX秒)。
pd.to_datetimeで日付型に変換したdatetimeオブジェクトをUNIX時間に変換するには、timestamp()を使います。
df_tmp['lapsed_date_unix'] = df_tmp['sales_ymd'].apply(lambda x: x.timestamp()) - df_tmp['application_date'].apply(lambda x: x.timestamp())
問74 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、当該週の月曜日からの経過日数を計算し、売上日、当該週の月曜日付とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値でデータを保持している点に注意)。
まず、問71~73の処理をもとに、sales_ymdを日付型に変換します。
レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、当該週の月曜日からの経過日数を計算し、売上日、当該週の月曜日の日付とともに表示する必要があります。
まず、問71~73の処理をもとに、sales_ymdを日付型に変換します。
df_tmp = df_receipt[['customer_id','sales_ymd']]
df_tmp = df_tmp.drop_duplicates()
df_tmp['sales_ymd'] = pd.to_datetime(df_tmp['sales_ymd'].astype('str'))
次に、mondayのカラムを作成し、sales_ymdの当該週における月曜日の日付を入れます。
それには、日付型の曜日をint型で返すweekday()を使用します。weekday()は月曜日は0、日曜日は6のように0~6で返してくれます。
当該週における月曜日の日付をlambda式で書くと、.apply(lambda x: x – relativedelta(days=x.weekday())のようになります。
df_tmp['monday'] = df_tmp['sales_ymd'].apply(lambda x: x - relativedelta(days=x.weekday()))
最後に、elapsed_weekdayというカラムを作成し、sales_ymdからmondayを引き算することで経過日数を算出します。
df_tmp['elapsed_weekday'] = df_tmp['sales_ymd'] - df_tmp['monday']
Pythonのコードやライブラリーについて知りたい場合
Pythonはデータ分析でよく使われている言語です。
この機会にPythonのコードの打ち方・ライブラリーについてもっと知りたいと思った方は、以下のブログ記事をご覧ください。
データ分析入門・データサイエンス初心者・初学者向けにデータ分析でよく使うPythonをまとめました。
>>【データ分析初心者】Python構文~if文、format記法とf文字列~
>>【データ分析初心者】Python構文~for文、range関数、zip関数、enumerate関数~
>>【データ分析初心者】Python構文~無名関数lambda式、内包表記、map関数~
>>【データ分析初心者】Pandas~loc[]、iloc[]、スライス、drop()、isin()~
>>【データ分析初心者】Matplotlib、Seabornーscatter、hist、countplot 、barplot
独学でデータ分析をしている方へ
機械学習やデータサイエンス・データ分析を独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。
