Python 100本ノック その1

  • Pandas
  • AIエンジニアを目指すと決めて、早くも1週間が経ちました。AI・機械学習と言えばPythonですよね。ということで、まずは『Python実践データ分析100本ノック』という本を購入しました。

    この本を購入した理由は侍エンジニアのインストラクターの方に勧められたからです。

    手順としては以下のようになります。

    1. Anacondaをインストール(Windows PC)
    2. Jupyter Notebookを起動
    3. 学習用データをダウンロード(URLは書籍内に記載)
    4. ノック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)
  • Pandas