这次我们来看一个能直接写到简历里的实战项目基于 Python MySQL 的霸王茶姬数据分析与销量可视化。对于想找数据分析、后端开发或商业智能相关工作的同学来说一个结构完整、技术栈清晰、有实际业务场景的项目经验至关重要。这个项目就提供了一个从数据获取、存储、清洗、分析到可视化展示的完整闭环用到的 Python、MySQL、Pandas、Matplotlib/Seaborn 等技术都是企业招聘时的硬通货。项目的核心价值在于“练完就能用”。它模拟了一个真实的商业分析场景对霸王茶姬一个知名茶饮品牌的销售数据进行分析挖掘销量趋势、产品偏好、门店表现等关键信息并通过图表直观呈现。整个过程涵盖了数据处理的全链路能让你系统地掌握数据分析的工程化思维和实操技能。本文将带你从零开始一步步搭建这个项目。我们会重点拆解环境准备、数据库设计、数据清洗、核心分析逻辑以及可视化图表生成等关键环节。无论你是数据分析新手还是想用项目巩固技能的开发者跟着做一遍不仅能理解每个步骤的原理还能获得一套可直接运行、展示的代码和成果。1. 核心能力速览在动手之前我们先快速了解这个项目能做什么以及你需要准备什么。能力项说明项目类型商业数据分析与可视化实战项目技术栈Python, MySQL, Pandas, NumPy, Matplotlib/Seaborn, (可选) Jupyter Notebook核心功能1. 模拟/获取销售数据2. 设计并构建 MySQL 数据库3. 使用 Python 进行数据清洗与预处理4. 执行多维数据分析如销量趋势、产品排行、门店贡献5. 生成静态/交互式可视化图表硬件门槛极低。普通笔记本电脑即可对显卡无要求。主要依赖 CPU 和内存。环境依赖Python 3.7, MySQL 5.7/8.0 相关 Python 库pandas, pymysql, matplotlib 等数据来源项目通常提供模拟数据脚本或结构化的 CSV 文件。也可自行拓展为网络爬虫获取需注意合规。产出物1. 结构化的 MySQL 数据库2. 清洗后的高质量数据集3. 数据分析报告Jupyter Notebook 或 Python 脚本4. 一套可视化图表折线图、柱状图、饼图、热力图等适合场景个人技能学习、毕业设计、面试项目经验积累、企业内部业务分析原型开发2. 适用场景与使用边界这个项目非常适合以下几类人群在校学生/转行者缺乏商业项目经验需要一份能体现数据处理全流程的完整作品。求职者应聘数据分析师、数据开发、商业分析师等岗位需要在简历中展示具体的、可被验证的 Python 和 SQL 能力。业务人员希望用 Python 自动化处理 Excel 报表进行更深入的销售洞察。开发者想学习如何将数据库操作、业务逻辑和前端展示图表结合起来的全栈式数据应用开发。它能解决的问题包括技能整合将分散的 Python 语法、SQL 语句、图表库 API 调用串联成一个解决实际问题的项目。业务流程理解体验从原始数据到决策支持的完整数据分析流程。作品集构建生成一套包含代码、数据库、分析报告和图表的可展示成果。需要注意的边界数据真实性项目通常使用模拟数据其分布和规律可能与现实有差异。用于学习完全足够但若用于真实商业决策需接入真实、合规的数据源。复杂度这是一个教学型项目侧重于流程演示和核心技能覆盖。真实企业级数据分析会涉及更复杂的数据仓库、调度任务、权限管理和高性能查询优化。可视化深度本项目主要使用 Matplotlib/Seaborn 生成静态图表。若需高度交互的仪表盘可后续拓展学习 Plotly、Pyecharts 或 BI 工具如 Tableau, Power BI。合规与授权如果计划拓展为爬虫项目获取真实数据必须严格遵守目标网站的 robots.txt 协议尊重数据版权不得用于非法用途或商业牟利。本项目建议优先使用提供的模拟数据。3. 环境准备与前置条件开始编码前请确保你的开发环境已就绪。1. 操作系统Windows 10/11, macOS, 或 Linux (如 Ubuntu)。本项目在三大平台上均可运行。2. 软件安装清单Python 3.7 或更高版本前往 Python 官网 下载并安装。安装时务必勾选 “Add Python to PATH”。MySQL 数据库前往 MySQL 官网 下载社区版。安装过程中记住你设置的 root 用户密码。代码编辑器或 IDE推荐使用VSCode、PyCharm或Jupyter Notebook。VSCode 轻量且插件丰富PyCharm 对 Python 支持更专业Jupyter 适合分步执行和展示。3. Python 库依赖我们将使用pip安装必要的库。打开终端(Windows 为 CMD 或 PowerShellmacOS/Linux 为 Terminal)执行以下命令# 升级 pip 到最新版本可选但推荐 python -m pip install --upgrade pip # 安装核心数据分析与可视化库 pip install pandas numpy matplotlib seaborn # 安装 MySQL 数据库连接驱动 pip install pymysql # 安装 Jupyter Notebook如果你想以 Notebook 形式运行 pip install jupyter # 安装用于生成模拟数据的库可选用于创建测试数据 pip install faker4. 数据库客户端可选但推荐为了方便查看和管理数据库建议安装一个图形化 MySQL 客户端如MySQL Workbench(官方工具)DBeaver(免费开源支持多种数据库)Navicat(商业软件有试用版)5. 验证安装在终端中分别执行以下命令确认关键组件安装成功# 验证 Python 和 pip python --version pip --version # 验证库是否可导入无报错即成功 python -c import pandas, numpy, matplotlib, seaborn, pymysql; print(All packages imported successfully.)4. 数据库设计与构建数据分析的基石是结构良好的数据。我们首先设计并创建存储霸王茶姬销售数据的 MySQL 数据库。4.1 数据库概念模型我们设计几个核心表来模拟业务products(产品表)存储所有茶饮产品信息。stores(门店表)存储各个门店信息。sales(销售流水表)核心表记录每一笔订单的明细。dates(日期维度表可选)便于进行复杂的时间序列分析。4.2 创建数据库和表打开你的 MySQL 客户端命令行或图形化工具连接数据库后执行以下 SQL 语句-- 1. 创建数据库 CREATE DATABASE IF NOT EXISTS bawangchaji_analysis DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE bawangchaji_analysis; -- 2. 创建产品表 CREATE TABLE products ( product_id INT NOT NULL AUTO_INCREMENT, product_name VARCHAR(100) NOT NULL COMMENT 产品名称如伯牙绝弦、春日桃桃, category VARCHAR(50) COMMENT 产品类别如奶茶、果茶、芝士茶, price DECIMAL(10, 2) NOT NULL COMMENT 单价元, cost DECIMAL(10, 2) COMMENT 成本元, launch_date DATE COMMENT 上市日期, PRIMARY KEY (product_id), INDEX idx_category (category) ) ENGINEInnoDB COMMENT产品信息表; -- 3. 创建门店表 CREATE TABLE stores ( store_id INT NOT NULL AUTO_INCREMENT, store_name VARCHAR(100) NOT NULL COMMENT 门店名称, city VARCHAR(50) NOT NULL COMMENT 所在城市, district VARCHAR(50) COMMENT 所在区域, open_date DATE COMMENT 开业日期, store_size VARCHAR(20) COMMENT 门店规模如S/M/L, PRIMARY KEY (store_id), INDEX idx_city (city) ) ENGINEInnoDB COMMENT门店信息表; -- 4. 创建销售流水表核心事实表 CREATE TABLE sales ( sale_id BIGINT NOT NULL AUTO_INCREMENT, order_id VARCHAR(50) NOT NULL COMMENT 订单号, store_id INT NOT NULL COMMENT 门店ID, product_id INT NOT NULL COMMENT 产品ID, sale_date DATE NOT NULL COMMENT 销售日期, sale_time TIME COMMENT 销售时间, quantity INT NOT NULL DEFAULT 1 COMMENT 销售数量, unit_price DECIMAL(10, 2) NOT NULL COMMENT 成交单价, payment_method VARCHAR(20) COMMENT 支付方式如微信、支付宝、现金, customer_rating TINYINT COMMENT 顾客评分1-5, PRIMARY KEY (sale_id), INDEX idx_date (sale_date), INDEX idx_store_product (store_id, product_id), FOREIGN KEY (store_id) REFERENCES stores(store_id) ON DELETE RESTRICT, FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE RESTRICT ) ENGINEInnoDB COMMENT销售流水表; -- 5. 可选创建日期维度表 CREATE TABLE dim_date ( date DATE NOT NULL, year SMALLINT NOT NULL, quarter TINYINT NOT NULL, month TINYINT NOT NULL, day TINYINT NOT NULL, day_of_week TINYINT NOT NULL COMMENT 1Monday, 7Sunday, is_weekend BOOLEAN NOT NULL, is_holiday BOOLEAN DEFAULT FALSE, PRIMARY KEY (date) ) ENGINEInnoDB COMMENT日期维度表;4.3 插入模拟数据有了表结构我们需要填充数据。这里提供一个 Python 脚本使用faker和random库生成模拟数据并插入数据库。将以下代码保存为generate_mock_data.py。import pymysql import random from datetime import datetime, timedelta from faker import Faker # 初始化 fake Faker(zh_CN) conn pymysql.connect( hostlocalhost, userroot, # 替换为你的用户名 passwordyour_password, # 替换为你的密码 databasebawangchaji_analysis, charsetutf8mb4 ) cursor conn.cursor() # 1. 清空旧数据谨慎操作首次运行可跳过 # cursor.execute(DELETE FROM sales;) # cursor.execute(DELETE FROM products;) # cursor.execute(DELETE FROM stores;) # conn.commit() # 2. 插入产品数据 products_data [ (伯牙绝弦, 奶茶, 18.0, 6.0, 2022-01-01), (春日桃桃, 果茶, 22.0, 7.5, 2023-03-15), (桂馥兰香, 奶茶, 20.0, 6.8, 2022-05-10), (青青糯山, 奶茶, 19.0, 6.2, 2022-08-20), (去云南·玫瑰普洱, 奶茶, 23.0, 8.0, 2023-06-01), (夏梦玫珑, 果茶, 21.0, 7.0, 2023-07-10), (金丝小种, 奶茶, 24.0, 8.5, 2023-10-01), ] insert_product_sql INSERT INTO products (product_name, category, price, cost, launch_date) VALUES (%s, %s, %s, %s, %s); cursor.executemany(insert_product_sql, products_data) conn.commit() print(fInserted {cursor.rowcount} products.) # 3. 插入门店数据 cities [北京, 上海, 广州, 深圳, 杭州, 成都, 武汉] stores_data [] for i in range(1, 21): # 创建20家门店 city random.choice(cities) store_name f{city}店-{fake.street_name()} open_date fake.date_between(start_date-2 years, end_datetoday) stores_data.append((store_name, city, fake.district(), open_date, random.choice([S, M, L]))) insert_store_sql INSERT INTO stores (store_name, city, district, open_date, store_size) VALUES (%s, %s, %s, %s, %s); cursor.executemany(insert_store_sql, stores_data) conn.commit() print(fInserted {cursor.rowcount} stores.) # 4. 插入销售数据模拟最近90天的数据 start_date datetime.now() - timedelta(days90) payment_methods [微信支付, 支付宝, 现金, 信用卡] sale_records [] order_id_counter 10000 for day_offset in range(90): current_date start_date timedelta(daysday_offset) date_str current_date.strftime(%Y-%m-%d) # 每天生成 50-200 笔随机订单 daily_orders random.randint(50, 200) for _ in range(daily_orders): order_id fORD{order_id_counter} order_id_counter 1 store_id random.randint(1, 20) # 每笔订单包含1-3个商品 items_in_order random.randint(1, 3) for _ in range(items_in_order): product_id random.randint(1, len(products_data)) quantity random.randint(1, 3) # 获取产品单价 cursor.execute(SELECT price FROM products WHERE product_id %s, (product_id,)) unit_price cursor.fetchone()[0] sale_time fake.time_object() payment random.choice(payment_methods) rating random.choice([None, random.randint(3, 5)]) # 部分订单有评分 sale_records.append((order_id, store_id, product_id, date_str, sale_time, quantity, unit_price, payment, rating)) # 每积累1000条记录插入一次避免内存过大 if len(sale_records) 1000: insert_sale_sql INSERT INTO sales (order_id, store_id, product_id, sale_date, sale_time, quantity, unit_price, payment_method, customer_rating) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s); cursor.executemany(insert_sale_sql, sale_records) conn.commit() sale_records.clear() # 插入剩余记录 if sale_records: insert_sale_sql INSERT INTO sales (order_id, store_id, product_id, sale_date, sale_time, quantity, unit_price, payment_method, customer_rating) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s); cursor.executemany(insert_sale_sql, sale_records) conn.commit() print(fFinished generating mock sales data.) cursor.close() conn.close()运行脚本前请务必修改第10-13行的数据库连接信息主机、用户名、密码。然后在终端运行python generate_mock_data.py脚本运行成功后你的数据库里就有了可供分析的结构化数据。5. 数据分析与处理 (Python Pandas)数据就绪后我们开始用 Python 进行核心分析。我们将使用 Pandas 从 MySQL 读取数据并进行清洗、转换和聚合。5.1 连接数据库并加载数据创建一个新的 Python 脚本例如analysis.py。import pymysql import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sqlalchemy import create_engine import warnings warnings.filterwarnings(ignore) # 设置中文显示和图表样式 plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, DejaVu Sans] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 sns.set_style(whitegrid) # 1. 创建数据库连接引擎 (使用 SQLAlchemy便于 Pandas 直接读写) # 格式mysqlpymysql://用户名:密码主机:端口/数据库名 engine create_engine(mysqlpymysql://root:your_passwordlocalhost:3306/bawangchaji_analysis) # 2. 使用 Pandas 的 read_sql 函数直接读取表到 DataFrame print(正在从数据库加载数据...) products_df pd.read_sql(SELECT * FROM products, conengine) stores_df pd.read_sql(SELECT * FROM stores, conengine) sales_df pd.read_sql(SELECT * FROM sales, conengine) print(f产品表记录数: {len(products_df)}) print(f门店表记录数: {len(stores_df)}) print(f销售表记录数: {len(sales_df)}) # 查看数据前几行和基本信息 print(\n--- 销售表前5行 ---) print(sales_df.head()) print(\n--- 销售表信息 ---) print(sales_df.info()) print(\n--- 销售表描述性统计 ---) print(sales_df.describe())5.2 数据清洗与预处理真实数据往往存在缺失、异常或格式问题清洗是保证分析质量的关键。# 3. 数据清洗 print(\n 数据清洗 ) # 检查缺失值 print(各列缺失值数量:) print(sales_df.isnull().sum()) # 处理缺失值评分缺失是合理的并非所有顾客都评分我们暂时保留。其他关键字段如单价、数量不应缺失。 # 如果发现关键字段缺失可以删除或填充。本例中假设数据质量较好。 # 检查异常值例如数量或单价为负数或极大值 print(\n检查异常值:) print(f销售数量范围: {sales_df[quantity].min()} ~ {sales_df[quantity].max()}) print(f销售单价范围: {sales_df[unit_price].min()} ~ {sales_df[unit_price].max()}) # 假设我们定义数量10或单价100为异常进行筛选查看实际业务中需根据情况定义 potential_outliers sales_df[(sales_df[quantity] 10) | (sales_df[unit_price] 100)] print(f潜在异常值记录数: {len(potential_outliers)}) # 对于教学数据我们可以选择删除或保留。这里选择保留但标记。 sales_df[is_outlier] (sales_df[quantity] 10) | (sales_df[unit_price] 100) # 数据类型转换确保日期列是 datetime 类型 sales_df[sale_date] pd.to_datetime(sales_df[sale_date]) sales_df[sale_time] pd.to_timedelta(sales_df[sale_time].astype(str)) # 将时间转换为 timedelta 便于分析 # 创建衍生字段计算每笔销售的金额 sales_df[sale_amount] sales_df[quantity] * sales_df[unit_price] print(\n清洗后销售表前3行:) print(sales_df[[order_id, sale_date, product_id, quantity, unit_price, sale_amount, is_outlier]].head(3))5.3 数据合并与关联为了进行多维分析我们需要将销售数据与产品、门店信息关联起来。# 4. 数据合并 print(\n 数据关联 ) # 将销售表与产品表关联 sales_product_df pd.merge(sales_df, products_df, howleft, left_onproduct_id, right_onproduct_id) # 将上述结果再与门店表关联 full_df pd.merge(sales_product_df, stores_df, howleft, left_onstore_id, right_onstore_id) # 查看合并后的字段 print(合并后数据字段:, full_df.columns.tolist()) print(f合并后总记录数: {len(full_df)}) print(\n合并后数据示例:) print(full_df[[order_id, sale_date, product_name, category, store_name, city, quantity, sale_amount]].head())6. 核心业务分析现在我们可以基于清洗和合并后的full_df进行具体的业务分析了。6.1 整体销售概览print(\n 整体销售概览 ) total_sales_amount full_df[sale_amount].sum() total_orders full_df[order_id].nunique() # 注意一个订单可能有多条记录 total_quantity full_df[quantity].sum() avg_order_value total_sales_amount / total_orders print(f总销售额: ¥{total_sales_amount:,.2f}) print(f总订单数: {total_orders}) print(f总销售杯数: {total_quantity}) print(f平均订单价值 (AOV): ¥{avg_order_value:.2f})6.2 按时间维度分析日、周、月趋势print(\n 销售趋势分析 ) # 按日聚合 daily_sales full_df.groupby(sale_date)[sale_amount].sum().reset_index() daily_sales daily_sales.sort_values(sale_date) # 按周聚合 (假设以周一为一周的开始) full_df[sale_week] full_df[sale_date].dt.to_period(W).dt.start_time weekly_sales full_df.groupby(sale_week)[sale_amount].sum().reset_index() # 按月聚合 full_df[sale_month] full_df[sale_date].dt.to_period(M).astype(str) monthly_sales full_df.groupby(sale_month)[sale_amount].sum().reset_index() print(月度销售额:) print(monthly_sales)6.3 产品维度分析哪些产品最受欢迎print(\n 产品表现分析 ) # 按产品销售额排名 product_sales full_df.groupby([product_id, product_name, category]).agg({ sale_amount: sum, quantity: sum, order_id: nunique # 计算包含该产品的订单数 }).reset_index() product_sales product_sales.sort_values(sale_amount, ascendingFalse) product_sales.columns [product_id, product_name, category, total_sales, total_quantity, order_count] print(产品销售额排名 Top 10:) print(product_sales.head(10)) # 按产品类别分析 category_sales full_df.groupby(category)[sale_amount].sum().sort_values(ascendingFalse).reset_index() print(\n按产品类别销售额排名:) print(category_sales)6.4 门店维度分析哪些门店贡献最大print(\n 门店表现分析 ) # 按门店销售额排名 store_sales full_df.groupby([store_id, store_name, city]).agg({ sale_amount: sum, order_id: nunique, quantity: sum }).reset_index() store_sales store_sales.sort_values(sale_amount, ascendingFalse) store_sales.columns [store_id, store_name, city, total_sales, order_count, total_quantity] print(门店销售额排名 Top 10:) print(store_sales.head(10)) # 按城市分析 city_sales full_df.groupby(city)[sale_amount].sum().sort_values(ascendingFalse).reset_index() print(\n城市销售额排名:) print(city_sales)6.5 顾客行为分析支付方式、评分print(\n 顾客行为分析 ) # 支付方式分布 payment_dist full_df[payment_method].value_counts(normalizeTrue) * 100 print(支付方式占比 (%):) print(payment_dist.round(2)) # 评分分布 (仅分析有评分的订单) rating_df full_df[full_df[customer_rating].notnull()] if not rating_df.empty: avg_rating rating_df[customer_rating].mean() rating_dist rating_df[customer_rating].value_counts().sort_index() print(f\n平均顾客评分: {avg_rating:.2f}) print(评分分布:) print(rating_dist) else: print(\n暂无顾客评分数据。)7. 数据可视化分析结果用图表展示更加直观。我们将使用 Matplotlib 和 Seaborn 库。7.1 月度销售趋势图折线图# 可视化 1: 月度销售额趋势 plt.figure(figsize(12, 6)) # 确保月份顺序正确 monthly_sales[sale_month] pd.to_datetime(monthly_sales[sale_month]) monthly_sales monthly_sales.sort_values(sale_month) plt.plot(monthly_sales[sale_month], monthly_sales[sale_amount], markero, linewidth2, markersize8) plt.title(霸王茶姬月度销售额趋势, fontsize16, fontweightbold) plt.xlabel(月份, fontsize12) plt.ylabel(销售额 (元), fontsize12) plt.grid(True, linestyle--, alpha0.7) plt.xticks(rotation45) plt.tight_layout() # 保存图表 plt.savefig(monthly_sales_trend.png, dpi300, bbox_inchestight) plt.show()7.2 产品销售额 Top 10柱状图# 可视化 2: 产品销售额 Top 10 柱状图 top10_products product_sales.head(10).copy() # 缩短长产品名以便显示 top10_products[product_name_short] top10_products[product_name].apply(lambda x: x[:8] ... if len(x) 8 else x) plt.figure(figsize(14, 7)) bars plt.barh(top10_products[product_name_short], top10_products[total_sales], colorsns.color_palette(viridis, len(top10_products))) plt.title(产品销售额 Top 10, fontsize16, fontweightbold) plt.xlabel(销售额 (元), fontsize12) plt.gca().invert_yaxis() # 让最高的在最上面 # 在柱子上添加数值标签 for bar in bars: width bar.get_width() plt.text(width max(top10_products[total_sales])*0.005, bar.get_y() bar.get_height()/2, f¥{width:,.0f}, haleft, vacenter, fontsize10) plt.tight_layout() plt.savefig(top10_products_sales.png, dpi300, bbox_inchestight) plt.show()7.3 城市销售额分布饼图或条形图# 可视化 3: 城市销售额分布 (饼图) plt.figure(figsize(10, 10)) city_sales_for_plot city_sales.copy() # 如果城市太多可以聚合“其他” if len(city_sales_for_plot) 8: top_cities city_sales_for_plot.head(7) other_sales city_sales_for_plot.iloc[7:][sale_amount].sum() other_row pd.DataFrame({city: [其他], sale_amount: [other_sales]}) city_sales_for_plot pd.concat([top_cities, other_row], ignore_indexTrue) plt.pie(city_sales_for_plot[sale_amount], labelscity_sales_for_plot[city], autopct%1.1f%%, startangle90, textprops{fontsize: 11}) plt.title(销售额城市分布, fontsize16, fontweightbold) plt.axis(equal) # 保证饼图是圆形 plt.tight_layout() plt.savefig(sales_by_city_pie.png, dpi300, bbox_inchestight) plt.show()7.4 支付方式占比环形图# 可视化 4: 支付方式占比 (环形图) plt.figure(figsize(8, 8)) wedges, texts, autotexts plt.pie(payment_dist.values, labelspayment_dist.index, autopct%1.1f%%, startangle90, colorssns.color_palette(Set2)) # 绘制一个白色圆形在中心形成环形图 centre_circle plt.Circle((0,0),0.70,fcwhite) fig plt.gcf() fig.gca().add_artist(centre_circle) plt.title(支付方式占比, fontsize16, fontweightbold) plt.tight_layout() plt.savefig(payment_method_donut.png, dpi300, bbox_inchestight) plt.show()7.5 综合仪表板多子图我们可以将多个关键图表组合在一张图上形成仪表板。# 可视化 5: 综合仪表板 fig, axes plt.subplots(2, 2, figsize(16, 12)) fig.suptitle(霸王茶姬销售数据分析仪表板, fontsize20, fontweightbold) # 子图1: 月度趋势 axes[0, 0].plot(monthly_sales[sale_month], monthly_sales[sale_amount], markero, linewidth2, colorsteelblue) axes[0, 0].set_title(月度销售额趋势, fontsize14) axes[0, 0].set_xlabel(月份) axes[0, 0].set_ylabel(销售额 (元)) axes[0, 0].grid(True, linestyle--, alpha0.5) axes[0, 0].tick_params(axisx, rotation45) # 子图2: 产品Top5 top5 product_sales.head(5) axes[0, 1].barh(top5[product_name], top5[total_sales], colorlightcoral) axes[0, 1].set_title(热销产品 Top 5, fontsize14) axes[0, 1].set_xlabel(销售额 (元)) axes[0, 1].invert_yaxis() # 子图3: 城市销售额 axes[1, 0].bar(city_sales[city], city_sales[sale_amount], colorskyblue) axes[1, 0].set_title(各城市销售额, fontsize14) axes[1, 0].set_xlabel(城市) axes[1, 0].set_ylabel(销售额 (元)) axes[1, 0].tick_params(axisx, rotation45) # 子图4: 支付方式 axes[1, 1].pie(payment_dist.values, labelspayment_dist.index, autopct%1.1f%%, startangle90) axes[1, 1].set_title(支付方式分布, fontsize14) plt.tight_layout(rect[0, 0.03, 1, 0.95]) # 调整布局给总标题留空间 plt.savefig(sales_dashboard.png, dpi300, bbox_inchestight) plt.show()运行完所有代码后你将在当前目录下得到monthly_sales_trend.png、top10_products_sales.png、sales_by_city_pie.png、payment_method_donut.png和sales_dashboard.png等图片文件它们就是你项目的可视化成果。8. 项目总结与进阶方向至此一个完整的“数据获取 - 存储 - 清洗 - 分析 - 可视化”的 Python MySQL 数据分析项目就完成了。你可以将整个流程封装成一个 Jupyter Notebook 或一个 Python 脚本连同生成的图表和一份简明的分析报告Markdown 格式整理成一个项目文件夹。这就是你简历上可以展示的“霸王茶姬数据分析与销量可视化”项目。这个项目最值得尝试的点全流程覆盖一次性串联了数据库操作、SQL、Pandas 数据处理、业务分析和 Matplotlib 可视化等多个核心技能点。业务驱动围绕真实的商业场景销售分析展开分析结论有明确的业务意义。可扩展性强在此基础上可以轻松添加新功能。最容易踩的坑环境配置确保 Python 和 MySQL 版本兼容pymysql或mysql-connector-python正确安装。字符编码数据库、表和 Python 连接字符串务必使用utf8mb4编码避免中文乱码。数据关联进行多表JOIN时务必理清关联键如product_id,store_id否则会导致数据重复或丢失。图表美化默认的 Matplotlib 图表比较朴素需要花时间调整颜色、字体、布局Seaborn 提供了更好的默认样式。后续可以继续扩展的方向构建 Web 仪表盘使用Flask或Streamlit框架将分析结果和图表做成一个可交互的网页应用并部署到云端。自动化报告使用crontab(Linux/macOS) 或Task Scheduler(Windows) 定时运行分析脚本并通过邮件自动发送 PDF 报告。引入机器学习尝试使用scikit-learn进行销量预测、顾客分群或产品推荐。对接真实数据源学习简单的网页爬虫如requestsBeautifulSoup务必遵守法律法规和网站协议或学习如何从企业 ERP、CRM 系统导出数据。优化数据库学习为大型表创建更有效的索引或者将数据迁移到数据仓库如 ClickHouse进行分析。建议将本项目的代码、文档和产出图表整理到 GitHub并写一份清晰的 README。这不仅能作为你的技能证明也能在面试时为你提供丰富的谈资。动手做一遍远比只看教程收获更大。