大家好,我是小居。
01 为什么你需要这个系统?
我们学习Python的终极目标,是用技术解放生产力。大家是否经历过这些场景?
面对50MB的Excel文件,卡顿到怀疑人生;
手动清洗数据、调整格式,耗费大量眼力;
制作透视表时公式出错,返工重来;
老板临时提问下月销量,只能凭经验估算。
传统流程耗时3天 → 本系统只需3分钟。
我们将整合前11课技能(Pandas数据清洗、Matplotlib可视化、Sklearn预测模型),打造一套自动化分析流水线,助大家高效决策。
02 系统架构:模块化设计,清晰可控
我们不必畏惧“系统”一词,它本质就是一条数据处理流水线:
03 实战四步法
Step 1 数据准备
环境配置:
pip install pandas matplotlib scikit-learn openpyxl
数据生成:通过generate_data.py创建模拟数据集(含销售/客户表)
import pandas as pdimport numpy as npfrom datetime import datetime, timedeltaimport osimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegression# ==========================================# 0. 全局配置与目录检查# ==========================================DATA_DIR = 'data'OUTPUT_DIR = 'output'# 自动创建不存在的文件夹,防止报错for dir_path in [DATA_DIR, OUTPUT_DIR]:ifnot os.path.exists(dir_path): os.makedirs(dir_path) print(f"已创建目录: {dir_path}")# 设置绘图风格plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False# 用来正常显示负号# ==========================================# 1. 数据生成模块# ==========================================defgenerate_data(): print("正在生成模拟数据...") np.random.seed(42) dates = [datetime(2023, 1, 1) + timedelta(days=i) for i in range(365)]# 生成销售数据 df_sales = pd.DataFrame({'订单日期': np.random.choice(dates, 1000),'产品': np.random.choice(['手机', '电脑', '平板', '耳机'], 1000),'销量': np.random.randint(1, 50, 1000),'单价': np.random.choice([2999, 5999, 3999, 299], 1000),'客户ID': np.random.randint(1001, 1050, 1000) }) df_sales['销售额'] = df_sales['销量'] * df_sales['单价']# 生成客户数据 df_cust = pd.DataFrame({'客户ID': range(1001, 1051),'客户等级': np.random.choice(['VIP', '普通', '潜在'], 50),'地区': np.random.choice(['华东', '华南', '华北', '西部'], 50) })# 保存数据 df_sales.to_csv(f'{DATA_DIR}/sales_data.csv', index=False, encoding='utf-8-sig') df_cust.to_csv(f'{DATA_DIR}/customer_data.csv', index=False, encoding='utf-8-sig') print("模拟数据已生成!")
代码功能:
智能清洗:自动处理日期格式、空值,合并多表数据
客户分层:基于消费额自动划分高价值/一般客户(RFM简化版)
预测模型:用线性回归实现销量趋势外推
一键出报:自动生成带图表的Excel(含3个Sheet页)
Step 2 核心代码解析
在PyCharm中新建main.py,这是我们的核心武器。我会把代码拆解,每一行都有注释,直接复制进去就能跑。
第一步:数据读取与清洗
# ==========================================# 2. 数据加载与清洗# ==========================================defload_and_clean(): print("正在读取数据...")try: df_sales = pd.read_csv(f'{DATA_DIR}/sales_data.csv') df_cust = pd.read_csv(f'{DATA_DIR}/customer_data.csv')except FileNotFoundError: print("未找到数据文件,正在重新生成...") generate_data() df_sales = pd.read_csv(f'{DATA_DIR}/sales_data.csv') df_cust = pd.read_csv(f'{DATA_DIR}/customer_data.csv')# 数据清洗 df_sales['订单日期'] = pd.to_datetime(df_sales['订单日期']) df_sales.dropna(subset=['销售额', '销量'], inplace=True)# 合并表 df_all = pd.merge(df_sales, df_cust, on='客户ID', how='left') print(f"数据加载完成,有效行数:{len(df_all)}")return df_all
第二步:核心经营分析这里我们做两个最老板最关心的分析:月度趋势和客户分层。
# ==========================================# 3. 业务分析# ==========================================defanalyze_business(df): print("正在分析业务数据...")# 按月聚合 df['月份'] = df['订单日期'].dt.to_period('M') monthly_sales = df.groupby('月份')['销售额'].sum().reset_index() monthly_sales['月份_str'] = monthly_sales['月份'].astype(str)# 客户分层 customer_value = df.groupby('客户ID')['销售额'].sum().reset_index() customer_value.rename(columns={'销售额': '总消费额'}, inplace=True) avg_val = customer_value['总消费额'].mean() customer_value['客户分层'] = customer_value['总消费额'].apply(lambda x: '高价值'if x > avg_val * 1.5else'一般' )return monthly_sales, customer_value
第三步:销量预测别觉得预测很高深,用线性回归就能做一个简单的趋势外推。
# ==========================================# 4. 销量预测# ==========================================defpredict_next_month(monthly_sales): print("正在预测下个月销量...")# 准备数据 X = np.array(range(len(monthly_sales))).reshape(-1, 1) y = monthly_sales['销售额'].values# 训练 model = LinearRegression() model.fit(X, y)# 预测 next_month_idx = len(monthly_sales) next_month_val = model.predict([[next_month_idx]])[0] print(f"预测下个月销售额约为: {next_month_val:,.2f} 元")return next_month_val
第四步:生成报表与图表最后一步,把结果存回Excel,并画出好看的图。
# ==========================================# 5. 生成报告与绘图# ==========================================defgenerate_report(monthly_sales, customer_value, prediction): print("正在生成报告...")# 1. 绘图:月度销售趋势 plt.figure(figsize=(10, 6))# 绘制历史数据 plt.plot(monthly_sales['月份_str'], monthly_sales['销售额'], marker='o', label='历史数据')# 绘制预测点# 这里为了演示,我们简单地把预测点放在x轴的最后位置# 实际项目中可能需要计算下个月的具体日期字符串 plt.scatter([len(monthly_sales) - 1], [prediction], color='red', label='预测点', zorder=5) plt.text(len(monthly_sales) - 1, prediction, f' 预测值: {prediction / 10000:.1f}w', color='red') plt.title('月度销售趋势及预测') plt.xlabel('月份') plt.ylabel('销售额') plt.legend() plt.savefig(f'{OUTPUT_DIR}/trend_chart.png', dpi=300) # 增加dpi使图片更清晰 plt.close()# 2. 绘图:客户分层 plt.figure(figsize=(6, 6)) counts = customer_value['客户分层'].value_counts() plt.pie(counts, labels=counts.index, autopct='%1.1f%%', startangle=140) plt.title('客户价值分层占比') plt.savefig(f'{OUTPUT_DIR}/customer_pie.png', dpi=300) plt.close()# 3. 写入Excelwith pd.ExcelWriter(f'{OUTPUT_DIR}/月度经营分析报告.xlsx') as writer: monthly_sales.to_excel(writer, sheet_name='月度汇总', index=False) customer_value.to_excel(writer, sheet_name='客户分层', index=False) summary = pd.DataFrame({'指标': ['下月预测销售额'], '数值': [prediction]}) summary.to_excel(writer, sheet_name='预测结论', index=False) print(f"报告生成完毕!请查看 '{OUTPUT_DIR}' 文件夹。")# ==========================================# 主程序入口# ==========================================if __name__ == '__main__':# 1. 检查数据是否存在,不存在则生成ifnot os.path.exists(f'{DATA_DIR}/sales_data.csv'): generate_data()# 2. 执行全流程 df_raw = load_and_clean() df_monthly, df_customer = analyze_business(df_raw) pred_val = predict_next_month(df_monthly) generate_report(df_monthly, df_customer, pred_val)
运行结果:
输出物示例:
月度经营分析报告.xlsx:含月度汇总/客户分层/预测结论
trend_chart.png:带预测线的销售趋势图
customer_pie.png:客户价值分布饼图
04 进阶方向
可以自己试试跑跑看:
自动邮件推送:集成smtplib发送报告给团队
异常检测:当销量波动>20%时触发预警
定时任务:通过Windows计划任务每月1日自动运行
核心:从“手工操作”到系统驱动决策,让数据真正赋能业务。
有问题评论区留言,需要代码后台“机器学习12”。