Python 100本ノック その1
AIエンジニアを目指すと決めて、早くも1週間が経ちました。AI・機械学習と言えばPythonですよね。ということで、まずは『Python実践データ分析100本ノック』という本を購入しました。
この本を購入した理由は侍エンジニアのインストラクターの方に勧められたからです。
手順としては以下のようになります。
- Anacondaをインストール(Windows PC)
- Jupyter Notebookを起動
- 学習用データをダウンロード(URLは書籍内に記載)
- ノック1本目から順番に実施
1~20本ノックの内容はいわゆるデータの前処理が中心です。著者が実際の現場で遭遇した生のデータをもとに、それを分析可能なデータへと加工していく練習をします。
20本ノック終わるまでに学習時間は約10時間ほど掛かりました。
それでは、以下に課題を進めていく上で使用したPythonの文法について記載しおきます。
データ取り込み
import pandas as pd
customer_master = pd.read_csv('customer_master.csv') # CSV
kokyaku_data = pd.read_excel('kokyaku_daicho.xlsx') # Excel
データの参照・表示
uriage_data.head() # 先頭から5件表示
uriage_data.head(10) # 先頭から10件表示
uriage_data["item_price"].head() # item_price を先頭から5件表示
customer_master.info() # 詳細情報(column list, Non-Null Count, Dtype)
customer_master.describe() # 各種統計量
customer_master.size() # データ件数 "NaN値を含む"
customer_master.count() # データ件数
print(len(customer_master)) # 行数を取得
print(len(customer_master.columns)) # 列数を取得
customer_master[["customer_id","customer_name","gender"]].head() # 特定の列だけ先頭5件表示
print(join_data["payment_date"].min()) # 最小値
print(join_data["payment_date"].max()) # 最大値
join_data.groupby("transaction_id").min()["customer_id"] # group by
uriage_data.groupby(["item_name"])["customer_name"].count() # groupby
print(uriage_data.loc[uriage_data["item_name"] == "商品S"]["item_price"]) # loc 条件指定してデータ出力
kokyaku_data["登録日"].map(type) # 1つ1つデータ型を確認
データの判定
uriage_data.isnull().any() # NaNの有無チェック 列に対して
uriage_data.isnull().any(axis=1) # NaNの有無チェック 行に対して
kokyaku_data["登録日"].astype("str").str.isdigit() # 数字の有無チェック
str.isdecimal() # 半角・全角のアラビア数字が真
str.isnumeric() # 半角・全角のアラビア数字、特殊数字、漢数字が真
データの変換
uriage_data["purchase_date"] = pd.to_datetime(uriage_data["purchase_date"]) # object -> datetime
uriage_data["purchase_month"] = uriage_data["purchase_date"].dt.strftime("%Y%m") # datetime -> YYYYMM
uriage_data["item_name"] = uriage_data["item_name"].str.upper() # 小文字から大文字(a -> A)
uriage_data["item_name"] = uriage_data["item_name"].str.lower() # 大文字から小文字(A -> a)
uriage_data["item_name"] = uriage_data["item_name"].str.replace(" ","") # 文字変換(replace)
kokyaku_data["登録日"].astype("str") # 文字列に変換
kokyaku_data["登録日"].dt.strftime("%Y%m") # datetime を YYYYMMに変換
pd.to_timedelta(48000) + pd.to_datetime('1900/01/01') # 48000をミリsecで変換 Timestamp('1900-01-01 00:00:00.000048')
pd.to_timedelta(48000,unit='D') + pd.to_datetime('1900/01/01') # 4800をdaysで変換 Timestamp('2031-06-03 00:00:00')
pd.to_timedelta(48000.1,unit='D') + pd.to_datetime('1900/01/01') # 4800.1をdaysで変換 Timestamp('2031-06-03 02:24:00')
# 欠損値(NaN)に値を挿入
flg_is_null = uriage_data["item_price"].isnull() # NANの有無をbool値に変換
for trg in list(uriage_data.loc[flg_is_null, "item_name"].unique()): # NaN値を含むitem_nameに対して処理実行
price = uriage_data.loc[(~flg_is_null) & (uriage_data["item_name"] == trg), "item_price"].max() # NaN値でないときの最大値を取得
uriage_data["item_price"].loc[(flg_is_null) & (uriage_data["item_name"] == trg)] = price # NaN値を最大値に置き換える
データの結合
transaction = pd.concat([transaction_1, transaction_2], ignore_index=True) # UNION結合
join_data = pd.merge(transaction_detail, transaction[["transaction_id","payment_date"]], on="transaction_id", how="left") # Left join
join_data = pd.merge(uriage_data,kokyaku_data, left_on="customer_name",right_on="顧客名" ,how="left") # customer_name と顧客名を結合
データの持ち方を変更
# index="縦", columns="横", values="値", aggfunc="計算方法", fill_value="穴埋め"
graph_data = pd.pivot_table(join_data, index="payment_month", columns="item_name", values="price", aggfunc="sum")
byCustomer = import_data.pivot_table(index="purchase_month",columns="顧客名",aggfunc="size",fill_value=0)