资讯动态

Python数据分析与可视化源码包实战:从环境搭建到图表产出

发布时间:2026/10/21 16:29:31 来源:尧图企业网站定制
简介这份资源面向希望系统掌握Python数据分析与可视化的学习者覆盖从编程基础到实战项目的完整技能链路。包内共162个文件以67个ipynb实验代码、11个pptx课件、10个csv与6个xls数据集为主另含tif图像、pdf与doc教学文档等压缩包约31.27MB目录按章节与实验模块组织便于对照学习。内容从数据分析与可视化概述、Python编程基础讲起逐步深入Pandas数据载入与预处理、统计分析基础再到Matplotlib、Seaborn与pyecharts三类可视化库的图表绘制与交互式呈现配套iris、红酒品质、学生成绩等真实数据集供动手练习。已有18154人学习下载适合高校学生、转行者及需要补齐数据处理与可视化能力的开发者可借助现成课件与代码快速搭建学习路径完成从数据清洗到图表输出的完整实践。1. 从一份 Python 数据分析与可视化源码包说起它到底能跑出什么很多做数据的朋友手里都攒过一堆.csv、.xlsx打开 Excel 卡到转圈想画个多维度对比图又得来回透视。这份 Python 数据分析与可视化源码包解决的就是从原始表格到可交付图表这一整条链路——不是零散脚本而是把数据清洗、聚合、可视化封装成能直接替换数据源就跑通的工程结构。它适合两类人刚学完 pandas 基础、想看看真实项目怎么组织代码的新手以及需要快速搭一套报表原型、不想每次从零写 matplotlib 样式的熟手。源码里用到的库都是主流选型没有冷门依赖环境装好基本一次跑通。2. 环境搭建与源码结构先让项目在你机器上跑起来拿到源码包第一件事不是急着看业务逻辑而是把运行环境对齐。数据分析类项目最怕的就是“在我机器上能跑”因为 pandas、numpy、matplotlib 这几个库的版本差异会直接导致 API 行为不同比如append方法在新版 pandas 里已经被移除老代码跑起来直接报AttributeError。所以这一章先把依赖装干净再拆目录结构最后跑通入口脚本。2.1 依赖安装与虚拟环境隔离我一般不会把数据分析的依赖装进系统 Python因为不同项目对 pandas 版本要求经常打架。用 venv 建一个独立环境是最省心的做法删掉重来也不影响别的项目。# 创建虚拟环境目录名用 .venv 是社区惯例 python -m venv .venv # 激活环境Windows 用 .venv\Scripts\activate source .venv/bin/activate # 安装核心依赖版本号按源码包 requirements.txt 来 pip install -r requirements.txt # 如果源码包没带 requirements.txt用下面这组常见版本兜底 pip install pandas2.1.4 numpy1.26.2 matplotlib3.8.2 seaborn0.13.0 openpyxl3.1.2这里有几个参数值得说清楚。pandas2.1.4是较新的稳定版支持pd.NA统一缺失值处理numpy1.26.2和它兼容不会出现二进制不匹配的警告openpyxl是读写.xlsx的引擎缺了它read_excel会直接抛ImportError。装完之后用pip list核对一遍重点看 pandas 和 numpy 的版本是否匹配这两个库版本错位是最常见的翻车点。提示如果安装过程中 numpy 编译报错优先检查 Python 版本是否在 3.9 到 3.12 之间过新或过旧的解释器容易触发 wheel 缺失。2.2 目录结构与入口脚本定位源码包的目录组织通常遵循“数据、代码、输出”三分离的原则这样替换数据源时不用动代码。典型结构长这样project/ ├── data/ │ ├── raw/ # 原始数据只读不改 │ └── processed/ # 清洗后的中间结果 ├── src/ │ ├── clean.py # 数据清洗模块 │ ├── analyze.py # 聚合统计模块 │ └── visualize.py # 图表生成模块 ├── output/ │ └── figures/ # 导出的图片 ├── config.py # 路径与参数配置 └── main.py # 入口串起整条流程先打开config.py里面一般定义了数据路径、图表尺寸、配色方案这些可调参数。把DATA_PATH指向你自己的文件再运行python main.py。如果入口脚本报FileNotFoundError九成是路径写成了绝对路径而你的目录结构不同改成相对路径或直接改 config 里的根目录变量即可。跑通之后output/figures/下应该出现若干 png 文件这就说明整条链路是通的。3. 数据清洗与聚合pandas 里最容易写错的几个操作环境跑通只是第一步真正决定分析质量的是清洗和聚合环节。这份源码包里clean.py和analyze.py覆盖了缺失值处理、类型转换、分组聚合、透视表这几类高频操作。我拆的时候发现几个地方如果照搬网上教程的写法数据量一大就会出问题下面逐个说。3.1 缺失值与类型转换的稳妥写法原始数据里最常见的脏数据是空值、空格字符串、以及数字被存成文本。直接dropna()会误删大量有效行我一般先统计缺失比例再决定策略。import pandas as pd import numpy as np # 读取时就把常见缺失标记统一识别为空值 df pd.read_csv( data/raw/sales.csv, na_values[, , NULL, N/A, null], # 覆盖多种脏标记 keep_default_naTrue ) # 统计每列缺失比例超过 60% 的列考虑直接丢弃 missing_ratio df.isnull().mean().sort_values(ascendingFalse) print(missing_ratio[missing_ratio 0]) # 数值列用中位数填充类别列用众数填充 num_cols df.select_dtypes(include[np.number]).columns cat_cols df.select_dtypes(include[object]).columns df[num_cols] df[num_cols].fillna(df[num_cols].median()) df[cat_cols] df[cat_cols].fillna(df[cat_cols].mode().iloc[0]) # 把被存成文本的金额列转回数值errorscoerce 让非法值变 NaN df[amount] pd.to_numeric(df[amount], errorscoerce)na_values这个参数很关键默认只认空字符串和NaN但实际数据里经常有NULL、N/A这类写法不显式声明就会被当成有效类别值后面聚合时冒出一堆莫名其妙的分类。errorscoerce是类型转换的后悔药遇到1,234这种带千分位的文本会转成 NaN 而不是直接报错转完再统一处理这批 NaN 就行。填充策略上数值列用中位数比均值抗极端值类别列用众数是最保守的选择。3.2 分组聚合与透视表的性能差异分组统计是分析的核心但groupby().apply()和groupby().agg()在数据量上万行后性能差距明显。源码包里用的是agg加字典映射这种写法既快又可读。# 按区域和品类分组同时算多个统计量 result df.groupby([region, category]).agg( total_amount(amount, sum), avg_amount(amount, mean), order_count(order_id, count), max_amount(amount, max) ).reset_index() # 透视表行是区域列是品类值是销售额合计 pivot pd.pivot_table( df, indexregion, columnscategory, valuesamount, aggfuncsum, fill_value0, # 空组合填 0避免图表出现断点 marginsTrue, # 增加总计行列 margins_name合计 )agg里用命名聚合total_amount(amount, sum)的好处是输出列名直接可读不用事后 rename。pivot_table的fill_value0很重要某些区域没有某品类销售时会产生 NaN画堆叠图时 NaN 会导致整段缺失填 0 才能让图表连续。marginsTrue自动加总计行省去手动 concat 的麻烦。如果数据超过百万行pivot_table内存占用会飙升这时候改用crosstab配合values参数或者先聚合再透视能省不少内存。注意groupby之后如果直接赋值新列可能触发SettingWithCopyWarning正确做法是聚合后reset_index()拿到新 DataFrame 再操作。4. 可视化落地matplotlib 与 seaborn 的图表产出清洗聚合完的数据最终要变成图。这份源码包的visualize.py里封装了趋势图、对比柱状图、相关性热力图三类常用图表每类都做了样式统一和中文显示处理。中文乱码是 matplotlib 最经典的坑下面先解决这个再看具体图表怎么调。4.1 中文显示与全局样式配置matplotlib 默认字体不含中文直接画图会显示成方框。不同操作系统的字体名称不一样源码包里用条件判断做了兼容。import matplotlib.pyplot as plt import matplotlib import platform # 根据操作系统选择中文字体 system platform.system() if system Windows: plt.rcParams[font.sans-serif] [SimHei] elif system Darwin: # macOS plt.rcParams[font.sans-serif] [Arial Unicode MS] else: # Linux plt.rcParams[font.sans-serif] [WenQuanYi Micro Hei] plt.rcParams[axes.unicode_minus] False # 解决负号显示为方块 plt.rcParams[figure.dpi] 120 # 提高默认分辨率 plt.rcParams[savefig.bbox] tight # 导出时自动裁剪白边axes.unicode_minus设成 False 是因为中文字体里的负号字形和 ASCII 负号冲突不关掉的话坐标轴上的负数会变成方块。savefig.bboxtight能在导出时自动去掉多余白边省得手动调subplots_adjust。如果 Linux 环境没装文泉驿字体用fc-list :langzh查一下系统里有哪些中文字体把名称填进去就行。4.2 趋势图与对比图的参数调优趋势图看时间变化对比图看类别差异两者的坐标轴处理和配色逻辑不同。源码包里把这两类图封装成了函数调用时传 DataFrame 和列名即可。import seaborn as sns def plot_trend(df, x_col, y_col, title): 绘制时间趋势折线图 fig, ax plt.subplots(figsize(10, 5)) sns.lineplot(datadf, xx_col, yy_col, markero, axax) ax.set_title(title, fontsize14) ax.set_xlabel(x_col) ax.set_ylabel(y_col) plt.xticks(rotation45) # 时间标签倾斜避免重叠 plt.tight_layout() fig.savefig(foutput/figures/{title}.png) plt.close(fig) # 及时释放内存批量画图必加 def plot_compare(df, x_col, y_col, hue_col, title): 绘制分组对比柱状图 fig, ax plt.subplots(figsize(10, 5)) sns.barplot(datadf, xx_col, yy_col, huehue_col, axax) ax.set_title(title, fontsize14) ax.legend(titlehue_col, bbox_to_anchor(1.02, 1), locupper left) plt.tight_layout() fig.savefig(foutput/figures/{title}.png) plt.close(fig)plt.close(fig)这行在批量出图时是必须的不关掉的话每张图都留在内存里画到几十张就会触发内存警告甚至崩溃。bbox_to_anchor把图例挪到绘图区外面避免遮挡数据。sns.lineplot的markero让每个数据点可见数据点少的时候比纯线条更直观。如果 x 轴是日期字符串记得先pd.to_datetime转成时间类型否则 matplotlib 会按字符串顺序排列出现 1月、10月、2月这种乱序。提示导出图片时如果发现文字被截断把savefig.bbox设成tight或手动调fig.subplots_adjust(bottom0.2)。5. 避坑与排查跑这份源码时我踩过的五个坑源码包能跑通不代表每次换数据都能顺利下面这五个问题是我在实际替换数据源时反复遇到的按“现象 → 原因 → 解决”整理出来你遇到类似报错可以直接对号入座。5.1 中文列名导致 KeyError现象代码里写df[销售额]报KeyError但打印df.columns明明有这个列名。原因是读取时列名带了不可见空格或 BOM 头肉眼看不出来。解决读完后统一执行df.columns df.columns.str.strip().str.replace(\ufeff, )把首尾空格和 BOM 字符清掉再操作。5.2 日期解析后类型仍是 object现象pd.to_datetime之后按月份分组结果报TypeError。原因是原始日期格式混杂比如2024-01-01和2024/01/01同时存在to_datetime推断失败后返回原字符串。解决加formatmixed参数pandas 2.0 以上支持或者先用pd.to_datetime(df[date], errorscoerce)把解析失败的变 NaT再检查有多少条失败记录。5.3 分组聚合结果列名丢失现象groupby().agg()之后想引用结果列发现列名变成了 MultiIndexresult[total]取不到。原因是多列聚合时 pandas 默认生成层次化列索引。解决用命名聚合total(amount, sum)直接指定输出列名或者聚合后执行result.columns [_.join(col) for col in result.columns]拍平。5.4 图表保存后空白现象savefig出来的图片是纯白但plt.show()能看到图。原因是先调了plt.show()再savefigshow 之后画布被清空。解决永远先savefig再show或者用面向对象写法拿到fig对象后直接fig.savefig()不依赖当前画布状态。5.5 大数据量下内存溢出现象读取几十万行 CSV 后执行透视表进程被系统杀掉。原因是pivot_table会生成中间宽表内存占用是原始数据的数倍。解决读取时用usecols只加载需要的列dtype指定数值列类型如float32代替float64透视前先groupby聚合到较小粒度再对聚合结果做透视。6. 进阶技巧把重复分析固化成可复用函数跑通单次分析之后真正省时间的是把清洗、聚合、出图三步固化成函数下次换数据只改路径。我一般会在config.py里维护一份列名映射因为不同数据源的列名经常不一致硬编码列名会让函数没法复用。# config.py 里维护列名映射换数据源只改这里 COLUMN_MAP { 订单编号: order_id, 销售金额: amount, 区域: region, 品类: category, 下单日期: order_date } # 通用清洗函数传入原始 df 返回标准列名的干净数据 def standardize(df, col_map): df df.rename(columnscol_map) df[order_date] pd.to_datetime(df[order_date], errorscoerce) df[amount] pd.to_numeric(df[amount], errorscoerce) df df.dropna(subset[order_date, amount]) # 关键字段缺失直接丢 return df这个standardize函数的好处是把列名适配和类型转换收在一处后面所有分析函数都假设输入是标准列名逻辑就干净了。dropna(subset[...])只对关键字段做删除其他列缺失保留比全表dropna温和得多。验证分析结果是否正确我习惯用“总量对账”这个笨办法清洗后的amount总和应该和原始数据去掉非法值后的总和一致差太多说明清洗逻辑误删了数据。再随机抽几条记录手动核对聚合结果确认分组维度没串。这套流程走下来基本能保证换数据源时不会出大错。从那以后我每次拿到新的数据源都强制先跑一遍列名映射和总量对账确认无误再往下做可视化。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑