资讯动态

Data-Science-For-Beginners 学习指南:Working with Data——从关系数据库到 Python 数据准备的完整实战

发布时间:2026/9/12 23:39:31 来源:尧图企业网站定制
Data-Science-For-Beginners 学习指南Working with Data——从关系数据库到 Python 数据准备的完整实战【免费下载链接】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 第二章「Working with Data」展开该章位于仓库 2-Working-With-Data/共包含四节循序渐进的课程关系数据库、非关系数据库、Python 与 Pandas 数据处理、数据准备与清洗。读完本文你将掌握表的建模与主外键概念、SQL 的 SELECT/WHERE/JOIN 查询、NoSQL 与文档数据库的实践方法、Pandas 中 Series/DataFrame 的核心操作以及缺失值与重复数据的处理策略并了解仓库内配套的示例数据SQLite 机场库、Cosmos DB 样例 JSON、COVID 数据集、表单 CSV如何落地这些技能。章节总览一条从存储到清洗的数据管线「Working with Data」对应仓库目录 2-Working-With-Data/其学习目标非常明确掌握在应用程序中管理、操作和利用数据的各种方法。四个子主题构成一条完整的数据处理链路关系数据库Relational Databases——理解表、主键、外键与 JOIN用 SQL 检索多表数据非关系数据库Non-relational Databases——认识电子表格与四类 NoSQL 存储并通过 Cosmos DB Emulator 实操文档数据库使用 Python 处理数据Working with Python——掌握 Pandas 的 Series、DataFrame 核心操作并用真实 COVID 数据完成挑战数据准备Preparing Data——用 Pandas 处理缺失值、重复数据等脏数据问题。这种编排反映了一个核心理念数据库擅长高效存储与查询而数据科学工作中大量的探索性分析、变换与可视化则需要借助 Python 这样更灵活的工具来完成。接下来我们逐一深入。一、关系数据库从一张表到多表建模1.1 一切始于表关系数据库的核心构件是表table其本质与电子表格一致行row存放具体数据列column描述数据的含义。以存储城市信息为例CityCountryTokyoJapanAtlantaUnited StatesAucklandNew Zealand列名City、Country描述所存数据的含义每一行则是一个城市的完整信息。这个朴素模型是理解关系数据库的起点。1.2 单表方案的局限当我们想在表中加入更多维度时单表方案会暴露出严重问题。以城市年度降雨量为例如果按每行一条降雨记录的方式存储CityCountryYearAmountTokyoJapan20201690TokyoJapan20191874TokyoJapan20181445城市名和国家被反复复制浪费存储且毫无必要——Tokyo 只有一个名字。若改用每年一列的方式CityCountry201820192020TokyoJapan144518741690AtlantaUnited States177911111683AucklandNew Zealand13869421176虽然避免了行重复但每新增一个年份就要修改表结构而且把年份当作列会让检索和计算变得笨拙。这正是需要多张表与关系relationship的原因通过拆分数据避免重复并在操作数据时获得更大灵活性。1.3 关系核心主键与外键拆分数据的第一步是为每个实体确定唯一标识。**主键Primary Key常缩写为 PK**是表中唯一标识某一行的值。虽然理论上可以用城市名这类自然值做主键但实践中几乎总应使用数字等自动生成的标识符——主键不应随业务数据变化而变化否则会破坏关系。大多数情况下主键是自动生成的数字。拆分后的cities表city_idCityCountry1TokyoJapan2AtlantaUnited States3AucklandNew Zealand随后建立rainfall表不再重复城市全部信息而是引用cities表的 idrainfall_idcity_idYearAmount11201814452120191874312020169042201817795220191111622020168373201813868320199429320201176rainfall表中的city_id列指向cities表的主键在关系数据库术语中称为外键Foreign Key常缩写为 FK——它是来自另一张表的主键本质上是一个引用或指针city_id 1即引用 Tokyo。补充说明本课中 id 与 primary key 互换使用。这些概念同样适用于后续课程将遇到的 PandasDataFrame——虽然 DataFrame 不使用 primary key 这一术语但行为上非常相似。1.4 SQL 检索SELECT 与 WHERE数据拆分到多张表后需要用结构化查询语言SQL把它们取回来。SQL 是关系数据库MySQL、SQL Server、Oracle 等的标准检索与修改语言。最基础的是SELECT ... FROM ...SELECT列出想看的列FROM列出来源表。显示全部城市名SELECT city FROM cities; -- Output: -- Tokyo -- Atlanta -- AucklandSQL 语法不区分大小写select与SELECT等价但表名、列名是否区分大小写取决于具体数据库。最佳实践是把所有内容都当作区分大小写来对待且约定俗成将 SQL 关键字全部大写。加WHERE子句实现过滤SELECT city FROM cities WHERE country New Zealand; -- Output: -- Auckland1.5 多表 JOIN把数据缝起来要把cities与rainfall两张表的数据合并需要执行JOIN在两张表之间建立一条接缝将两表中对应列的值匹配起来。本示例以rainfall.city_id匹配cities.city_id采用的连接类型是inner join——任何在另一张表中没有匹配行的记录都不会显示。由于每个城市都有降雨数据因此全部行都会返回。分两步检索 2019 年所有城市的降雨量。第一步先连接两张表SELECT cities.city, rainfall.amount FROM cities INNER JOIN rainfall ON cities.city_id rainfall.city_id第二步加上WHERE过滤出 2019 年SELECT cities.city, rainfall.amount FROM cities INNER JOIN rainfall ON cities.city_id rainfall.city_id WHERE rainfall.year 2019 -- Output -- city | amount -- -------- | ------ -- Tokyo | 1874 -- Atlanta | 1111 -- Auckland | 942小结关系数据库的核心思想是把信息分散到多张表中需要展示或分析时再通过连接把它们合并回来从而在计算与数据操作上获得高度灵活性。1.6 实战作业用 SQLite 查询机场数据仓库在 2-Working-With-Data/05-relational-databases/airports.db 提供了一个基于 SQLite 的机场数据库文件配套作业见 assignment.md。该库包含两张表Citiesid (PK, integer)city (text)country (text)Airportsid (PK, integer)name (text)code (text)city_id (FK to id inCities)由于一些城市可能有多个机场所以拆成两张表练习的核心正是 JOIN。可在 Visual Studio Code 中安装 SQLite 扩展通过SQLite: Open database打开airports.db用SQLite: New query新建查询窗口以Ctl-Shift-QMac 为Cmd-Shift-Q执行 SQL。需要完成的查询包括查询Cities表全部城市名、查询爱尔兰全部城市、查询全部机场名称及其所在城市与国家、查询英国伦敦的全部机场。这套练习能把上述主外键与 JOIN 知识直接落地。二、非关系数据库电子表格与四类 NoSQL数据并不局限于关系数据库。本节聚焦非关系数据覆盖电子表格基础和 NoSQL 两大主题。2.1 电子表格工作簿、工作表与单元格电子表格因上手门槛低而广受欢迎。以 Microsoft Excel 为例一个工作簿workbook包含一个或多个工作表worksheet工作表由标签页标识表内的矩形称为单元格cell即行与列的交叉点——列用字母标记、行用数字标记部分表格会在前几行放表头来描述数据含义。仓库中提供了两个真实范例文件CocaColaCo.xlsx用于Soda Profits作业要求计算 FY15~18 的毛利润Gross Profit Net Operating revenues − Cost of goods sold并用AVERAGE 函数计算全部毛利润的平均值InventoryExample.xltm一个含 Inventory List、Inventory Pick List、Bin Lookup 三个工作表的库存示例用于讲解公式与函数——**公式formula**以等号开头对单元格数据执行运算如用 QTY × COST 计算库存价值**函数function**则是预定义公式如SUM需要按特定顺序传入参数才能得到正确结果。2.2 NoSQL 四大家族NoSQL 是非关系数据存储方式的统称可理解为 non-SQL、non-relational 或 not only SQL。常见分类有四类键值存储Key-value将唯一键与对应值配对底层通常借助哈希表与合适的哈希函数实现图数据库Graph用节点node与边edge描述数据之间的关系——节点代表现实世界中的实体如学生、银行账单边代表实体间的关系节点与边都可带属性列族存储Columnar与关系结构类似按行列组织但每一列被划分为列族column family同一列族下的数据作为整体被检索和更新文档存储Document在键值存储概念上扩展由一系列字段field与对象值object value组成下一节将详细展开。2.3 文档数据库实战Cosmos DB EmulatorCosmos DB 完全符合 Not Only SQL 的定义——它的文档数据库恰恰依赖 SQL 查询数据因此上一节学到的 SQL 基础可以直接迁移使用。其Emulator允许在本地创建和探索文档数据库。文档是字段与对象值的集合字段描述对象值代表什么。一个典型文档如下示例数据保存在 PersonsData.json以及从 Twitter API 抓取后存入的推文数据 TwitterData.json{ firstname: Eva, age: 44, id: 8c74a315-aebf-4a16-bb38-2430a9896ce5, _rid: bHwDAPQz8s0BAAAAAAAAAA, _self: dbs/bHwDAA/colls/bHwDAPQz8s0/docs/bHwDAPQz8s0BAAAAAAAAAA/, _etag: \00000000-0000-0000-9f95-010a691e01d7\, _attachments: attachments/, _ts: 1630544034 }我们关注的是firstname、id、age这些业务字段其余带下划线的字段由 Cosmos DB 自动生成。Emulator 操作要点启动后点击 Start with Sample 生成名为 SampleDB 的示例库其中含Persons容器container存放文档集合可在 Items 下浏览四个文档点击 SQL Query 按钮即可运行查询——SELECT * FROM c返回容器内全部文档SELECT * FROM c where c.age 40返回年龄小于 40 的文档。这与关系数据库的 SQL 体验几乎一致只是作用对象从表变成了文档集合。挑战任务将 TwitterData.json 上传到一个新建的独立容器新容器按钮 → 选择 SampleDB → 设置 partition key 为/id→ 用Upload Item上传再尝试用LIKE关键字找出text字段包含 Microsoft 的文档。大多数 API 返回的 JSON 数据可以直接存入文档数据库这正是文档模型在现代数据工程中被广泛使用的原因。三、使用 Python 与 Pandas 处理数据数据库能高效存储和查询但最灵活的数据处理方式是编写自己的程序。数据科学中最常用的语言是Python通用、易上手、库生态庞大、R专为统计处理设计的工具箱与Julia面向高性能科学计算。本节聚焦 Python。3.1 核心库与导入方式处理表格数据最常用的两个库Pandas操作DataFrame类似关系表具命名列可对行、列与整体做丰富操作Numpy处理张量多维数组类型统一、数学操作更多、开销更小。此外还有可视化库Matplotlib和科学计算库SciPy。标准导入写法import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import ... # 按需指定所需子包3.2 Series带索引的值序列Series是一系列值与列表或 numpy 数组类似但带有索引index——运算时会考虑索引对齐。索引可以是默认的整数行号也可以是日期区间等复杂结构。完整代码见配套笔记本 notebook.ipynb。以冰淇淋店日销量分析为例先生成时间序列start_date Jan 1, 2020 end_date Mar 31, 2020 idx pd.date_range(start_date, end_date) print(fLength of index is {len(idx)}) items_sold pd.Series(np.random.randint(25, 50, sizelen(idx)), indexidx) items_sold.plot()每周派对额外准备 10 盒冰淇淋用周频索引构建另一个 Seriesadditional_items pd.Series(10, indexpd.date_range(start_date, end_date, freqW))两个 Series 相加时必须用add(..., fill_value0)而不是total_items items_sold.add(additional_items, fill_value0) total_items.plot()原因在于additional_items在多数索引点上没有值缺失值直接用会得到大量NaNNot a Number——任何数与NaN相加结果都是NaN。时间序列还可以按不同时间间隔重采样resample例如按月计算平均销量monthly total_items.resample(1M).mean() ax monthly.plot(kindbar)3.3 DataFrame同索引 Series 的集合DataFrame 本质上是共享同一索引的一组 Series。既可以把 Series 作为行合并pd.DataFrame([a, b])也可以作为列并用字典命名pd.DataFrame({A: a, B: b})还可以转置得到相同布局df pd.DataFrame([a, b]).T.rename(columns{0: A, 1: B})其中.T表示转置行列互换rename用于重命名列。基于此 DataFrame本课演示了 Pandas 最核心的几类操作列选择df[A]返回一个 Seriesdf[[B,A]]返回列子集的 DataFrame行过滤df[df[A] 5]仅保留满足条件的行。其机制是df[A] 5返回布尔 Series再用布尔 Series 作索引筛选。注意不能写df[df[A]5 and df[A]7]必须用运算符并加括号df[(df[A]5) (df[A]7)]新建计算列df[DivA] df[A] - df[A].mean()计算 A 相对均值的偏离。但直接df[LenB] len(df[B])是错误写法——它把整个 Series 的长度赋给了所有行正确做法是使用applydf[LenB] df[B].apply(lambda x: len(x)) # 或 df[LenB] df[B].apply(len)按序号选行df.iloc[:5]取前 5 行分组聚合类似 Excel 透视表。按LenB分组求均值df.groupby(byLenB)[[A, DivA]].mean()同时求组内个数与均值可用aggregatedf.groupby(byLenB) \ .aggregate({DivA: len, A: lambda x: x.mean()}) \ .rename(columns{DivA: Count, A: Mean})3.4 读取数据、打印与绘图Pandas 读取 CSV 只需一行df pd.read_csv(file.csv)。探索大 DataFrame 时常用df.head()查看前几行在 Jupyter Notebook 中会以表格形式美观呈现plot函数可通过kind参数支持多种图形类型更复杂的图形则可直接使用 Matplotlib。3.5 实战挑战分析 COVID 数据挑战 1——COVID 传播建模使用约翰斯·霍普金斯大学 CSSE 提供的各国感染人数数据完整示例见 notebook-covidspread.ipynb从顶部逐格阅读并执行。配套作业 assignment.md 要求进一步绘制 5~6 个国家的有效传染数 Rₜ 对比图、分析死亡/治愈与感染数的相关性、通过视觉对比推断病程时长、计算病死率及其随时间的变化。挑战 2——COVID 论文分析CORD-19 数据集收录了数千篇 COVID 论文含元数据、摘要约半数有全文。简化版分析示例见 notebook-papers.ipynb。作业要求构建药物共现矩阵并热力图可视化进阶目标是用正则表达式抽取剂量如 take 400mg of chloroquine daily 中的400mg并构建药物-剂量 DataFrame。非结构化数据文本和图像这类非结构化数据需要通过提取步骤转成结构化形式如从文本提取关键词、用神经网络识别图像中的对象、从视频流获取人物情绪再套用前述 Pandas 处理流程。最有用的建议当你不确定如何用 Python 完成某类数据处理时先在互联网上搜索——Stack Overflow 上通常有大量针对常见任务的现成代码片段。四、数据准备让脏数据变得可分析原始数据往往存在不一致会干扰分析与建模即所谓的脏数据。本节的完整演示见 notebook.ipynb。4.1 为什么清洗如此重要易用与可复用数据组织规范、标准化后更易检索、使用和分享一致性数据科学常需合并多个来源的数据集统一各数据集的标准化规范才能保证合并后仍然可用模型准确性清洗后的数据能提升依赖它的模型的准确率。常见的清洗目标包括探索数据集用查询、可视化、抽样发现需清理之处、格式化解决空白字符、日期、数据类型等不一致不同国家对日期和数字的表示标准可能不同、去重重复会带来不准确结果但合并数据集中的重复也可能携带额外信息需保留、以及缺失数据处理。4.2 快速摸清 DataFrameinfo / head / tail面对 6 万行 400 列的数据先用 Pandas 内建工具快速掌握整体情况。本课用经典的鸢尾花Iris数据集演示import pandas as pd from sklearn.datasets import load_iris iris load_iris() iris_df pd.DataFrame(datairis[data], columnsiris[feature_names])iris_df.info()打印内容摘要150 个条目、4 列、无空值、全部为 float64 类型iris_df.head()查看前 5 行iris_df.tail()查看最后 5 行。仅凭这些元信息就能立刻对数据集的规模、形状与内容形成直观印象。4.3 处理缺失数据Pandas 用两种值表示缺失NaNIEEE 浮点规范中的特殊值仅表示缺失的浮点值和 Python 的None用于非浮点缺失值。两者各有限制但合起来覆盖了绝大多数场景。检测缺失值isnull()与notnull()返回布尔掩码import numpy as np example1 pd.Series([0, np.nan, , None]) example1.isnull() # 0 False # 1 True # 2 False # 3 True注意0是合法整数不算缺失是字符串对象也不算缺失。布尔掩码可以直接作为 Series/DataFrame 的索引来定位缺失或存在的值。删除缺失值dropna()直接移除缺失值。对 Seriesexample1 example1.dropna()DataFrame 有两个维度删除方式更丰富。默认dropna()删除包含任一空值的整行dropna(axiscolumns)删除含空值的整列how参数控制删除条件默认howany可设howall只删全空的行/列thresh参数则精细控制——保留非空值数量达到阈值的行/列example2.dropna(axisrows, thresh3)填充缺失值fillna()返回缺失值被替换后的副本。可以填统一值如0、前向填充methodffill用上一个有效值填充、后向填充methodbfill用下一个有效值回填DataFrame 还可指定axis方向。注意前向填充时若前方无可用值空值会保留example3.fillna(0) example3.fillna(methodffill) example3.fillna(methodbfill) example2.fillna(methodffill, axis1)取用哪种策略删除、替换、如何替换应由数据的具体情况决定没有放之四海皆准的方案。4.4 去除重复数据duplicated()返回布尔掩码标记某行是否为前面行的重复drop_duplicates()返回删除重复后的副本。两者默认考虑全部列也可指定列子集example4 pd.DataFrame({letters: [A,B] * 2 [B], numbers: [1, 2, 1, 3, 3]}) example4.duplicated() # 0 False # 1 False # 2 True # 3 False # 4 True example4.drop_duplicates() example4.drop_duplicates([letters])重复数据会改变分析结果并带来不准确结论去除重复是几乎所有数据科学项目的必经步骤。实战作业仓库提供了一份表单收集的 CSV 记录 data/form.csv 及其可视化问题描述作业见 assignment.md可配合 assignment.ipynb 与表单页面 index.html 实践运用本节技术诊断表单数据采集的准确性与一致性。五、章节配套资源与学习路径建议围绕第二章仓库还提供了可直接复用的数据与延伸材料示例数据除上述文件外data/ 目录还汇集了 COVID 时间序列、鸟类观测、糖尿病、蜂蜜、蘑菇、出租车等 CSV/TSV 数据集可配合各节练习使用手绘笔记Sketchnotessketchnotes/05-RelationalData.png、sketchnotes/06-NoSQL.png、sketchnotes/07-WorkWithPython.png、sketchnotes/08-DataPreparation.png 为四节课提供了可快速回顾的可视化笔记进阶路径第四章「4-Data-Science-Lifecycle/15-analyzing」的数据探索课程与本章的数据准备互为补充建议按章节顺序学习先建立数据存储与操作的基础再进入分析与建模环节。结语从关系数据库的表建模、主外键与 JOIN到 NoSQL 的电子表格与四类文档/键值/图/列族存储再到 Pandas 的 Series/DataFrame 操作与数据清洗策略「Working with Data」章节完整覆盖了数据科学工作流中获取与准备的关键环节。学完本章你应该能够用 SQL 在多表之间检索关联数据、在本地 Emulator 中探索文档数据库、用 Pandas 灵活完成表格数据的变换与可视化并有策略地处理缺失值与重复数据——这些能力将直接支撑你在后续章节中开展探索性分析与建模。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价