尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Data-Science-For-Beginners 第 08 课实战:用 pandas 校验表单采集数据的质量问题并给出修复建议

Data-Science-For-Beginners 第 08 课实战:用 pandas 校验表单采集数据的质量问题并给出修复建议 Data-Science-For-Beginners 第 08 课实战用 pandas 校验表单采集数据的质量问题并给出修复建议【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners本篇技术指南围绕 Data-Science-For-Beginners 课程第 08 课Data Preparation数据准备的实战作业Evaluating Data from a Form评估表单采集的数据展开一位客户用一个小表单测试收集其客户群的基本信息并把采集结果交给你做数据校验。你将结合 form.csv 数据集、assignment 作业 Notebook 和第 08 课主 Notebook 中的 pandas 清洗技术诊断看起来错误的可视化的根因并给出让表单收集到准确、一致信息的具体改进建议。任务背景客户表单与采集数据按 assignment.md 描述的任务场景客户测试了一个 小表单用于收集客户群client-base的一些基础数据并把采集到的结果交给你做校验validate。你可以直接在浏览器中打开index.html页面查看这个表单长什么样。你拿到了一份 CSV 记录数据集里面包含表单的填写记录以及一些基础可视化。客户指出其中一些可视化看起来不对劲但他们不确定如何修复。作业要求在 assignment 作业 Notebook 中探索指令Instructions是运用本课第 08 课的技术针对表单给出建议使其能收集到准确且一致accurate and consistent的信息。先看一下表单本身的源码index.html它只有三个字段h1Please Fill out the Form (* required)/h1 *labelBirth Month/label input typetext br labelState/label input typetext br label forpetsDogs or Cats?/label select namepets idpets option valuedogsDog/option option valuecatsCats/option /select br buttonSubmit/button从源码结构看这个表单的设计本身就埋下了数据质量隐患Birth Month 是自由文本输入input typetext用户可以随意输入大小写和缩写State 同样是自由文本输入没有约束用户填写全名还是两字母缩写宠物下拉框的取值与展示文本不一致valuedogs但显示Dogvaluecats但显示Cats单复数不统一。再看客户提交的数据集 form.csv 全部 10 条记录列结构为birth_month,state,petbirth_monthstatepetJanuary空CatsJANCACatsSeptHawaiiDogjanuaryAKDogJulyRICatsSeptemberCaliforniaCatsAprilCADogJanuaryCaliforniaCatsNovemberFLDogDecemberFloridaCats一眼就能看出三类典型的数据质量问题与第 08 课 README 中总结的常见清洗目标格式不一致、缺失值、重复值一一对应。作业 Notebook 的运行方式assignment.ipynb爱沙尼亚语译文版见 translations/et/2-Working-With-Data/08-data-preparation/assignment.ipynb的代码流程非常简短核心步骤如下。第一步安装依赖Notebook 中以 Jupyter magic 命令执行pip install pandas pip install matplotlib第二步加载数据集并查看内容Notebook 原始路径../../data/form.csv是相对于 Notebook 所在目录2-Working-With-Data/08-data-preparation/的若在仓库根目录执行应改为data/form.csvimport pandas as pd import matplotlib.pyplot as plt # Loading the dataset path ../../data/form.csv # 仓库根目录下应使用 data/form.csv form_df pd.read_csv(path) print(form_df)注意pd.read_csv会把 CSV 中的空字段解析为NaN——第 1 行January 那条缺失的state在 DataFrame 中即为NaN这正是第 08 课讲解的缺失值用NaN/None表示的实际案例。第三步客户所说的可视化就是对两列做value_counts()柱状图form_df[state].value_counts().plot(kindbar); plt.show()form_df[birth_month].value_counts().plot(kindbar); plt.show()客户觉得图表看起来不对而作业的目标就是解释这种不对从何而来并给出解决方案。诊断为什么可视化看起来是错的问题的根源是同一个真实值在数据中以多种字符串形式出现即第 08 课 README 中Formaatimine格式化小节描述的格式不一致问题导致value_counts()把一个类别拆成了多个柱子birth_monthJanuary第 1、8 行、january第 4 行、JAN第 2 行实际是同一个 1 月却被统计为 3 个各出现 1 次的类别Sept第 3 行与September第 6 行同理被拆成两个类别。柱状图上出现 8 个几乎等高的矮柱完全掩盖了1 月其实是人数最多的月份这一真实分布。stateCA第 2、7 行与California第 6、8 行被算作两个州FL与Florida同理Hawaii是全名而AK、RI是缩写——同一份数据里混用了全名/缩写两套标准。pet表单下拉框显示Dog/Cats单复数不统一数据中Cats出现 6 次、Dog出现 4 次虽然不影响计数正确性但取值规范不一致。缺失值第 1 行state为空被读入为NaN在州分布统计中被静默丢弃value_counts默认不统计NaN客户无从得知有一条记录缺少州信息。重复值本数据集中不存在整行精确重复的记录但经过标准化后需要重新核查见下节。一句话结论可视化没有算错算的是脏类别。这正是第 08 课反复强调的观点——数据清洗策略删除、替换、标准化的方式应由数据本身的特征决定。修复方案应用第 08 课的清洗技术第 08 课主 notebook.ipynb 中Real-World Data Quality Checks真实世界数据质量检查一节给出了与本题直接对口的技术用映射表mapping标准化类别值、用isnull()检测缺失、用dropna()/fillna()处理缺失、用duplicated()/drop_duplicates()处理重复。下面给出一套可复制的完整修复代码。1. 标准化 birth_month大小写 缩写import pandas as pd form_df pd.read_csv(data/form.csv) # 月份标准化映射先小写再映射同时处理缩写 month_map { jan: January, january: January, feb: February, february: February, mar: March, march: March, apr: April, april: April, may: May, jun: June, june: June, jul: July, july: July, aug: August, august: August, sep: September, sept: September, september: September, oct: October, october: October, nov: November, november: November, dec: December, december: December, } form_df[birth_month_clean] form_df[birth_month].str.lower().map(month_map)这里的str.lower().map(mapping)手法与主 Notebook 中处理country列的代码一致先str.lower()归一化再map()到标准值。2. 标准化 state缩写 ↔ 全名统一到一套标准state_map { ak: AK, alaska: AK, ca: CA, california: CA, fl: FL, florida: FL, hawaii: HI, hi: HI, ri: RI, rhode island: RI, } form_df[state_clean] form_df[state].str.lower().str.strip().map(state_map)统一采用两字母 USPS 缩写作为标准值也可以反过来统一成全名关键是全数据集只用一套规范。3. 处理缺失的 state缺失值检测使用第 08 课讲到的isnull()返回布尔掩码随后按业务选择删除或填充# 检出缺失行 missing form_df[form_df[state_clean].isnull()] print(missing) # 只有 birth_monthJanuary 那一行缺 state # 方案 A删除缺失行数据量小、缺失比例高且无替代来源时常用 form_df_complete form_df.dropna(subset[state_clean]) # 方案 B填充占位值保留该行其他字段的信息 # form_df[state_clean] form_df[state_clean].fillna(Unknown)第 08 课 README 对此的表述是缺失数据既可用重新加载数据、用代码计算填补解决也可以直接连同该值一起删除——本例中客户没有州信息这一列的唯一来源删除或标Unknown都是合理选择需在结论中说明取舍理由。4. 标准化 pet 并核查重复值# 统一 pet 的单复数规范统一为小写单数 form_df[pet_clean] form_df[pet].str.lower().str.replace(s$, , regexTrue) # 标准化之后重新核查重复标准化前没有重复标准化后必须复查 print(form_df.duplicated(subset[birth_month_clean, state_clean, pet_clean]).sum()) # 如存在重复保留首条 form_df_unique form_df.drop_duplicates(subset[birth_month_clean, state_clean, pet_clean])需要强调duplicated()/drop_duplicates()必须放在标准化之后运行。因为January/january/JAN在标准化前互不重复如果先做重复检测会漏掉逻辑重复记录。5. 用清洗后的数据重做可视化form_df[birth_month_clean].value_counts().plot(kindbar); # 现在 January 正确显示为 3 次September含 Sept显示为 2 次重绘后的柱状图才能反映真实分布客户的图表错误问题也随之解决——错误从来不在value_counts的算法而在输入数据的类别规范。对表单本身的改进建议作业的核心交付物作业 Instructions 要求让表单收集到准确且一致的信息。结合上面诊断出的每类问题可以逐条对应到 index.html 的表单设计上Birth Month把自由文本改为下拉选择。用select列出 12 个月的标准名称或使用typemonth输入从源头杜绝JAN/january/January这类大小写与缩写混乱。State把自由文本改为州名下拉框且选项只采用一套命名规范全名或 USPS 缩写二选一如果业务上只需要部分州也可改为多选框。宠物选项统一 value 与展示文本。当前valuedogs显示Dog、valuecats显示Cats应统一为同一形式如 value 与文本都用单数dog/cat或都用复数保证用户看到的和系统存储的一致。必填约束state目前虽无* required标记数据中却出现了缺失。应给关键字段加上 HTMLrequired属性或提交前校验配合后端校验减少NaN的产生。在采集端做受控词表controlled vocabulary以上本质都是同一原则——凡是枚举型字段月份、州、宠物类型就不要让用户自由输入这是比事后清洗成本更低的前置数据准备。从主 Notebook Key Takeaways 的小结看这类建议背后还有几条工程原则可以写进交付结论清洗是迭代过程、决策要留痕记录每步清洗及理由以保证可复现性、永远保留原始脏数据副本、清洗结果另存为语义清晰的data_cleaned.csv而不是覆盖源文件。评分标准Rubric原 assignment.md 给出三档评分等级原文未附详细判分描述等级含义Exemplary优秀优秀Adequate合格合格Needs Improvement需改进需要改进对照本任务的验收要点优秀档的交付应同时包含对form.csv每类质量问题大小写/缩写不一致、缺失值、单复数不一致的具体定位与证据一套可运行的 pandas 标准化代码映射、isnull/dropna/fillna、drop_duplicates重绘后正确反映分布的可视化以及针对 index.html 表单设计的前置改进建议。延伸可复用的完整清洗管线第 08 课主 notebook.ipynb 的 Real-World Data Quality Checks 一节提供了比本作业更完整的清洗管线值得作为后续练习直接复用类别值标准化用value_counts()检查唯一值再用.str.lower().map(mapping)建映射表对拼写变体可用模糊匹配rapidfuzz 的fuzz.ratio相似度阈值辅助发现近似重复数值异常值检测先结合领域知识排除不可能值如年龄 0 或 120再用 IQRQ1 - 1.5*IQR到Q3 1.5*IQR区间和 Z-Score3 视为离群两种统计方法交叉验证近似重复行先str.strip().str.lower()归一化再做duplicated(subset..., keepFalse)比精确重复检测更能抓出John Smith这类空格差异完整管线函数clean_dataset(df)拷贝原数据 → 标准化类别列 → 把异常值置为NaN→ 归一化名称后drop_duplicates(keepfirst)并在前后打印行数、唯一类别数、非法值数量做对比验证。本作业数据集虽只有 10 行但它把脏数据 → 错误可视化的完整因果链压缩到了一个最小样例里是练习上述管线的理想入门材料。小结表单采集数据的错误可视化根因是同一真实值以JAN/january/January、CA/California等多种形式存储value_counts()把一类拆成了多类修复路径str.lower().map(mapping)标准化类别 →isnull()/dropna()/fillna()处理缺失 → 标准化后复查duplicated()→ 重绘可视化验证治本之策在采集端枚举型字段一律用受控下拉选择、统一 value 与展示文本、加必填校验所有清洗决策应记录理由并保留原始数据副本保证过程可复现、可审计。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表