MENU

Pythonを用いたデータのフォーマット統一と統合処理

はじめに

このスクリプトは、売上データと顧客データのフォーマットを統一し、データを統合する処理をするものです。

目次

data_formatter.py

ソースコード

import pandas as pd


def uriage_formatter(data):
    """売上データのフォーマットを統一"""
    df = data["uriage"].copy()

    df["purchase_date"] = df["purchase_date"].apply(convert_excel_date)
    df["purchase_month"] = df["purchase_date"].dt.strftime("%Y%m")

    # 商品名の表記ゆれを修正
    df["item_name"] = df["item_name"].str.upper().str.replace(r"[  ]", "", regex=True)

    # 価格情報の統一
    price_table = df.copy()[["item_name", "item_price"]]
    price_table.dropna(subset=["item_price"], inplace=True)
    price_table.drop_duplicates(subset=["item_name", "item_price"], inplace=True)
    price_table.sort_values(by="item_name", inplace=True)
    price_table.reset_index(drop=True, inplace=True)

    df.drop(columns=["item_price"], errors="ignore", inplace=True)
    df = df.merge(price_table, on="item_name", how="left")

    return df[
        ["purchase_date", "purchase_month", "item_name", "item_price", "customer_name"]
    ]


def kokyaku_formatter(data):
    """顧客データのフォーマットを統一"""
    df = data["kokyaku_daicho_Sheet1"].copy()

    df["顧客名"] = df["顧客名"].str.replace(r"[  ]", "", regex=True)
    df["かな"] = df["かな"].str.replace(r"[  ]", "", regex=True)

    df["登録日"] = df["登録日"].apply(convert_excel_date)

    return df


def convert_excel_date(x):
    """Excelのシリアル値または日付文字列をdatetime型に変換"""
    if pd.isnull(x):
        return pd.NaT
    try:
        return pd.to_datetime(x, origin="1899-12-30", unit="D")
    except (ValueError, TypeError):
        return pd.to_datetime(x, errors="coerce")


def df_merger(df1, df2):
    """売上データと顧客データを統合"""
    df = df1.merge(df2, left_on="customer_name", right_on="顧客名", how="left")
    df.drop(columns=["customer_name"], inplace=True)
    return df


def search_unused_users(df1, df2):
    """購入履歴のない顧客を検索"""
    unused_users = df2[~df2["顧客名"].isin(df1["customer_name"])]
    return unused_users[["顧客名", "メールアドレス", "登録日"]]

処理の概要

このスクリプトは以下の処理を行います。

  • 売上データの整形: uriage_formatter() で表記ゆれや日付データを統一。
  • 顧客データの整形: kokyaku_formatter() で顧客情報のフォーマットを統一。
  • 日付データの変換: convert_excel_date() で Excel の日付フォーマットを datetime 型に変換。
  • 売上データと顧客データの統合: df_merger() で顧客情報を売上データに紐づける。
  • 未使用ユーザーの検索: search_unused_users() で購入履歴のない顧客を抽出。

売上データのフォーマット統一

uriage_formatter() は、売上データのフォーマットを統一します。

def uriage_formatter(data):
    df = data["uriage"].copy()
    df["purchase_date"] = df["purchase_date"].apply(convert_excel_date)
    df["purchase_month"] = df["purchase_date"].dt.strftime("%Y%m")
    
    # 商品名の表記ゆれを修正
    df["item_name"] = df["item_name"].str.upper().str.replace(r"[  ]", "", regex=True)
    
    # 価格情報の統一
    price_table = df.copy()[["item_name", "item_price"]]
    price_table.dropna(subset=["item_price"], inplace=True)
    price_table.drop_duplicates(subset=["item_name", "item_price"], inplace=True)
    price_table.sort_values(by="item_name", inplace=True)
    price_table.reset_index(drop=True, inplace=True)
    
    df.drop(columns=["item_price"], errors="ignore", inplace=True)
    df = df.merge(price_table, on="item_name", how="left")
    
    return df[["purchase_date", "purchase_month", "item_name", "item_price", "customer_name"]]
  • 商品名の表記ゆれを削除し、すべて大文字化。
  • 価格情報を整理し、重複データを削除。
  • 購入日を統一フォーマットに変換。

顧客データのフォーマット統一

kokyaku_formatter() は、顧客データの表記を統一します。

def kokyaku_formatter(data):
    df = data["kokyaku_daicho_Sheet1"].copy()
    df["顧客名"] = df["顧客名"].str.replace(r"[  ]", "", regex=True)
    df["かな"] = df["かな"].str.replace(r"[  ]", "", regex=True)
    df["登録日"] = df["登録日"].apply(convert_excel_date)
    return df
  • 顧客名やかな表記の空白を削除。
  • 登録日を統一フォーマットに変換。

Excelのシリアル値を日付に変換

convert_excel_date() は、Excel のシリアル値や文字列を日付データに変換します。

def convert_excel_date(x):
    if pd.isnull(x):
        return pd.NaT
    try:
        return pd.to_datetime(x, origin="1899-12-30", unit="D")
    except (ValueError, TypeError):
        return pd.to_datetime(x, errors="coerce")
  • Excel のシリアル値を datetime 型に変換。
  • 無効な値があれば NaT に変換。

売上データと顧客データの統合

df_merger() は、売上データと顧客データを結合します。

def df_merger(df1, df2):
    df = df1.merge(df2, left_on="customer_name", right_on="顧客名", how="left")
    df.drop(columns=["customer_name"], inplace=True)
    return df
  • customer_name をキーとして売上データと顧客データを統合。
  • customer_name の重複を削除。

購入履歴のない顧客を検索

search_unused_users() は、購入履歴のない顧客を特定します。

def search_unused_users(df1, df2):
    unused_users = df2[~df2["顧客名"].isin(df1["customer_name"])]
    return unused_users[["顧客名", "メールアドレス", "登録日"]]
  • 売上データに含まれない顧客を抽出。
  • 顧客名メールアドレス登録日 の情報を取得。

このスクリプトを活用することで、データの整形・統合を効率的に行い、分析やレポート作成の精度を向上させることができます。

Python

main.py

Pythonを用いたデータの読み込み・整形・統合・出力 

file_reader.py

Pythonを用いたフォルダ選択とデータの読み込み

pivot_table_maker.py

Pythonを用いたピボットテーブルの作成

df_to_excel.py

Pythonを用いたDataFrame の Excel 出力と pickle 保存

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次