-- coding: utf-8 --
"""
《自动周报》实战脚本:把分散在多张 CSV 里的销售明细,
一键 合并 → 清洗 → 汇总 → 导出成 Excel 周报。
依赖:pip install pandas openpyxl
运行:python auto_weekly_report.py
首次运行会自动在 sales_raw/ 下造一批示例数据(含脏数据),开箱即跑。
"""
import pandas as pd
import glob
import os
import random
DATA_DIR = "sales_raw"
OUTPUT = "周报_汇总.xlsx"
def 造示例数据():
"""没有原始数据就自动造一批(含脏数据),保证开箱即跑。"""
os.makedirs(DATA_DIR, exist_ok=True)
random.seed(42)
for day in ("周一", "周二", "周三"):
n = 50
rows = \[\]
for i in range(n):
rows.append({
"日期": day,
"销售员": random.choice("张三", "李四", "王五", None),
"地区": random.choice("华东", "华南", "华北"),
"金额": random.choice("缺失" + random.randint(100, 5000) for _ in range(5)),
"订单号": 1000 + i,
})
pd.DataFrame(rows).to_csv(
os.path.join(DATA_DIR, f"销售_{day}.csv"),
index=False, encoding="utf-8-sig")
print(f"已在 {DATA_DIR}/ 造好示例数据")
def 合并明细(data_dir):
"""目录下所有 CSV 拼成一张大表。"""
files = glob.glob(os.path.join(data_dir, "*.csv"))
return pd.concat(pd.read_csv(f) for f in files, ignore_index=True)
def 清洗(df):
"""去重 + 金额转数值(脏数据变 0)+ 销售员空值兜底。"""
df = df.drop_duplicates()
df"金额" = pd.to_numeric(df"金额", errors="coerce").fillna(0)
df"销售员" = df"销售员".fillna("未知")
return df
def 出周报(df, output):
"""按销售员汇总 + 按地区透视,导出多 sheet 的 Excel。"""
by_person = (df.groupby("销售员")"金额"
.agg(总成交额="sum", 单数="count")
.sort_values("总成交额", ascending=False))
by_region = df.pivot_table(index="地区", values="金额",
aggfunc="sum", fill_value=0)
with pd.ExcelWriter(output, engine="openpyxl") as xw:
df.to_excel(xw, sheet_name="原始明细", index=False)
by_person.to_excel(xw, sheet_name="按销售员")
by_region.to_excel(xw, sheet_name="按地区")
return by_person, by_region
if name == "main ":
if not glob.glob(os.path.join(DATA_DIR, "*.csv")):
造示例数据()
raw = 合并明细(DATA_DIR)
clean = 清洗(raw)
person, region = 出周报(clean, OUTPUT)
print(f"原始 {len(raw)} 行 → 清洗后 {len(clean)} 行")
print("周报已生成:", OUTPUT)
print("\n按销售员 Top:")
print(person.head())