背景介绍
在零售、电商等行业,销售数据的可视化分析是洞察业务趋势、优化决策的关键。通过直观的图表,我们能快速识别产品的日销售额波动、市场占比等核心指标。本文将开发一个轻量化工具,用Python的pandas处理CSV格式的销售数据,结合matplotlib绘制日销售额趋势折线图和总销售额占比饼图,帮助业务人员高效解读数据。
实现思路分析
要完成销售数据的可视化,需分三步:数据读取→数据处理→可视化输出。
- 数据读取:使用
pandas的read_csv读取本地CSV文件,自动解析“日期”“产品”“销售额”三列。 - 数据处理:
- 日销售额统计:按“日期”和“产品”分组,对“销售额”求和,得到每日各产品的销售额(用于折线图)。
- 总销售额统计:按“产品”分组,对“销售额”求和,得到各产品的总销售额(用于饼图)。
- 可视化输出:
- 折线图:以“日期”为横轴,“销售额”为纵轴,为每个产品绘制一条折线,展示日趋势。
- 饼图:以各产品总销售额为数据,展示其在总销售额中的占比。
代码实现(完整可运行版)
import pandas as pd
import matplotlib.pyplot as plt
# ---------------------- 1. 读取CSV销售数据(含异常处理) ----------------------
file_path = 'sales_data.csv' # 本地CSV文件路径(可修改)
try:
df = pd.read_csv(file_path)
print(f"成功读取文件:{file_path},数据预览:")
print(df.head()) # 打印前5行数据,验证读取结果
except FileNotFoundError:
# 若文件不存在,生成示例数据用于测试
test_data = {
'日期': ['2023-09-01', '2023-09-01', '2023-09-02', '2023-09-02', '2023-09-03', '2023-09-03'],
'产品': ['手机', '电脑', '手机', '电脑', '手机', '电脑'],
'销售额': [5000, 3000, 5200, 2800, 4900, 3100]
}
df = pd.DataFrame(test_data)
print("本地文件不存在,已生成示例测试数据,继续执行...")
# ---------------------- 2. 数据处理:统计日销售额和总销售额 ----------------------
# 2.1 统计每日各产品销售额(用于折线图)
# groupby后得到多级索引Series,unstack将“产品”转为列,“日期”转为行
daily_sales = df.groupby(['日期', '产品'])['销售额'].sum().unstack(fill_value=0)
# 2.2 统计各产品总销售额(用于饼图)
total_sales = df.groupby('产品')['销售额'].sum()
# ---------------------- 3. 可视化:折线图(日趋势)+ 饼图(总占比) ----------------------
# 3.1 绘制日销售额趋势折线图
plt.figure(figsize=(10, 6)) # 设置画布大小
daily_sales.plot(
kind='line',
marker='o', # 标记点(增强数据点可读性)
title='各产品每日销售额趋势',
xlabel='日期',
ylabel='销售额',
legend=True,
grid=True, # 显示网格线(辅助读数)
color=['#ff6b6b', '#48dbfb'] # 自定义折线颜色
)
plt.tight_layout() # 调整布局,避免标签重叠
# 3.2 绘制总销售额占比饼图
plt.figure(figsize=(8, 8))
total_sales.plot(
kind='pie',
autopct='%1.1f%%', # 显示百分比(保留1位小数)
labels=total_sales.index, # 饼图标签为产品名称
title='各产品总销售额占比',
colors=['#ff9999', '#66b3ff', '#99ff99'], # 自定义饼图颜色
startangle=90, # 起始角度(让饼图更美观)
wedgeprops={'edgecolor': 'white'}, # 饼图块边缘颜色(区分区块)
ylabel='' # 隐藏y轴标签(饼图不需要)
)
plt.axis('equal') # 保证饼图为正圆形
plt.tight_layout()
# 显示所有图表
plt.show()
代码解析与关键点
- 数据读取的鲁棒性:
代码中加入了文件不存在的异常处理,若本地无sales_data.csv,会自动生成示例数据(与问题描述中的测试数据一致),方便快速调试。 -
数据处理的核心操作:
groupby(['日期', '产品']):按“日期+产品”双重分组,确保统计每日每个产品的销售额。unstack():将“产品”从索引转为列,使daily_sales成为以“日期”为行、“产品”为列的DataFrame,便于matplotlib自动绘制多系列折线。groupby('产品'):仅按“产品”分组,求和得到总销售额,为饼图提供数据。
- 可视化的细节优化:
- 折线图:通过
marker='o'添加数据点标记,grid=True显示网格,color自定义颜色,提升可读性。 - 饼图:
autopct='%1.1f%%'自动计算并显示百分比;startangle=90和wedgeprops让饼图更美观;plt.axis('equal')保证饼图为正圆形。
- 折线图:通过
测试与验证(示例数据)
以问题描述中的示例CSV为例:
日期,产品,销售额
2023-09-01,手机,5000
2023-09-01,电脑,3000
2023-09-02,手机,5200
2023-09-02,电脑,2800
2023-09-03,手机,4900
2023-09-03,电脑,3100
- 日销售额统计:
daily_sales的结构为(日期为行,产品为列):
日期 手机 电脑 2023-09-01 5000 3000 2023-09-02 5200 2800 2023-09-03 4900 3100 -
总销售额统计:
total_sales为(产品为索引,销售额为值):
手机 → 5000+5200+4900=15100;电脑 → 3000+2800+3100=8900。
运行代码后,折线图会清晰展示“手机”“电脑”的日销售额波动,饼图则呈现“手机(62.8%)”“电脑(37.2%)”的占比。
总结与拓展
本文开发的工具通过Python+Pandas+Matplotlib的组合,实现了销售数据的快速可视化。核心学习点包括:
– 数据处理:掌握groupby+unstack的分组聚合技巧,灵活转换数据结构。
– 可视化设计:通过颜色、标记、网格等细节优化图表可读性,满足业务汇报需求。
拓展方向:
– 支持更多图表(如柱状图对比日销售额、热力图展示时段分布);
– 增加数据筛选功能(如按日期范围、产品类别筛选);
– 导出图表为图片或PDF,便于分享。
通过这个项目,你不仅能巩固Python数据处理与可视化的技能,还能将其迁移到库存分析、用户行为分析等更多业务场景中!