ここでは 標準ライブラリ(csv + pathlib + collections + datetime)だけ を使って、
「商品ごとに売上トップの月を抽出」する実践例を紹介します。
想定データ(sales.csv)
日付,商品,数量,金額
2025-11-01,りんご,10,3000
2025-11-01,みかん,5,2000
2025-12-02,りんご,7,2100
2025-12-02,バナナ,4,1200
2025-12-15,みかん,12,4800
2026-01-03,りんご,3,900
コード例:商品ごとに売上トップの月を抽出
import csv
from pathlib import Path
from collections import defaultdict
from datetime import datetime
csv_path = Path.home() / "Documents" / "sales.csv"
# 集計用: {商品: {月: 金額合計}}
summary = defaultdict(lambda: defaultdict(int))
with csv_path.open("r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
date = datetime.strptime(row["日付"], "%Y-%m-%d")
month = date.strftime("%Y-%m") # "2025-11" のように月単位にまとめる
product = row["商品"]
price = int(row["金額"])
summary[product][month] += price
# 商品ごとに売上トップの月を抽出
for product, months in summary.items():
# 最大金額の月を探す
top_month, top_sales = max(months.items(), key=lambda x: x[1])
print(f"{product}: 売上トップの月 = {top_month}, 金額 = {top_sales}")
Python出力例
りんご: 売上トップの月 = 2025-11, 金額 = 3000
みかん: 売上トップの月 = 2025-12, 金額 = 4800
バナナ: 売上トップの月 = 2025-12, 金額 = 1200
応用例
- 数量ベースでトップ月を抽出したい場合は
priceの代わりに数量を集計 - 複数のトップ月(同額の場合)を抽出したい場合は
maxの代わりにループで比較 - ランキング形式にして「各商品ごとの月別売上順位」を出力することも可能
まとめ
defaultdictで「商品 × 月」の売上を集計max()を使って各商品のトップ月を抽出- 応用すれば数量ベースやランキング形式にも拡張可能
👉 次の発展としては、「月ごとに全商品の売上ランキングを出す」か、「商品ごとに売上推移グラフを描く」のどちらかをやってみるとさらに実務的になります。

