新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python作业实战:从环境配置到数据清洗与可视化全流程记录

发布时间:2026/9/9 4:18:05来源:尧图网络
Python作业实战:从环境配置到数据清洗与可视化全流程记录
提到Python作业很多人的第一反应是我连环境都还没装好。这句话不是段子而是我拿到第二份Python作业时的真实状态。当时我的进度就是刚把Python 3.11装完对着命令行敲了一个python --version然后整个人就停在了题目面前。这份作业要求读取一份销售数据CSV完成数据清洗、统计分析和可视化最终输出分析结论。今天这篇就把我从环境配置到出图的完整过程记录下来尤其是那些教程里不会明说、但几乎人人都会踩的坑。正在写Python作业、或者想独立做完一个小型数据分析任务的朋友可以参考这套流程。1. 拿到作业题先别写代码先把需求拆成能动手的任务1.1 作业题的原貌要读文件、洗数据、算统计、画图表我拿到的那份作业题目其实并不复杂但第一眼看去还是有点唬人。资料包里有三个文件一份sales_data.csv销售数据、一份空的report.py脚本还有一个PDF文档。数据文件一共一千两百多行字段有六个订单编号、日期、产品类别、产品名称、销量、单价。题目的要求可以拆成四条清洗数据处理缺失值、重复记录、明显异常的数据统计各产品类别的销售总额以及各地区的订单数量绘制图表至少两张用来揭示销售趋势和品类结构输出分析结论写在代码注释和结果里说实话刚看到销售总额趋势这些词的时候我脑子里浮现的全是Excel透视表的画面完全不知道Python这边该用什么函数。更糟糕的是我当时的本能是打开浏览器搜Python 数据分析入门教程准备从头看起。看了大概半小时发现教程和作业的匹配度极低反而越来越焦虑。后来我强制自己关掉教程页把题目打印出来一句一句读才慢慢找到方向。1.2 把题目翻译成一张待办任务表我用的方法很笨但很有效拿一支笔把题目里的每个动词划出来再对应到Python里能完成这件事的工具。我给自己做了一张对照表题目要求Python对应的做法读取CSV文件pandas.read_csv()查看数据结构df.head()/df.info()处理缺失值df.dropna()/df.fillna()处理重复值df.drop_duplicates()筛选异常数据布尔索引 条件判断分类统计df.groupby().sum()/.count()绘制图表matplotlib.pyplot这张表做完之后原本模糊的作业立刻变成了六个步骤的小项目读取数据、数据体检、清洗、统计、画图、写结论。更重要的是我发现了这些步骤之间的依赖关系——清洗必须在统计之前读取必须在清洗之前画图必须等统计结果出来。这个依赖顺序决定了我的执行顺序也避免了做到一半发现前面数据没洗干净回头返工的情况。1.3 为什么我坚持先拆解再动手很多人写作业是打开文件直接开写遇到报错再回去翻文档这种做法不是不行但效率低。因为一旦写到最后发现逻辑有问题排查成本非常高。我自己的体会是拆解需求这件事至少有三个好处第一它逼着我把题目里每一个要求都过一遍不容易漏东西。比如题目里清洗后要保留处理依据这个隐藏要求就是我在逐句拆解时注意到的如果不拆直接写大概率会漏掉。第二它帮我确定了先做什么后做什么的顺序后面写代码时基本不用回退。我这次就是盯着任务清单一步一个脚印走每一步的输出正好是下一步的输入逻辑是接得上的。第三它让我在不知道该搜什么的时候能准确知道该搜什么。比如我一开始不知道分类求和在Python里怎么叫但我知道自己的需求是按类别加总一搜pandas 按列求和 分组就出来了。知道自己要什么搜索引擎才能帮上忙。提示作业和小项目一样需求理解占一半精力。拿到题目先别急着写代码花半小时拆解磨刀不误砍柴工。2. 环境准备Python装完之后必须验证的4件事2.1 PATH没配对一切白搭很多人卡在环境这一步我也是。当时下载Python安装包一路Next到那个选择界面时最下面有个Add Python to PATH的复选框默认是不勾的。我当时没多想直接点了Install Now装完之后在命令行敲python弹出一行python不是内部或外部命令人直接懵了。解决办法有两个我都试过最省事的方式卸载重装在安装向导里勾选Add Python to PATH不想重装的话手动把Python目录加进系统环境变量手动配置的路径大概是右键此电脑→属性→高级系统设置→环境变量→在系统变量里找到Path→编辑→新增两条路径。路径格式一般是C:\Users\你的用户名\AppData\Local\Programs\Python\Python311\和C:\Users\你的用户名\AppData\Local\Programs\Python\Python311\Scripts\版本号根据自己的安装版本写。配置完再开一个新的命令行窗口执行python --version如果能显示版本号说明安装成功并且PATH生效了。顺便验证一下pip --version因为后面所有库都要靠pip来装。2.2 venv虚拟环境让作业隔离在自己的文件夹里很多新手装完Python就直接pip install pandas装是能装上但我不建议这么做。作业也好小项目也好不同项目依赖的库版本可能不一样全堆在全局环境里总有一天会冲突。Python 3.3以后自带的venv模块可以很方便地解决这个问题。在作业目录里打开终端执行python -m venv venv然后激活虚拟环境Windowsvenv\Scripts\activatemacOS / Linuxsource venv/bin/activate激活之后命令行前面会出现一个(venv)的标记这时候再安装任何库都只装进这个虚拟环境里。我最初觉得这个步骤多余后来才发现这是Python项目最基础的规范之一。养成这个习惯之后后面做任何项目环境都不会互相污染出了问题直接把整个虚拟环境删掉重建就行。另外有一个细节容易被忽略激活虚拟环境之后pip list出来的库列表应该是很干净的只有几个基础包。如果发现一长串自己没装过的包多半是装到了全局环境说明虚拟环境没激活成功或者激活之后又换了终端窗口。2.3 第三方库下载慢先解决镜像源这次作业需要两个第三方库pandas负责数据处理matplotlib负责画图。安装命令非常简单pip install pandas matplotlib但问题紧接着就来了默认的PyPI源在国外下载速度慢得像蜗牛有时候还会超时报错。我当时第一次跑这个命令等了快五分钟还没下载完实在受不了直接取消了。解决办法是换成国内镜像源。最省事的方式是临时指定pip install pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple如果发现用镜像源还是很慢可能是网络环境的问题可以试试阿里云的镜像地址https://mirrors.aliyun.com/pypi/simple/两个都试过之后我最后稳定使用了清华的源。想要一劳永逸的话可以把镜像地址写进pip配置文件。Windows上路径是C:\Users\你的用户名\pip\pip.ini内容是[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host pypi.tuna.tsinghua.edu.cn配置好之后以后每次pip install都会自动走镜像源速度稳定多了。2.4 冒烟测试装完环境先跑一遍环境装完很多人直接就开始写作业代码我建议中间多做一个动作冒烟测试。就是先建一个空的Python脚本把要用的库全部导一遍并打印一下版本号import pandas as pd import matplotlib.pyplot as plt print(pd.__version__) print(环境正常)这一步花不了几秒钟却能把库缺了版本不兼容依赖冲突这一类问题提前暴露出来。我见过不少同学作业写到一半突然报ModuleNotFoundError: No module named pandas才回头发现当初根本没装成功或者装到了另一套Python环境里。前置的冒烟测试可以帮你把这类问题挡在开工之前。3. 数据清洗才是重头戏缺失、重复、异常值逐个击破3.1 数据体检读进来先看三样东西数据清洗不是一上来就删删改改而是先做一次数据体检搞清楚手里这份数据到底长什么样。我用pandas读入CSV之后第一时间打印了三样东西import pandas as pd df pd.read_csv(sales_data.csv, encodingutf-8) print(df.head()) print(df.info()) print(df.describe())head()用来检查前几行数据看字段名称是否正确、有没有表头错位、有没有奇怪的字符混进来。info()能显示每一列的数据类型以及非空值数量这一步能快速定位缺失情况。describe()则是对数值列做一个统计概览包括均值、最小值、最大值和分位数后面判断异常值的时候这些数字是非常关键的参照。我当时留意到一个细节读入日期列之后它的数据类型是object而不是datetime64。这意味着后面要对它做时间维度的分析时必须先做类型转换。这种问题不体检是发现不了的等到用的时候才报错又要回头查费时费力。3.2 缺失值先分清楚删还是填接下来是具体处理缺失值。先看每一列有多少缺失print(df.isnull().sum())我这份数据的输出大致是这个情况订单编号、日期、销量、单价各有几十个缺失备注列缺失得最多。这时候绝对不能一股脑全删也不能全部填充而是要根据每一列的作用单独判断。我当时定的原则是订单编号缺失这条记录连唯一标识都没有来源不可靠直接删日期缺失后面做趋势分析离不开时间字段缺失了就没法聚合直接删销量或单价缺失这两列是统计总额的核心数值缺失只能删不能凭空填一个数否则统计结果会失真备注缺失只是辅助说明文字用无填充不影响核心统计对应的代码df df.dropna(subset[订单编号, 日期, 销量, 单价]) df[备注] df[备注].fillna(无)这里有一个新手最容易纠结的问题什么时候用dropna什么时候用fillna我的判断依据就一句话——这一列在后面会被拿来做计算吗如果会缺失值的处理方式就会直接影响统计结果这种列不能含糊删了最稳妥如果只是辅助描述字段那就随便填不影响结果就行。核心计算字段缺失删非核心辅助字段缺失填。3.3 重复值小心别把正常数据误杀重复值处理看起来简单用drop_duplicates()一行就能搞定print(df.duplicated().sum()) df df.drop_duplicates()但我在这里多做了一个动作在删除之前先单独把重复值打印出来看了几眼确认它们不是不同订单但字段恰好相同的正常数据。比如同一个商品、同一个客户、同一天分别下了两单其他字段完全相同但订单编号是不同的这种就不算真正意义上的重复记录。这里要特别注意drop_duplicates()的默认行为它是按整行所有字段逐一比对如果订单编号不一样哪怕其他字段完全相同也不会被判定为重复。这个默认行为在大多数情况下是符合预期的但我见过一些同学为了更彻底地清理重复值手动指定了某些列作为判断依据结果把正常订单误删了。删数据之前先确认重复判定依据永远不是多此一举。3.4 异常值负数是错贵不一定是错异常值的处理是这次清洗里最需要思考的环节。我第一版代码长这样df df[(df[销量] 0) (df[单价] 0)]把销量和单价为负的记录全部删掉。销售数据里销量出现负数通常意味着退货冲抵记录单价出现负数基本就是录入错误这两类数据直接影响统计结果删除没毛病。但随后我又加了一层检查把单价特别高的那几行单独挑出来看print(df[df[单价] 5000])结果发现确实存在单价好几万的产品而且是真实订单不是脏数据。如果我只凭看起来大就把它当成异常值删掉统计出来的销售总额就会比真实值少一大截。所以异常值处理必须区分两种情况数值上不合理负数、超过某一明显错误阈值→ 直接删数值看起来很大但不违背业务常识 → 保留至于阈值怎么定我的做法是结合describe()输出的分位数来判断。如果某个值远超75%分位数的好几倍或者跟公认的业务常识矛盾再考虑是不是异常数据。这比闭着眼睛统一过滤要可靠得多。3.5 清洗过程要留痕别把自己洗晕清洗完整套之后我打印了一次数据规模print(清洗后数据行数, len(df)) print(df.isnull().sum())原始数据一千两百多条清洗后剩一千一百多条删减比例在合理范围内。如果删完只剩三四百条那大概率是清洗逻辑有问题把正常数据误伤了。我也是从这份作业开始养成了一个习惯每做一步数据变换都要记录这一步删了多少行、填了多少缺失值、为什么这么做。作业不一定要求交过程记录但自己心里必须有数。因为最后统计结果如果跟认知对不上能帮你回头排查的就是这些中间记录。就好比做菜的时候把每道工序都记下来菜咸了才知道回头加了多少盐。4. 分析与可视化让数据自己讲出结论4.1 加一个计算列再做分组汇总清洗完成之后第一步是加一个销售总额列df[销售总额] df[销量] * df[单价]这个列的公式很简单但一定要在清洗完成之后再计算。如果清洗之前就加那么后续删行改值的时候这个计算列也得跟着重新算非常容易漏。然后我按产品类别做聚合统计每个类别的销售总额并按从高到低排序category_sales df.groupby(产品类别)[销售总额].sum().sort_values(ascendingFalse) print(category_sales)输出的结果非常直观某一大类贡献了将近一半的销售额另外两个品类分列二三位。到这里题目里的各产品类别的销售总额已经完成了。地区订单量的统计则用的是count()region_orders df.groupby(地区)[订单编号].count() print(region_orders)注意这里用的是count()而不是sum()因为要数的是订单数量而不是把订单编号加起来。用错聚合函数是新手特别常见的错误sum()对文本型字段会直接报错对数值型字段则会算出一个毫无意义的数字。写聚合之前先问自己一句我要的是加总还是计数4.2 柱状图看品类对比折线图看月度趋势题目要求至少两张图我选了柱状图加折线图这个组合。柱状图适合对比不同产品类别的销售总额折线图适合展示时间维度的趋势变化。两者各有侧重正好满足题目里品类结构和销售趋势两个要求。柱状图代码import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False fig, ax plt.subplots(figsize(10, 6)) category_sales.plot(kindbar, axax, color#4C72B0) plt.title(各产品类别销售总额对比) plt.xlabel(产品类别) plt.ylabel(销售总额元) plt.xticks(rotation0) plt.tight_layout() plt.savefig(category_sales.png, dpi150) plt.show()折线图需要先处理日期。原始的日期列是字符串如果直接按它分组排序会按字符顺序而不是时间顺序结果会乱掉。正确做法是先转成时间类型再提取月份df[日期] pd.to_datetime(df[日期]) df[月份] df[日期].dt.to_period(M) monthly_sales df.groupby(月份)[销售总额].sum() fig, ax plt.subplots(figsize(10, 6)) monthly_sales.plot(kindline, markero, axax, color#C44E52) plt.title(月度销售总额趋势) plt.xlabel(月份) plt.ylabel(销售总额元) plt.grid(True, linestyle--, alpha0.5) plt.tight_layout() plt.savefig(monthly_sales.png, dpi150) plt.show()这里dt.to_period(M)的作用是把日期变成某年某月的周期对象这样groupby就是对每个月的销售额求和非常干净。如果忘了转类型groupby会直接把每个不同的日期当成独立的分组图表上会挤出一大堆点毫无趋势可言。4.3 中文方块问题两行配置解决第一次出图的时候我的所有标题和坐标轴文字全是小方块一个中文字都看不到。这是matplotlib默认字体不支持中文导致的属于几乎每个用Python画图的人都会踩的坑。解决办法是在绘图代码之前加两行配置plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False第一行指定中文字体为黑体第二行是让坐标轴的负号正常显示否则-也会被渲染成方块。两行必须一起写缺一不可。不同系统的中文字体名称不一样这一点也容易踩坑Windows一般用SimHeimacOS可以写成Arial Unicode MS或PingFang SCLinux通常用Noto Sans CJK SC。如果换了机器运行脚本这些字体名要跟着改否则还是会出方块。稳妥的做法是在脚本开头加一段检测逻辑先看看系统里有哪些可用字体再决定用哪个。我这次作业是在Windows上跑的直接就用了SimHei但在交作业之前特意在另一台电脑上验证过一遍。4.4 让图表会说话标记峰值与排序画图不是把数据机械地变成图形就结束了作业要求的是揭示趋势所以图形要能让看图的人一眼抓住重点。我做两个额外的处理一是把折线图里的最高点用annotate标注出来max_month monthly_sales.idxmax() plt.annotate(f峰值{max_month}, xy(max_month, monthly_sales.max()), xytext(max_month, monthly_sales.max() * 0.9), arrowpropsdict(arrowstyle-))这样不用自己解释看图的人马上就能知道哪个月销售额最高。二是调整柱状图的顺序。groupby默认按类别名称排序但柱状图按数值从高到低排列时对比效果才最直观。所以我用sort_values(ascendingFalse)先把数据排好再画图柱子的高度呈现平滑下降的形态一眼就能看出谁是贡献主力。这些细节谈不上高深技术但正是它们让图从能看变成能说明问题。作业评阅看重的是你对数据的理解而不是你用的配色有多花哨。5. 提交前自查和这次作业的复盘5.1 拿题目逐条打钩写完代码并不代表作业做完了提交之前我专门做了一次对照检查。把题目要求打印出来一条一条核对读取数据、处理缺失值和重复值已完成清洗前后行数有记录统计各产品类别销售总额已完成输出结果和图表一致统计各地区订单数量已完成结果已输出绘制两张以上图表已完成柱状图和折线图均已保存为PNG分析结论已完成在代码注释和报告文档里都写了这个步骤看起来笨但对作业场景非常有效。人的注意力是有限的写代码的时候很容易漏掉题目的隐藏要求。逐条核对是成本最低的保底手段。我自己就差点漏掉异常值处理要有说明这条如果没查肯定要被打回来改。5.2 相对路径的坑脚本换目录就报错这是一次非常典型的翻车经历。我最初在IDE里运行脚本一切正常后来为了提交作业我把整个文件夹复制到了另一个目录再运行脚本直接报错文件找不到。原因很简单代码里写的是相对路径sales_data.csv而Python脚本运行时相对路径是相对于当前工作目录的不是相对于脚本文件所在的位置。在IDE里运行没问题是因为IDE把当前工作目录默认设成了脚本所在目录。一旦换一个方式运行工作目录变了文件自然找不到了。稳妥的解决办法是在脚本开头把工作目录切换成脚本所在目录import os os.chdir(os.path.dirname(os.path.abspath(__file__)))这样不管脚本放在哪里只要CSV文件跟脚本放在同一个目录运行结果都是一样的。这段代码我后来一直沿用了再也没出过路径问题。5.3 报错排查流程和复盘心得这次作业过程中我遇到的报错加起来有十几次几乎都是ValueError、KeyError、TypeError这三类。一开始每次报错我都慌后来总结出一套排查套路报错类型常见原因排查顺序FileNotFoundError路径不对检查当前工作目录KeyError列名拼错或不存在打印df.columns核对ValueError数据类型不匹配打印df.dtypes检查TypeError对不兼容的类型做运算看报错最后一行ModuleNotFoundError库没装或装错环境检查虚拟环境激活状态排查思路很简单先看报错信息最后一行它会明确告诉你哪个文件哪一行出了什么问题再检查那一行用到的变量名或函数名核对拼写最后回到df.head()和df.dtypes检查数据结构。绝大部分问题都能在这三步之内解决。复盘整份作业我最大的收获不是学会了几个函数而是想明白了三件事第一写代码的顺序不能乱。读数据、清洗、分析、可视化这个顺序既是依赖顺序也是思考顺序。以前我喜欢先画图看到图好看就有成就感但那是本末倒置。图只是分析结果的呈现形式不是分析本身。第二报错不是失败是系统在告诉你下一步该往哪走。那些报错信息里其实藏着所有你需要的信息只是新手容易被吓住不敢细看。第三工具的熟练度是靠用出来的不是看教程看出来的。这份作业之前我看了不少入门课程视频里老师操作行云流水我一写就废。真正让我把groupby、dropna、to_datetime这些函数记到骨子里的不是视频而是这次作业里一遍遍的报错和修正。回头看看python作业2这个普普通通的题目标签背后其实藏着从学过语法到能用Python解决具体问题最重要的一段路。环境配置、数据清洗、分组统计、可视化出图这一套流程我相信任何一个认真完成作业的人都会走一遍。希望这篇记录能让你少走一点弯路尤其是我花了一整天才填平的那几个坑PATH没配好、镜像源太慢、中文字体变方块、相对路径翻车。这些坑早一天知道你就能早一天把精力花在真正有价值的分析和总结上。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Agent0:零数据自进化智能体如何实现工具集成推理与强化学习闭环 2026/9/9 5:00:08

Agent0:零数据自进化智能体如何实现工具集成推理与强化学习闭环

Agent0 所代表的“零数据自进化智能体”,在学术方向上针对的是大模型智能体研究里一个长期存在的瓶颈:高质量轨迹数据从哪里来。过去的主流做法是人工标注、调用大型闭源模型做数据蒸馏,或依赖大量专家示范。Agent0 的思路则是让智能体在没有…

阅读更多 →
Web自动化测试实战:Selenium从环境到CI全攻略 2026/9/9 5:00:08

Web自动化测试实战:Selenium从环境到CI全攻略

Selenium学了几年,从Selenium 1时代一路用到现在Selenium 4,很多朋友问我要入门路径,干脆把我自己从0到1落地一套Web自动化测试的经验完整写出来。这篇文章会从环境准备、脚本编写、框架设计一路讲到你真正能交付一套能上线跑的自动化用例&am…

阅读更多 →
FPGA编译时间优化实战:从13小时到5小时的完整路径 2026/9/9 5:00:08

FPGA编译时间优化实战:从13小时到5小时的完整路径

1. 13小时到底花在哪个环节:一次完整编译的时间解剖我先说一个真实的情况。之前做一个多通道高速数据采集项目,FPGA选的是Xilinx Kintex-7系列,逻辑规模大概在30万级LUT,跑一套完整的Vivado流程,综合加布局布线加生成比…

阅读更多 →
终端AI编程助手opencode完全上手:配置、Skills、LSP与实战踩坑 2026/9/9 5:00:08

终端AI编程助手opencode完全上手:配置、Skills、LSP与实战踩坑

最近后台私信里问 opencode 的特别多,十个里有七个都在问安装、配置模型、报错排查。我自己的主力终端里已经装了 opencode 三个月,日常改需求、接老项目、跑前端 bug 复现都用它,算是从“尝鲜”进入了“真用”阶段。这篇就把我自己的实操整理…

阅读更多 →
多Agent共享Skills:Claude Code与Codex统一管理方案 2026/9/9 5:00:08

多Agent共享Skills:Claude Code与Codex统一管理方案

如果你同时用 Claude Code、Codex 这类命令行 AI 编程工具,大概率遇到过这个尴尬:在 Claude Code 里精心调好的 Skills,换到 Codex 又得重新配一遍;或者团队里同一个项目维护两套 skills,改了一处忘了另一处&#xff0…

阅读更多 →
AI写作人化指南:从机味到人味,重建内容表达优先级 2026/9/9 4:57:08

AI写作人化指南:从机味到人味,重建内容表达优先级

我自己孵化的內容里,见的最多的就是写完初稿后一眼假:句子通顺,逻辑没问题,词汇也算丰富,但就是有一种说不出来的“机器感”。这种机器感在长文里特别容易被读者捕捉到,哪怕对方说不清楚哪不对,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞