データサイエンス100本ノック 91~100

データサイエンス100本ノック 91~100#

import polars as pl
from helper.polars import load_100knocks_data
pl.Config.set_fmt_str_lengths(100)
df_customer, df_category, df_product, df_receipt, df_store, df_geocode = load_100knocks_data()

P-091#

顧客データ(df_customer)の各顧客に対し、売上実績がある顧客数と売上実績がない顧客数が1:1となるようにアンダーサンプリングで抽出せよ。

df_tmp = (
df_customer
.join(
    df_receipt
    .group_by(pl.col.customer_id)
    .agg(sum_amount=pl.col.amount.sum()),
    on='customer_id',
    how='left'
)
)

flag = pl.col.sum_amount.is_null().cast(pl.UInt8)

df_result = df_tmp.filter(
    pl.int_range(pl.len()).shuffle().over(flag) < pl.len().over(flag).min()
)

(
df_result
.group_by(flag)
.agg(count=pl.col.customer_id.count())
)
shape: (2, 2)
sum_amountcount
u8u32
08306
18306

P-092#

顧客データ(df_customer)の性別について、第三正規形へと正規化せよ。

df_gender_std = df_customer.select('gender_cd', 'gender').unique()
df_gender_std
shape: (3, 2)
gender_cdgender
strstr
"9""不明"
"1""女性"
"0""男性"
df_customer_std = df_customer.select(
    'customer_id',
    'customer_name',
    'gender_cd',
    'birth_day',
    'age',
    'postal_cd',
    'application_store_cd',
    'application_date',
    'status_cd'
)
df_customer_std.head()
shape: (5, 9)
customer_idcustomer_namegender_cdbirth_dayagepostal_cdapplication_store_cdapplication_datestatus_cd
strstrstrstri64strstri64str
"CS021313000114""大野 あや子""1""1981-04-29"37"259-1113""S14021"20150905"0-00000000-0"
"CS037613000071""六角 雅彦""9""1952-04-01"66"136-0076""S13037"20150414"0-00000000-0"
"CS031415000172""宇多田 貴美子""1""1976-10-04"42"151-0053""S13031"20150529"D-20100325-C"
"CS028811000001""堀井 かおり""1""1933-03-27"86"245-0016""S14028"20160115"0-00000000-0"
"CS001215000145""田崎 美紀""1""1995-03-29"24"144-0055""S13001"20170605"6-20090929-2"

P-093#

商品データ(df_product)では各カテゴリのコード値だけを保有し、カテゴリ名は保有していない。カテゴリデータ(df_category)と組み合わせて非正規化し、カテゴリ名を保有した新たな商品データを作成せよ。

df_product_full = (
df_product.join(
    df_category,
    on='category_small_cd',
    how='inner'
)
.select(
    'product_cd',
    'category_major_cd',
    'category_major_name',
    'category_medium_cd',
    'category_medium_name',
    'category_small_cd',
    'category_small_name',
    'unit_price',
    'unit_cost'
)
)
df_product_full.head()
shape: (5, 9)
product_cdcategory_major_cdcategory_major_namecategory_medium_cdcategory_medium_namecategory_small_cdcategory_small_nameunit_priceunit_cost
strstrstrstrstrstrstri64i64
"P040101001""04""惣菜""0401""御飯類""040101""弁当類"198149
"P040101002""04""惣菜""0401""御飯類""040101""弁当類"218164
"P040101003""04""惣菜""0401""御飯類""040101""弁当類"230173
"P040101004""04""惣菜""0401""御飯類""040101""弁当類"248186
"P040101005""04""惣菜""0401""御飯類""040101""弁当類"268201

P-094#

093で作成したカテゴリ名付き商品データを以下の仕様でファイル出力せよ。

ファイル形式

ヘッダ有無

文字エンコーディング

CSV(カンマ区切り)

有り

UTF-8

ファイル出力先のパスは以下のようにすること

出力先

./data

df_product_full.write_csv('./data/product_full.csv')

P-095#

093で作成したカテゴリ名付き商品データを以下の仕様でファイル出力せよ。

ファイル形式

ヘッダ有無

文字エンコーディング

CSV(カンマ区切り)

有り

CP932

ファイル出力先のパスは以下のようにすること。

出力先

./data

import io
buf = io.BytesIO()
df_product_full.write_csv(buf)
with open('./data/product_full_cp932.csv', 'wb') as f:
    f.write(buf.getvalue().decode('utf-8').encode('cp932'))

P-096#

093で作成したカテゴリ名付き商品データを以下の仕様でファイル出力せよ。

ファイル形式

ヘッダ有無

文字エンコーディング

CSV(カンマ区切り)

無し

UTF-8

ファイル出力先のパスは以下のようにすること。

出力先

./data

df_product_full.write_csv('./data/product_full_nohead.csv', include_header=False)

P-097#

094で作成した以下形式のファイルを読み込み、データを3件を表示させて正しく取り込まれていることを確認せよ。

ファイル形式

ヘッダ有無

文字エンコーディング

CSV(カンマ区切り)

有り

UTF-8

pl.read_csv('./data/product_full.csv').head()
shape: (5, 9)
product_cdcategory_major_cdcategory_major_namecategory_medium_cdcategory_medium_namecategory_small_cdcategory_small_nameunit_priceunit_cost
stri64stri64stri64stri64i64
"P040101001"4"惣菜"401"御飯類"40101"弁当類"198149
"P040101002"4"惣菜"401"御飯類"40101"弁当類"218164
"P040101003"4"惣菜"401"御飯類"40101"弁当類"230173
"P040101004"4"惣菜"401"御飯類"40101"弁当類"248186
"P040101005"4"惣菜"401"御飯類"40101"弁当類"268201

P-098#

096で作成した以下形式のファイルを読み込み、データを3件を表示させて正しく取り込まれていることを確認せよ。

ファイル形式

ヘッダ有無

文字エンコーディング

CSV(カンマ区切り)

ヘッダ無し

UTF-8

df_product_full.columns
['product_cd',
 'category_major_cd',
 'category_major_name',
 'category_medium_cd',
 'category_medium_name',
 'category_small_cd',
 'category_small_name',
 'unit_price',
 'unit_cost']
cols = ['product_cd',
 'category_major_cd',
 'category_major_name',
 'category_medium_cd',
 'category_medium_name',
 'category_small_cd',
 'category_small_name',
 'unit_price',
 'unit_cost']

pl.read_csv('./data/product_full_nohead.csv', has_header=False, new_columns=cols).head()
shape: (5, 9)
product_cdcategory_major_cdcategory_major_namecategory_medium_cdcategory_medium_namecategory_small_cdcategory_small_nameunit_priceunit_cost
stri64stri64stri64stri64i64
"P040101001"4"惣菜"401"御飯類"40101"弁当類"198149
"P040101002"4"惣菜"401"御飯類"40101"弁当類"218164
"P040101003"4"惣菜"401"御飯類"40101"弁当類"230173
"P040101004"4"惣菜"401"御飯類"40101"弁当類"248186
"P040101005"4"惣菜"401"御飯類"40101"弁当類"268201

P-099#

093で作成したカテゴリ名付き商品データを以下の仕様でファイル出力せよ。

ファイル形式

ヘッダ有無

文字エンコーディング

TSV(タブ区切り)

有り

UTF-8

ファイル出力先のパスは以下のようにすること

出力先

./data

df_product_full.write_csv('./data/product_full.tsv', separator='\t')

P-100#

099で作成した以下形式のファイルを読み込み、データを3件を表示させて正しく取り込まれていることを確認せよ。

ファイル形式

ヘッダ有無

文字エンコーディング

TSV(タブ区切り)

有り

UTF-8

pl.read_csv('./data/product_full.tsv', separator='\t').head()
shape: (5, 9)
product_cdcategory_major_cdcategory_major_namecategory_medium_cdcategory_medium_namecategory_small_cdcategory_small_nameunit_priceunit_cost
stri64stri64stri64stri64i64
"P040101001"4"惣菜"401"御飯類"40101"弁当類"198149
"P040101002"4"惣菜"401"御飯類"40101"弁当類"218164
"P040101003"4"惣菜"401"御飯類"40101"弁当類"230173
"P040101004"4"惣菜"401"御飯類"40101"弁当類"248186
"P040101005"4"惣菜"401"御飯類"40101"弁当類"268201