【問71~問74】データサイエンス100本ノック 解説

※アフィリエイト広告を利用しています。

ファイル
  1. はじめに
  2. 問71 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からの経過月数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1ヶ月未満は切り捨てること。
  3. 問72 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からの経過年数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1年未満は切り捨てること。
  4. 問73 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、顧客データフレーム(df_customer)の会員申込日(application_date)からのエポック秒による経過時間を計算し、顧客ID(customer_id)、売上日、会員申込日とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。なお、時間情報は保有していないため各日付は0時0分0秒を表すものとする。
  5. 問74 レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、当該週の月曜日からの経過日数を計算し、売上日、当該週の月曜日付とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値でデータを保持している点に注意)。
  6. Pythonのコードやライブラリーについて知りたい場合
  7. 独学でデータ分析をしている方へ

はじめに

問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への経過時間取得することができます。

結果をyearsmonthsdaysで返すため、years12を掛ければ、月数を求めることができます。

なお、axis=1を指定しないと、各レコードにおけるsales_ymdapplication_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コードの打ち方・ライブラリーについてもっと知りたいと思った方は、以下のブログ記事をご覧ください。

独学でデータ分析をしている方へ

機械学習データサイエンスデータ分析独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。