我用Python把数据周报从3小时压缩到10分钟
这是「数据运营」公众号重新启动后的第一篇文章。 之后我会定期分享实战可运行的数据分析方案。欢迎关注。
你是不是也这样?
每周五下午,准时开始做周报。
打开好几个系统,导出Excel,手动VLOOKUP,复制粘贴到模板,调格式,检查数据有没有错……一套下来,3个小时没了。
这3个小时里,你其实没有在做分析。你在做搬运工的活。
我做了10年数据分析,这套动作重复了无数次。直到有一天我算了一笔账:
每周3小时 × 一年50周 = 150小时 150小时,足够学完一门新技能,足够做一个完整的分析项目。
于是我用Python把这套流程自动化了。现在每周五,脚本跑10分钟,我去倒杯咖啡,回来数据已经好了。
今天把这套方案完整分享给你。
自动化的核心思路
周报自动化的本质,就是把这4步交给代码:
1. 自动从数据库/系统导出数据 2. 自动清洗、计算、汇总 3. 自动填入报表模板 4. 自动生成图表
每一步都不难,拼起来就是一套完整的工作流。
第一步:自动取数
大部分公司的数据存在数据库里,或者每天会导出一份Excel。
如果是数据库:用 pymysql 或 sqlalchemy 直接连,SQL查询结果直接变成DataFrame。
import pandas as pd from sqlalchemy import create_engine # 连接数据库 engine = create_engine('mysql+pymysql://user:pwd@host:3306/dbname') # 跑SQL,结果直接变成DataFrame df = pd.read_sql(""" SELECT DATE(create_time) as date, COUNT(*) as order_cnt, SUM(amount) as total_amount FROM orders WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY DATE(create_time) """, engine)
如果是每天手动导出Excel:用 pandas 读取,路径写死或者用 glob 自动找最新文件。
import glob # 自动找最新的Excel文件 files = glob.glob('/path/to/exports/*.xlsx') latest_file = max(files, key=os.path.getmtime) df = pd.read_excel(latest_file)
第二步:自动计算
这一步是把你平时手动做的计算,写成代码。
以周报最常见的几个指标为例:
# 计算环比 df['order_cnt_prev'] = df['order_cnt'].shift(1) df['growth_rate'] = (df['order_cnt'] - df['order_cnt_prev']) / df['order_cnt_prev'] # 计算累计 df['cum_order_cnt'] = df['order_cnt'].cumsum() # 计算达成率(假设目标是每周1000单) target = 1000 df['achieve_rate'] = df['order_cnt'] / target
关键点:把业务逻辑写成函数,以后改指标只需改函数,不用改整体结构。
def calculate_kpi(df, target_col, date_col='date'): """计算核心KPI:同比、环比、达成率""" df = df.sort_values(date_col) result = df.copy() result['mom'] = df[target_col].pct_change() result['yoy'] = df[target_col].pct_change(4) # 假设按周,4周前 return result
第三步:自动填入报表
周报一般有固定模板,比如公司规定的Excel格式,或者需要填入PPT。
填入Excel模板:用 openpyxl,定位到指定单元格写入。
from openpyxl import load_workbook wb = load_workbook('周报模板.xlsx') ws = wb.active # 直接写入指定单元格 ws['B2'] = df['order_cnt'].sum() # 本周总订单 ws['B3'] = df['growth_rate'].iloc[-1] # 最新环比 ws['B4'] = df['achieve_rate'].iloc[-1] # 达成率 wb.save(f'周报_{pd.Today()}.xlsx')
生成PPT:用 python-pptx,自动把图表和数字填进去。
from pptx import Presentation prs = Presentation('周报模板.pptx') slide = prs.slides[0] # 填入标题 slide.shapes.title.text = f"数据周报({pd.Today()})" # 填入数字 for shape in slide.shapes: if shape.name == "order_cnt": shape.text = str(df['order_cnt'].sum()) prs.save(f'周报_{pd.Today()}.pptx')
第四步:自动发邮件
周报做完,自动发给领导/团队。
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication msg = MIMEMultipart() msg['Subject'] = f'数据周报({pd.Today()})' msg['From'] = 'your_email@company.com' msg['To'] = 'boss@company.com' # 附件:刚生成的Excel with open(f'周报_{pd.Today()}.xlsx', 'rb') as f: attachment = MIMEApplication(f.read()) attachment.add_header('Content-Disposition', 'attachment', filename=f'周报_{pd.Today()}.xlsx') msg.attach(attachment) # 发送 with smtplib.SMTP('smtp.company.com', 587) as server: server.starttls() server.login('your_email@company.com', 'password') server.send_message(msg)
完整工作流(整合版)
把上面几步串起来,就是完整的自动化脚本:
def weekly_report(): """每周自动生成数据周报""" # 1. 取数 df = fetch_data() # 2. 计算 df = calculate_kpi(df) # 3. 填入报表 export_excel(df) export_ppt(df) # 4. 发送 send_email() print(f"✅ 周报已生成,耗时 {time.time() - start:.1f} 秒") # 设置定时任务(每周五17:00自动运行) # Windows:任务计划程序 # Mac/Linux:crontab -e → 0 17 * * 5 python weekly_report.py
实际效果
省下来的2.5小时,我用来做了两件事: 1. 真的做分析——找数据背后的问题,而不只是汇报数据 2. 学新东西——173小时/年,足够学完一门Python进阶课
你可以怎么开始
不需要一口气做完整个流程。按这个顺序来:
第一周:只做第一步,用Python读数据,手动做后面第二周:加入计算逻辑,手动填报表第三周:接入报表模板自动填入第四周:加入自动发邮件
四周之后,你的周五下午就自由了。
最后
这是「数据运营」重启后的第一篇文章。之后我会围绕这几个方向持续更新:
如果你有想看的主题,欢迎在后台留言。 我优先写大家最需要的内容。
作者:和尚,18年数据从业经验,目前从事美容健康行业数据分析。微信公众号:数据运营