ここでは 標準ライブラリ(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[month][product] += price
# 月ごとにランキングを表示
for month, products in sorted(summary.items()):
print(f"=== {month} の売上ランキング ===")
# 金額で降順ソート
ranking = sorted(products.items(), key=lambda x: x[1], reverse=True)
for rank, (product, total) in enumerate(ranking, start=1):
print(f"{rank}位: {product} - {total}円")
print()
Python出力例
=== 2025-11 の売上ランキング ===
1位: りんご - 3000円
2位: みかん - 2000円
=== 2025-12 の売上ランキング ===
1位: みかん - 4800円
2位: りんご - 2100円
3位: バナナ - 1200円
=== 2026-01 の売上ランキング ===
1位: りんご - 900円
応用例
- 数量ベースでランキングを出す場合は「金額」ではなく「数量」を集計
- トップNだけ表示したい場合は
ranking[:3]のようにスライス - CSVに保存してExcelでグラフ化することも可能
まとめ
defaultdictで「月 × 商品」の売上を集計sorted(..., reverse=True)でランキングを作成- 応用すれば数量ベースやトップN抽出も簡単
👉 次の発展としては、「月ごとに売上推移グラフを描く」か、「年間トータルランキングを出す」のどちらかに進めるとさらに実務的になります。
