はじめに
このスクリプトは、売上データと顧客データのフォーマットを統一し、データを統合する処理をするものです。
目次
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[["顧客名", "メールアドレス", "登録日"]]
- 売上データに含まれない顧客を抽出。
顧客名
、メールアドレス
、登録日
の情報を取得。
このスクリプトを活用することで、データの整形・統合を効率的に行い、分析やレポート作成の精度を向上させることができます。

コメント