拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于 Python 与 Pandas 的 COVID-19 数据实战作业全解析(Data-Science-For-Beginners 第 7 课)

基于 Python 与 Pandas 的 COVID-19 数据实战作业全解析Data-Science-For-Beginners 第 7 课【免费下载链接】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 课程 2-Working-With-Data/07-python 配套的 assignment.md 展开完整拆解COVID-19 传播建模与COVID-19 论文分析两大作业的全部任务与两个扩展目标并结合仓库内两个挑战笔记本的源码给出可直接运行的实现思路、关键代码与评分要点。读完本文你将掌握用 Pandas/NumPy 处理时序疫情数据、构建药物共现矩阵、用热图与弦图可视化、以及用正则表达式从非结构化文本中抽取剂量信息的完整实战方案。作业背景从课程挑战代码继续扩展本作业是 07-pythonPython 与 Pandas 库 一课的课后任务。课程通过两个挑战笔记本演示了如何处理结构化数据表格型疫情时间序列与非结构化数据科学论文摘要文本notebook-covidspread.ipynb建模 COVID-19 的疫情传播数据来自约翰斯·霍普金斯大学 CSSE仓库在 data/COVID/ 下提供本地副本time_series_covid19_confirmed_global.csv、time_series_covid19_deaths_global.csv、time_series_covid19_recovered_global.csv另有国家元数据 data/UID_ISO_FIPS_LookUp_Table.csv。notebook-papers.ipynb分析 CORD-19 科研论文数据集从摘要中统计药物与诊断的出现频次、构建共现矩阵并可视化。作业要求扩展挑战中开始编写的代码即先阅读并运行两个笔记本理解已有代码然后在其基础上完成更深层的数据分析任务。因此动手前建议先完整阅读这两个笔记本。第一部分COVID-19 传播建模这部分基于 notebook-covidspread.ipynb 的代码框架共 4 个任务围绕疫情时间序列的对比、相关性与病死率展开。0. 前置代码数据加载与国家子集构造笔记本中的核心前置代码值得先复现。数据加载既可从互联网读取也可直接使用仓库本地副本base_url ../../data/COVID/ # 本地副本也可指向网络源 infected pd.read_csv(base_url time_series_covid19_confirmed_global.csv) recovered pd.read_csv(base_url time_series_covid19_recovered_global.csv) deaths pd.read_csv(base_url time_series_covid19_deaths_global.csv)表格的行是国家/省份列是日期从1/22/20开始。笔记本中定义了一个mkframe函数把某个国家的三组数据合并成以日期为索引的 DataFrame并统一转为时间戳索引这是后续所有任务的基础def mkframe(country): df pd.DataFrame({ infected : infected.loc[country], recovered: recovered.loc[country], deaths : deaths.loc[country]}) df.index pd.to_datetime(df.index) return df df mkframe(US) df此外笔记本用df[infected].diff()计算每日新增感染数用于观察传播速度df[ninfected] df[infected].diff()这两个片段mkframe与diff是实现本部分全部 4 个任务的基础工具。任务 1绘制多国 R 曲线对比R基本再生数/有效再生数是衡量疫情传播速度的核心指标可以理解为每个感染者平均传染的人数。本任务要求将 56 个不同国家的 R 曲线画在同一个图或并排多个子图上做对比。实现思路基于笔记本的ninfected计算countries [US, Italy, Brazil, India, Russia, UK] for c in countries: d mkframe(c) d[ninfected] d[infected].diff() # 用 7 日滑动窗口平滑每日新增的剧烈波动 d[smooth] d[ninfected].rolling(7).mean() # 相邻两期新增的比值即传播因子近似刻画 R 的变化 d[R] d[smooth] / d[smooth].shift(1) plt.plot(d.index, d[R], labelc) plt.legend() plt.show()要点新增感染序列噪声很大先用rolling(7).mean()做 7 日滑动平均平滑再取相邻比值曲线更稳定、可比性更强单图对比适合展示趋势差异也可以使用plt.subplots()为每个国家单独画子图并排展示日志/线性坐标、图例与轴标签等细节会直接影响比较任务的可读性。从笔记本源码看其已经完成单国数据的组装与新增感染计算notebook-covidspread.ipynb 中mkframe与diff单元格本任务正是在此基础上扩展为多国循环与 R 的推算。任务 2死亡/康复与感染病例数的相关性本任务要求分析死亡人数、康复人数与感染病例数之间的相关关系。推荐的实现路径import numpy as np countries [US, Italy, Brazil] for c in countries: d mkframe(c) print(c, { corr(deaths, infected) : np.corrcoef(d[deaths], d[infected])[0, 1], corr(recovered, infected): np.corrcoef(d[recovered], d[infected])[0, 1], })分析要点由于感染、死亡、康复三者都是累积量随时间单调上升直接算相关系数往往都接近 1意义有限更有价值的做法是考察每日新增diff()后的序列之间、或滞后若干天后的相关性可配合散点图plt.scatter(d[infected], d[deaths])直观观察线性关系与异常点并用热图展示多个国家、多组指标间的相关矩阵。任务 3判断典型病程持续时间本任务要求通过视觉上关联感染率与死亡率曲线、寻找异常点推断一种典型疾病的持续时长从感染到死亡的天数并可能需要对比多个国家才能得出稳健结论。核心方法把死亡曲线按天数向后平移shift找到与感染曲线或新增感染曲线对齐最好的偏移量d mkframe(US) d[ninfected] d[infected].diff() d[ndeaths] d[deaths].diff() best_shift, best_corr 0, -1 for shift in range(1, 40): corr np.corrcoef(d[ninfected].iloc[shift:], d[ndeaths].iloc[:-shift] if shift else d[ndeaths])[0, 1] if corr best_corr: best_corr, best_shift corr, shift print(f最佳对齐偏移量约 {best_shift} 天相关系数 {best_corr:.3f})注意事项平移方向感染先于死亡出现因此通常将死亡序列向过去平移即用shift(-k)或截断比较不同国家的报告延迟、检测能力、人口结构会导致结果差异所以题目明确提示可能需要查看不同国家的数据平滑处理7 日滑动平均能显著提升相关性估计的稳定性曲线形态上的异常点如某一时段的死亡突增往往对应医疗资源挤兑或统计口径变化可作为深入讨论的素材。任务 4病死率及其随时间的变化本任务要求计算病死率CFRfatality rate并观察其随时间的变化且提示可能需要考虑疾病持续天数先对某个时间序列进行偏移再计算。基础公式为deaths / infected实现如下d mkframe(US) d[cfr_naive] d[deaths] / d[infected] d[cfr_naive].plot()但朴素病死率存在系统性偏差感染发生到死亡结局之间存在数天滞后直接用当日死亡除以当日累计感染会在疫情上升期低估病死率。改进方法正是作业强调的时间序列偏移shift_days best_shift # 复用任务 3 求得的病程天数 d[cfr_shifted] d[deaths] / d[infected].shift(shift_days)要点用向前偏移的累计感染作为分母使分母与分子的时间口径一致得到的病死率更接近真实水平观察病死率曲线的整体趋势与突变点如医疗系统承压期、治疗方案变化期并在最终报告中给出合理解释绘图时注意早期数据噪声大分子分母都很小可设置起始时间阈值或做滑动平均。第二部分COVID-19 论文分析这部分基于 notebook-papers.ipynb针对 CORD-19 论文数据集含metadata.csv与摘要字段做文本挖掘包含 2 个必做任务与 2 个扩展目标。注意仓库未随附论文数据集副本需要自行按课程说明获取metadata.csv笔记本中通过df[abstract]列访问摘要文本。任务 1构建药物共现矩阵本任务要求为不同药物构建共现矩阵co-occurrence matrix找出经常在同一篇摘要中同时被提及的药物组合。作业提示可直接修改用于构建药物与诊断共现矩阵的代码。笔记本中已经给出了药物 × 诊断共现矩阵的完整实现notebook-papers.ipynb其核心是逐篇摘要遍历 命中计数m np.zeros((len(medications), len(diagnosis))) for a in df[abstract]: x str(a).lower() for i, d in enumerate(diagnosis): if d in x: for j, me in enumerate(medications): if me in x: m[j, i] 1把该代码改造为药物 × 药物共现矩阵非常直接——外层遍历换为药物列表、内层只统计同篇摘要中成对药物是否同时出现n len(medications) m np.zeros((n, n)) for a in df[abstract]: x str(a).lower() hit [( me) in x for me in medications] for i in range(n): if not hit[i]: continue for j in range(i 1, n): # 只需上三角避免重复计数 if hit[j]: m[i, j] 1 m[j, i] 1 # 对称填充方便热图显示值得沿用的笔记本技巧源码中有明确注释说明单词前加空格再匹配统计 m而不是m否则chloroquine会被错误计入hydroxychloroquine内部先转小写str(x).lower()避免大小写不一致漏匹配强制str()转换摘要列存在缺失值时直接apply会报错str(x)可消除该问题笔记本建议读者尝试去掉str观察报错。任务 2用热图可视化共现矩阵在得到对称的共现矩阵后用seaborn.heatmap或matplotlib的imshow渲染热图可直接看出哪些药物组合共现频繁越亮/数值越大代表越常一起出现import seaborn as sns plt.figure(figsize(10, 8)) sns.heatmap(m, xticklabelsmedications, yticklabelsmedications, annotTrue, fmt.0f, cmapYlOrRd) plt.title(Medication Co-occurrence Matrix (same abstract)) plt.tight_layout() plt.show()解读方向对角线元素是各药物自身出现总次数可同时反映各药物的总体热度关注非对角线上的高值组合例如同属一套治疗方案如lopinavirritonavir常联合给药的药物会呈现明显的高共现可结合dfm df[medications]按列累加笔记本中有dfm.sum()的用法得到最热门药物列表作为解读共现矩阵的补充上下文。扩展目标 1用弦图可视化药物共现弦图Chord Diagram将共现关系表达为圆周节点之间的弧带带宽代表共现强度适合展示多对多的关联结构。作业建议使用 chord 库pip install chord。from chord import Chord # 输入为共现矩阵DataFrame 形式行列均为药物名 df_m pd.DataFrame(m, indexmedications, columnsmedications) Chord(df_m.values, df_m.index.tolist()).to_html(medication_chord.html)实现提示chord 库依赖 holoviews/bokeh 等渲染后端首次使用前按官方文档安装依赖若矩阵过大导致弦图拥挤可先过滤低共现阈值只保留共现次数超过阈值的药物对这与笔记本中 sankey 函数允许设置 threshold 的思路一致弦图适合用于报告中的关系总览热图则更适合精确读取数值两者可互补呈现。扩展目标 2用正则表达式提取药物剂量本任务要求使用正则表达式从摘要文本中提取不同药物的剂量例如从take 400mg of chloroquine daily中提取400mg并构建一个展示不同药物 → 不同剂量的 DataFrame。作业特别提示要关注文本中靠近药物名称的数值。实现方案import re def extract_dosages(abstract, drug): 在摘要中药物名称附近查找剂量数值如 400mg / 5 mg / 1000 mg/kg text str(abstract).lower() pattern r(\d(?:\.\d)?\s*(?:mg|mcg|g|kg|µg|ml|l|iu|units|mg/kg)\b) hits [] # 在药物名称前后各 40 个字符的窗口内查找剂量 for match in re.finditer(drug, text): start max(0, match.start() - 40) end min(len(text), match.end() 40) window text[start:end] hits.extend(re.findall(pattern, window)) return hits drug chloroquine dosages [] for a in df[abstract]: dosages.extend(extract_dosages(a, drug)) pd.DataFrame({drug: dosages})构建药物 × 剂量DataFrame 的完整流程records {} for med in medications: all_dosages [] for a in df[abstract]: all_dosages.extend(extract_dosages(a, med)) records[med] pd.Series(all_dosages).value_counts() df_dosages pd.DataFrame(records).fillna(0).astype(int) df_dosages.head(10)要点与陷阱窗口策略剂量数值必须靠近药物名才有意义作业特意提示这一点。实现上以药物名匹配位置为中心取一个文本窗口如前后 40 字符再在窗口内查找剂量模式可避免把摘要中无关的数值如病例数、样本量误判为剂量剂量单位模式常见单位包括mg、g、kg、mcg/µg、ml、iu、mg/kg等正则中应显式列出并用\b防止匹配400mgx之类的超集大小写与空白文本先lower()数值与单位之间允许 0 或多个空格去重与频次同一摘要内重复剂量可先set()去重再统计最终用value_counts()统计各药物各剂量档的出现频次方便回答某药最常用剂量是多少。评分标准与自检清单作业给出三级评分表Rubric用于自我评估完成质量等级要求优秀Exemplary所有任务均完成有图形化展示且解释清楚并至少完成两个扩展目标之一合格Adequate完成超过 5 个任务未尝试扩展目标或结果不够清晰需改进Needs Improvement完成少于 5 个但超过 3 个任务且可视化未能有效说明问题对照自检第一部分 4 个任务是否都给出了图形 文字解释而非仅贴代码第二部分 2 个必做任务共现矩阵 热图是否完成热图是否能直接读出哪对药物常共现是否至少尝试了弦图或剂量提取中的一项扩展目标结论是否有数据与图表支撑例如典型病程约 X 天需给出对齐偏移量与相关系数药物 AB 常联合需给出共现次数。相关仓库资源索引作业原文2-Working-With-Data/07-python/assignment.md课程讲义2-Working-With-Data/07-python/README.md挑战笔记本 1疫情传播notebook-covidspread.ipynb挑战笔记本 2论文分析notebook-papers.ipynb疫情数据本地副本data/COVID/time_series_covid19_confirmed_global.csv、data/COVID/time_series_covid19_deaths_global.csv、data/COVID/time_series_covid19_recovered_global.csv国家元数据data/UID_ISO_FIPS_LookUp_Table.csv通过本文的拆解与代码示例你可以直接在两个笔记本的基础上逐项完成作业第一部分掌握多国对比、相关性分析、时间序列平移对齐、病死率计算四类时序数据分析技能第二部分掌握词项计数、共现矩阵构建、热图/弦图可视化、正则剂量抽取四类文本挖掘技能——这套组合正是数据科学中结构化数据 非结构化数据处理的典型工作流。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门