# Python销售数据可视化工具:从CSV到趋势分析与占比展示


背景介绍

在零售、电商等行业,销售数据的可视化分析是洞察业务趋势、优化决策的关键。通过直观的图表,我们能快速识别产品的日销售额波动、市场占比等核心指标。本文将开发一个轻量化工具,用Python的pandas处理CSV格式的销售数据,结合matplotlib绘制日销售额趋势折线图总销售额占比饼图,帮助业务人员高效解读数据。

实现思路分析

要完成销售数据的可视化,需分三步:数据读取→数据处理→可视化输出

  1. 数据读取:使用pandasread_csv读取本地CSV文件,自动解析“日期”“产品”“销售额”三列。
  2. 数据处理
    • 日销售额统计:按“日期”和“产品”分组,对“销售额”求和,得到每日各产品的销售额(用于折线图)。
    • 总销售额统计:按“产品”分组,对“销售额”求和,得到各产品的总销售额(用于饼图)。
  3. 可视化输出
    • 折线图:以“日期”为横轴,“销售额”为纵轴,为每个产品绘制一条折线,展示日趋势。
    • 饼图:以各产品总销售额为数据,展示其在总销售额中的占比。

代码实现(完整可运行版)

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()

代码解析与关键点

  1. 数据读取的鲁棒性
    代码中加入了文件不存在的异常处理,若本地无sales_data.csv,会自动生成示例数据(与问题描述中的测试数据一致),方便快速调试。

  2. 数据处理的核心操作

    • groupby(['日期', '产品']):按“日期+产品”双重分组,确保统计每日每个产品的销售额。
    • unstack():将“产品”从索引转为列,使daily_sales成为以“日期”为行、“产品”为列的DataFrame,便于matplotlib自动绘制多系列折线。
    • groupby('产品'):仅按“产品”分组,求和得到总销售额,为饼图提供数据。
  3. 可视化的细节优化
    • 折线图:通过marker='o'添加数据点标记,grid=True显示网格,color自定义颜色,提升可读性。
    • 饼图:autopct='%1.1f%%'自动计算并显示百分比;startangle=90wedgeprops让饼图更美观;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数据处理与可视化的技能,还能将其迁移到库存分析、用户行为分析等更多业务场景中!


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注