ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Data-Science-For-Beginners 实战作业解析:用 Pandas 完成 COVID-19 疫情建模与医学论文文本挖掘

Data-Science-For-Beginners 实战作业解析:用 Pandas 完成 COVID-19 疫情建模与医学论文文本挖掘 Data-Science-For-Beginners 实战作业解析用 Pandas 完成 COVID-19 疫情建模与医学论文文本挖掘【免费下载链接】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 课程第 7 课《Working with Data: Python and the Pandas Library》的结课作业对应仓库 作业原文展开系统讲解两大实战任务COVID-19 疫情传播建模多国有效再生数 Rt曲线对比、感染/死亡/康复相关性分析、病死率演化计算与COVID-19 科学论文文本挖掘药物共现矩阵构建、热力图可视化、弦图与剂量提取两个延伸目标。读完本文你将掌握用 Pandas/NumPy/Matplotlib 处理时间序列与自由文本数据、实现滑动窗口统计、共现计数与正则提取的完整可复用方案并能直接运行到仓库提供的 notebook 与本地数据上完成作业验收。作业全景两大实战任务与验收标准作业要求在不脱离课程两个挑战notebook-covidspread.ipynb 与 notebook-papers.ipynb现有代码的基础上做深度延展共分两大部分、八个小项第一部分 · COVID-19 传播建模4 项任务多国 Rt曲线对比、死亡/康复与感染相关性、病程时长推断、病死率时间演化第二部分 · COVID-19 论文分析2 项核心任务 2 项延伸目标药物共现矩阵与热力图、弦图可视化延伸、正则提取药物剂量延伸。官方评分标准Rubric分为三档Exemplary示范级——所有任务完成并有图形化说明与解释且至少完成一个延伸目标Adequate合格级——完成 5 项以上任务未尝试延伸目标或结果不清晰Needs Improvement待改进——完成少于 5 项但多于 3 项任务且可视化无法帮助论证观点。这提示我们每一项任务不仅要跑出结果更要画成图、讲清楚。第一部分COVID-19 传播建模1.1 数据源与预处理课程 notebook 默认从约翰霍普金斯大学 CSSE 的在线仓库读取时间序列数据仓库同时在 data/COVID/ 目录下提供了三份离线副本推荐优先使用避免网络不可用time_series_covid19_confirmed_global.csv确诊time_series_covid19_recovered_global.csv康复time_series_covid19_deaths_global.csv死亡三份文件结构一致前四列为Province/State, Country/Region, Lat, Long元数据其余每一列对应一个日期如1/22/20值为该日期的累计数。人口数据来自 data/UID_ISO_FIPS_LookUp_Table.csv 的Population字段用于计算感染占比。做分析前需要完成四步预处理对应 notebook 第 919 号单元按国家聚合用groupby(Country/Region).sum()把中国、澳大利亚等按省份拆分的行合并为整国数据丢弃元数据列drop(columns[Lat,Long,Province/State])保留纯日期序列构造时间索引用pd.to_datetime把字符串列名转为DatetimeIndex封装为国家视图函数notebook 的mkframeimport numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams[figure.figsize] (10, 3) 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在此基础上派生三个关键列ninfected infected.diff()每日新增、ninfav ninfected.rolling(window7).mean()7 日滑动平均消除周报波动、pinfected infected * 100 / pop感染占比用于跨国公平对比。1.2 任务一多国 Rt曲线对比课程 notebook 给出了 Rt有效再生数的滑动窗口估计法取 8 天窗口用前 4 天新增感染之和除以后 4 天之和公式为Rt (It-7 It-6 It-5 It-4) / (It-3 It-2 It-1 It)其 Pandas 实现为rolling(8).apply(lambda x: x[4:].sum() / x[:4].sum())。当 Rt 1 时疫情趋向扩散因此参考线 1 是关键判据。注意数据里会出现inf除以 0与NaN窗口不足作图前须清理df[Rt] df[ninfected].rolling(8).apply(lambda x: x[4:].sum() / x[:4].sum()) Rt df[Rt].replace(np.inf, np.nan).fillna(methodpad) ax Rt[df.index 2020-05-01].plot() ax.set_ylim([0, 6]) # 只看 R0..6 区间突出差异 ax.axhline(1, linestyle--, colorred) # R1 为疫情消长分界线 plt.show()作业要求的提升点是多国对比。参考实现是把 56 个国家的 Rt曲线画在同一坐标系共用axhline(1)参考线便于横向比较或使用plt.subplots并排多图countries [US, Italy, Spain, Germany, Brazil, India] fig, ax plt.subplots(1, len(countries), figsize(18, 3)) for i, c in enumerate(countries): r compute_rt(mkframe(c)) # 复用上面的 Rt 计算 r[r.index 2020-06-01].plot(axax[i], titlec, ylim(0, 6)) ax[i].axhline(1, linestyle--, colorred) plt.tight_layout(); plt.show()输出后应能直观读出不同国家 Rt首次跌破 1 的时间点不同反映各国防控节奏与强度的差异。这是整份作业中最能体现可视化论证价值的任务。1.3 任务二死亡/康复与感染病例的相关性notebook 已演示用df[[infected,recovered,deaths]].plot()观察三者同轴趋势。作业要求进一步量化相关性可从两个层面展开数值相关用 Pandas 的corr()计算列间 Pearson 相关系数并检验死亡滞后于感染若干天后相关系数最大这一假设可视化将三者归一化除以各自峰值或取对数后叠加绘图观察滞后效应。死亡与感染之间通常存在稳定的时间滞后约为一个病程周期这正是任务三的线索。df mkframe(US) df[[infected, recovered, deaths]].plot() plt.show() # 定量相关性对累计数或每日新增均可 print(df[[infected, recovered, deaths]].corr()) # 平移 14 天后死亡与感染的相关性示意需在任务三确定最优滞后 lag 14 print(np.corrcoef(df[ninfected][lag:], df[deaths].diff()[lag:])[0, 1])1.4 任务三通过视觉相关推断典型病程时长病程多久是个开放式推断题。思路是如果从感染到死亡平均经历 D 天那么把死亡曲线向左平移 D 天或把感染曲线向右平移 D 天后两条曲线应出现最明显的形态吻合峰值对齐、拐点对齐。作业提示可多试几个国家寻找证据因为各国数据质量与报告口径不同可能只有部分国家能清晰呈现滞后。df mkframe(US) deaths_daily df[deaths].diff().rolling(7).mean() for lag in [7, 14, 21, 28]: plt.plot(df[ninfav].index[:-lag] if lag else df[ninfav].index, df[ninfav].values[:-lag] if lag else df[ninfav].values, labelfinfected (shift -{lag}d) if lag else infected) plt.plot(deaths_daily.index, deaths_daily.values * 20, labeldeaths ×20) # 缩放便于同轴比较 plt.legend(); plt.show()更严谨的做法是穷举滞后天数对每个lag计算感染新增与死亡新增的相关系数取相关系数最大或 RMSE 最小的lag作为病程估计。这个平移 相关的组合拳也是任务四的直接前置。1.5 任务四病死率及其随时间的变化病死率fatality rate的朴素定义是deaths / infected但它天然存在系统性低估今天死亡的人对应的是若干天前的感染者直接用同日累计数计算会偏低且随时间失真。作业提示的解法正是用任务三推断出的病程天数 D 做时间序列位移把死亡时间序列相对于感染序列平移 D 天后再计算比率。D 14 # 由任务三推断的病程天数示例值需自行论证 # 朴素病死率 naive_cfr df[deaths] / df[infected] # 校正病死率死亡(第 t 天) 对应 感染(第 t-D 天) adjusted_cfr df[deaths].iloc[D:] / df[infected].iloc[:-D].values plt.plot(naive_cfr.index, naive_cfr.values, labelnaive CFR) plt.plot(adjusted_cfr.index, adjusted_cfr.values, labelfCFR with {D}-day lag) plt.legend(); plt.show()分析要点绘制校正后的病死率随时间的曲线观察其是否随检测能力、医疗资源、病毒株变化而演化对多个国家重复该流程可将病死率曲线的形态差异与各国疫情阶段对应起来。完成时应说明 D 的取值依据来自任务三形成闭环论证。第二部分COVID-19 论文分析2.1 数据获取与文本特征构造本部分处理 CORD-19 科学论文数据集metadata.csv含论文元数据与摘要。注意仓库不提供该数据集的副本需按课程 README 指引自行下载数据量约 1GBnotebook 提示在线加载可能耗时约 5 分钟。加载后先做两件事把publish_time转为datetime并绘制直方图观察发表时间分布然后对摘要做关键词计数。notebook 采用预定义词表 子串计数的朴素文本挖掘分别维护药物清单与诊断清单遍历摘要统计每个词的出现次数并利用 Pandas 向量化apply生成新列medications [hydroxychloroquine, chloroquine, tocilizumab, remdesivir, azithromycin, lopinavir, ritonavir, dexamethasone, heparin, favipiravir, methylprednisolone] diagnosis [covid, sars, pneumonia, infection, diabetes, coronavirus, death] for m in medications: df[m] df[abstract].apply(lambda x: str(x).lower().count( m)) for d in diagnosis: df[d] df[abstract].apply(lambda x: str(x).lower().count( d))这里有一个极易踩的坑notebook 第 9 号单元专门强调匹配子串时必须在词首加空格否则chloroquine会误命中hydroxychloroquine的内部子串同时必须强制str(x)转换以规避缺失值报错。词表还可按月聚合groupby([index.year, index.month]).sum()绘制治疗策略随时间的演化趋势。2.2 任务一构建药物共现矩阵作业要求把课程中的药物-诊断共现矩阵改造成**药物-药物共现矩阵**统计任意两种药物在同一篇摘要中同时被提及的次数。核心是 NumPy 二维累加n len(medications) cooc np.zeros((n, n)) # cooc[i][j] 药物 i 与药物 j 同篇共现次数 for a in df[abstract]: x str(a).lower() hit [( m) in x for m in medications] # 该摘要是否提到每种药物 for i in range(n): if hit[i]: cooc[i, i] 1 # 对角元提及次数 for j in range(i 1, n): if hit[j]: cooc[i, j] 1 cooc[j, i] 1 # 对称填充注意与 notebook 中药物×诊断版本外层循环诊断、内层循环药物m[j, i] 1的结构差异药物-药物矩阵是对称方阵行与列都是同一份药物清单。结果解读非对角元大的药物对即为常被联合提及的组合如羟氯喹与阿奇霉素常出现在同一摘要中这可以反映临床联合用药方案或学术讨论热点。若把药物替换为诊断同一套代码即可生成诊断-诊断共现矩阵——作业明确允许这样做。2.3 任务二用热力图可视化共现矩阵notebook 对药物×诊断矩阵的热力图实现可直接迁移plt.imshow(m, interpolationnearest, cmaphot)配合set_xticks/yticks与set_xticklabels/yticklabels标注词表诊断标签旋转 90° 避免重叠plt.imshow(cooc, interpolationnearest, cmaphot) ax plt.gca() ax.set_yticks(range(n)); ax.set_yticklabels(medications) ax.set_xticks(range(n)) ax.set_xticklabels(medications, rotation90) plt.colorbar(labelco-occurrence count) plt.show()热力图应能一眼看出热点区块亮色区域配合np.unravel_index(np.argmax(cooc, axisNone), cooc.shape)输出最常共现的药物对。若觉得imshow刻度拥挤可改用seaborn.heatmap(cooc, annotTrue, fmt.0f)增加数值标注两者效果等价。2.4 延伸目标一chord 图可视化共现关系热力图适合整体观察但**弦图chord diagram**能更优雅地表达谁和谁相连、连接多强圆周上排列药物节点节点之间弧线宽度代表共现频次。作业推荐使用 PyPI 上的chord库pip install chord该库基于plotly或holoviews后端渲染交互式图表直接接收矩阵与标签即可成图# pip install chord from chord import Chord Chord(cooc, medications).to_html() # 输出交互式 HTML若希望完全复用课程代码栈也可仿照 notebook 第 28 号单元用plotly.graph_objects手工构造 Sankey 图go.Sankey需要节点列表、source/target 索引与边权重并设置阈值过滤弱连接——notebook 中的通用sankey(cat1, cat2, m, treshold, h1, h2)函数可直接改造成药物-药物版本。两条路线任选其一即可满足至少完成一个延伸目标的要求。2.5 延伸目标二用正则提取药物剂量第二个延伸目标是结构化信息抽取从自由文本如take 400mg of chloroquine daily中用正则表达式提取药物剂量如400mg并汇总成药物 × 剂量的 DataFrame。核心挑战是作业特别强调的数值必须与药名在文本上邻近——不能全文乱匹配否则会把无关的400归到错误的药名下。import re pat re.compile(r(\d(?:\.\d)?)\s*(mg|g|mcg|µg|gram|milligram), re.IGNORECASE) records [] for m in medications: for a in df[abstract]: x str(a).lower() # 找到药名出现位置仅在其前后 WINDOW 个字符内匹配剂量 start 0 while True: pos x.find(m, start) if pos -1: break window x[max(0, pos - 40): pos len(m) 40] for num, unit in pat.findall(window): records.append((m, f{num}{unit.lower()})) start pos 1 dose_df pd.DataFrame(records, columns[medication, dose]) dose_df[count] 1 dose_df dose_df.groupby([medication, dose]).size().reset_index(namecount) dose_df.sort_values([medication, count], ascending[True, False])窗口宽度示例 40 字符与剂量单位词表都可按需调整findall配合位置约束保证了数值邻近药名这一关键约束。产出表应能回答羟氯喹的常见剂量区间是多少、不同药物是否有代表性剂量模式。把unit统一转为mg如1g 1000mg可让跨单位比较更有意义。评分标准RubricExemplary示范级Adequate合格级Needs Improvement待改进全部任务完成图形化呈现并给出解释且完成两个延伸目标中的至少一个完成 5 项以上任务未尝试延伸目标或结果不清晰完成少于 5 项但多于 3 项任务可视化无法帮助论证观点对照该标准自查时请格外关注三件事其一图形化 解释是硬性要求——每个任务都应配图并在图中/文后说明结论尤其是多国 Rt对比、共现热力图这两处看点其二任务三与任务四之间存在依赖病程天数 D 是病死率校正的前提务必在文中明确 D 的取值依据其三两个延伸目标只需完成其一即可达到 Exemplary优先选择你更有把握的路线chord 库开箱即用正则方案则无需额外依赖。完成建议与运行前提运行环境作业代码依赖pandas、numpy、matplotlib延伸目标还需plotly/chord建议在 Jupyter Notebook 中逐单元执行。入门版 Pandas 概念Series 索引对齐、DataFrame 过滤、groupby聚合、apply、resample可参考 基础 notebook.ipynb 与课程 READMER 语言学习者可对照 R 版本 notebook 理解同一作业的等价实现。数据前提第一部分可直接使用仓库 data/COVID/ 的离线 CSV第二部分需自行获取 CORD-19metadata.csv仓库不包含该数据集首次加载约需数分钟。版本口径notebook 中的fillna(methodpad)为旧版 Pandas API新版可用fillna(methodffill)或ffill()替代其余代码在主流 Pandas 版本下均可直接运行。验收闭环对照上表 Rubric 逐项核对任务完成 → 可视化 → 文字解释并确保延伸目标chord 图或剂量 DataFrame出现在交付物中即可达到示范级评分。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表