中美疫情数据可视化源码拆包:20个文件全链路解析与避坑指南
简介这份资源面向数据分析初学者与可视化爱好者提供一套基于Python的中美疫情数据可视化分析完整源码可用于课程设计、练手项目或数据分析入门实践。压缩包共19个文件、约145KB包含7个HTML可视化页面、6个Python分析脚本、4个Excel数据表、1个CSV历史数据及1个说明文本覆盖数据读取、清洗、预测建模到网页图表展示的完整链路。内容涉及国内与全球疫情态势、中美对比、中国及美国未来14天新增预测等模块脚本与页面一一对应便于理解从原始数据到可视化结果的实现过程。目前已有296人学习下载适合希望掌握Python数据处理与HTML图表呈现、并需要可运行案例参考的读者。1. 中美疫情数据可视化源码拆包20 个文件里到底藏着什么拿到一个压缩包解压完第一件事不是急着跑代码而是先看目录结构。这个包一共 20 个文件7 个 HTML、6 个 Python 脚本、4 个 Excel、2 个说明文件、1 个 CSV外加一个upload.zip的原始壳。很多人看到「中美疫情数据可视化」这几个字第一反应是「是不是又要爬数据」其实不是——数据已经躺在China.xlsx、America.xlsx、world.xlsx、history.csv里了脚本干的是清洗、聚合、预测和出图。它解决的核心问题是把中美两国的累计确诊、新增趋势、省份维度、未来 14 天预测一次性做成能直接打开的 HTML 看板。适合谁适合正在做课程设计、想拿一份能跑通的数据分析项目练手的人也适合已经会pandas但不知道怎么把结果落到网页上的从业者。下面我按「先跑通、再拆解、最后避坑」的顺序把这份源码从头到尾过一遍。2. 环境准备与数据文件结构先让脚本认识你的目录2.1 Python 环境与依赖库的最小集合这份源码没有requirements.txt但根据脚本里的 import 和实际运行需要核心依赖就四个pandas、numpy、matplotlib、openpyxl。预测部分用的是sklearn的线性回归所以还要加一个scikit-learn。如果你用的是vscode python 环境配置建议直接建虚拟环境别往全局 site-packages 里塞。# 创建虚拟环境Python 3.8 以上都行 python -m venv venv # Windows 激活 venv\Scripts\activate # macOS / Linux 激活 source venv/bin/activate # 一次性装齐依赖 pip install pandas numpy matplotlib openpyxl scikit-learn逻辑说明pandas负责读 Excel 和 CSVnumpy做数值运算matplotlib出静态图openpyxl是pandas.read_excel的底层引擎不装会直接报ImportError。scikit-learn只在China_xz_predict.py和America_xz_predict.py里用到做的是最简单的线性回归拟合。参数上没有版本硬约束但pandas建议 1.3 以上否则read_excel对.xlsx的兼容性会出玄学问题。2.2 数据文件的字段与对应关系解压后根目录下会看到这些文件先别改名字脚本里全是硬编码路径文件名类型用途关键字段China.xlsxExcel中国全国逐日数据日期、累计确诊、新增China_province.xlsxExcel中国分省数据省份、累计、新增America.xlsxExcel美国全国逐日数据日期、累计确诊、新增world.xlsxExcel全球国家维度国家、累计、新增history.csvCSV历史时间序列date、country、confirmedChina——province.pyPython中国分省可视化读China_province.xlsxWorld.pyPython全球对比图读world.xlsxCompare.pyPython中美对比图读China.xlsxAmerica.xlsxpr.pyPython预测结果出图读预测中间结果China_xz_predict.pyPython中国 14 天预测线性回归America_xz_predict.pyPython美国 14 天预测线性回归注意China——province.py里用的是中文破折号「——」不是下划线复制文件名的时候别手抖。readme.txt里只写了文件清单没有写运行顺序这是这份源码第一个不友好的地方。2.3 运行顺序先预测再对比最后出 HTML很多人上来就双击index.html结果页面空白因为 HTML 里引用的图表还没生成。正确顺序是先跑China_xz_predict.py和America_xz_predict.py生成未来 14 天预测数据再跑Compare.py生成中美对比图跑China——province.py和World.py补充分省和全球维度最后跑pr.py把预测图落到 HTML 能引用的位置打开index.html或中美疫情对比.html查看。# 以 China_xz_predict.py 为例核心逻辑拆解 import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression # 读取中国疫情数据 df pd.read_excel(China.xlsx) # 把日期转成序号线性回归不能直接吃 datetime df[day_index] np.arange(len(df)) # 特征和标签 X df[[day_index]].values y df[新增].values # 拟合 model LinearRegression() model.fit(X, y) # 预测未来 14 天 future_days np.arange(len(df), len(df) 14).reshape(-1, 1) pred model.predict(future_days) print(pred)逻辑说明这里用day_index替代真实日期是因为LinearRegression只认数值。reshape(-1, 1)是把一维数组变成二维否则sklearn会报Expected 2D array。参数上future_days从len(df)开始保证预测区间紧接历史数据末尾。这个脚本没有做训练集/测试集拆分属于「能出图就行」的写法后面避坑章节会讲它的局限。3. 可视化脚本逐个拆从 Excel 到 HTML 的完整链路3.1 Compare.py中美对比图的双轴处理Compare.py的任务是把中国和美国的累计确诊放在同一张图里。难点在于两国数据量级差异大早期中国高、后期美国高单轴会压扁其中一条线。常见做法是用双 Y 轴或者取对数。import pandas as pd import matplotlib.pyplot as plt # 读数据 china pd.read_excel(China.xlsx) america pd.read_excel(America.xlsx) # 取累计确诊列假设列名是 累计确诊 china_cum china[累计确诊].values america_cum america[累计确诊].values # 双轴图 fig, ax1 plt.subplots(figsize(12, 6)) ax1.plot(china_cum, colorred, labelChina) ax1.set_ylabel(China Confirmed, colorred) ax2 ax1.twinx() ax2.plot(america_cum, colorblue, labelAmerica) ax2.set_ylabel(America Confirmed, colorblue) plt.title(China vs America COVID-19 Cumulative) fig.tight_layout() plt.savefig(compare.png, dpi150)逻辑说明ax1.twinx()创建共享 X 轴但独立 Y 轴的第二个坐标系这样两条线各用各的刻度不会被压扁。dpi150是输出分辨率低于 100 网页上会糊。tight_layout()防止 Y 轴标签被裁掉。这里没有写plt.show()因为脚本是在后台跑的直接存图给 HTML 用。3.2 China——province.py分省数据的聚合与排序分省脚本读的是China_province.xlsx字段是省份、累计、新增。要做的是按累计确诊降序排列取前 10 个省份画横向柱状图。import pandas as pd import matplotlib.pyplot as plt # 读分省数据 df pd.read_excel(China_province.xlsx) # 按累计确诊降序取前 10 top10 df.sort_values(累计, ascendingFalse).head(10) # 横向柱状图 plt.figure(figsize(10, 6)) plt.barh(top10[省份], top10[累计], colorsteelblue) plt.xlabel(Cumulative Confirmed) plt.title(Top 10 Provinces in China) plt.gca().invert_yaxis() # 让最高的省份在最上面 plt.tight_layout() plt.savefig(province_top10.png, dpi150)逻辑说明sort_values的ascendingFalse表示降序head(10)取前 10。barh是横向柱状图invert_yaxis()把 Y 轴翻转否则最高的柱子会跑到最下面读图反直觉。参数上figsize的宽高比按 10:6 给网页嵌入时不会变形。3.3 World.py 与 pr.py全球维度与预测图输出World.py读world.xlsx逻辑和分省类似只是把省份换成国家。pr.py比较特殊它不直接读原始 Excel而是读预测脚本生成的中间结果然后画未来 14 天的折线图。# pr.py 的核心片段 import pandas as pd import matplotlib.pyplot as plt # 读预测结果假设预测脚本存成了 predict_result.csv pred_df pd.read_csv(predict_result.csv) plt.figure(figsize(12, 6)) plt.plot(pred_df[date], pred_df[predicted], markero, linestyle--, colororange) plt.xlabel(Date) plt.ylabel(Predicted New Cases) plt.title(14-Day Prediction) plt.xticks(rotation45) plt.tight_layout() plt.savefig(prediction.png, dpi150)逻辑说明markero让每个预测点带圆点linestyle--用虚线区分预测和历史。rotation45防止日期标签重叠。这里的关键是predict_result.csv必须由预测脚本先生成否则pr.py会直接报FileNotFoundError。3.4 HTML 文件的角色图表容器与导航7 个 HTML 里index.html是入口中美疫情对比.html、国内疫情情况.html、全球疫情情况.html是三个主看板疫情预测分析.html、中国未来14天新增预测.html、美国未来14天新增预测.html是预测专题。它们本身不含数据只是用img标签引用 Python 生成的 PNG。所以如果你改了 Python 脚本的输出路径HTML 里的src也要同步改否则页面就是一堆裂图。4. 避坑与常见问题排查跑不通时先看这几条4.1 报错FileNotFoundError: China.xlsx现象脚本一运行就提示找不到 Excel 文件。原因脚本用的是相对路径而你的工作目录不是脚本所在目录。解决要么在终端里cd到脚本目录再运行要么在代码开头加import os; os.chdir(os.path.dirname(os.path.abspath(__file__)))。我一般会在每个脚本头部都加这一行省得来回切目录。4.2 中文列名读取后变成乱码现象df.columns打印出来是\u7d2f\u8ba1这种转义。原因Excel 文件编码和pandas默认读取方式不匹配或者文件本身是旧版.xls被强行改了后缀。解决先确认文件确实是.xlsx然后用pd.read_excel(China.xlsx, engineopenpyxl)显式指定引擎。如果还是乱码用 Excel 打开另存为一次选 UTF-8 编码的 CSV 再读。4.3 预测结果是一条直线现象未来 14 天预测图完全水平没有任何波动。原因China_xz_predict.py用的是线性回归而疫情新增数据本身是非线性的线性拟合在趋势拐点后会给出常数。解决这是算法选型问题不是代码 bug。想改善的话把LinearRegression换成PolynomialFeatures(degree2)做多项式回归或者直接用ARIMA。但要注意这份源码的定位是教学演示不是预测精度竞赛。4.4 HTML 打开后图表不显示现象浏览器里只有文字图片位置是裂图图标。原因PNG 文件还没生成或者 HTML 里的src路径和实际输出路径不一致。解决先按第 2.3 节的顺序把所有 Python 脚本跑一遍确认根目录下出现了compare.png、province_top10.png、prediction.png等文件。然后右键 HTML 用文本编辑器打开检查img src...里的文件名是否和实际一致。注意大小写Compare.png和compare.png在 Linux 下是两个文件。4.5sklearn安装后仍报ModuleNotFoundError现象pip install scikit-learn显示成功但import sklearn还是失败。原因虚拟环境没激活或者pip和python指向了不同的解释器。解决用python -m pip install scikit-learn代替直接pip install强制用当前 Python 解释器安装。装完用python -c import sklearn; print(sklearn.__version__)验证。5. 进阶技巧把静态图换成可交互看板5.1 用 Pyecharts 替换 Matplotlib 出图Matplotlib 出的是静态 PNG放大就糊而且不能 hover 看数值。如果你想让这份源码的展示效果上一个台阶可以把出图部分换成pyecharts直接生成交互式 HTML。from pyecharts.charts import Line from pyecharts import options as opts import pandas as pd df pd.read_excel(China.xlsx) x_data df[日期].astype(str).tolist() y_data df[新增].tolist() line ( Line() .add_xaxis(x_data) .add_yaxis(新增确诊, y_data, is_smoothTrue) .set_global_opts( title_optsopts.TitleOpts(title中国疫情新增趋势), datazoom_optsopts.DataZoomOpts(), # 底部缩放条 tooltip_optsopts.TooltipOpts(triggeraxis) # 鼠标悬停显示数值 ) ) line.render(china_trend.html)逻辑说明is_smoothTrue让折线平滑DataZoomOpts加底部缩放条TooltipOpts(triggeraxis)实现鼠标悬停显示同一天的所有数值。render直接输出独立 HTML不需要再嵌到原页面里。参数上x_data必须转成字符串否则pyecharts对Timestamp的处理会出问题。5.2 预测模型的替换方案与验证方法线性回归在这份源码里只是「能跑通」的级别。如果你想验证预测到底靠不靠谱可以做一个简单的回测用前 80% 的数据训练后 20% 做测试算 MAE。from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_absolute_error import numpy as np import pandas as pd df pd.read_excel(China.xlsx) df[day_index] np.arange(len(df)) X df[[day_index]].values y df[新增].values # 80% 训练20% 测试 split int(len(df) * 0.8) X_train, X_test X[:split], X[split:] y_train, y_test y[:split], y[split:] model LinearRegression() model.fit(X_train, y_train) pred model.predict(X_test) mae mean_absolute_error(y_test, pred) print(fMAE: {mae:.2f})逻辑说明split是切分点X_train和y_train是训练集X_test和y_test是测试集。mean_absolute_error算的是预测值和真实值的平均绝对误差数值越小越好。如果 MAE 大得离谱说明线性回归不适合这份数据换模型比调参更有效。5.3 一个我踩过的坑日期格式不统一China.xlsx里的日期是2020-01-01格式America.xlsx里可能是01/01/2020history.csv里又是2020/1/1。三个文件三种格式直接合并会报ValueError。我一般会写一个统一的清洗函数def parse_date(s): return pd.to_datetime(s, infer_datetime_formatTrue, errorscoerce)infer_datetime_formatTrue让 pandas 自己猜格式errorscoerce把解析失败的变成NaT避免整个脚本崩掉。从那以后我每次拿到多来源数据都强制先跑一遍日期格式检查确认df[date].dtype是datetime64[ns]再往下做。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

PyTorch入门必看:CNN卷积神经网络实现手写数字识别

PyTorch入门必看:CNN卷积神经网络实现手写数字识别

1. 第9讲到底讲了什么——先把这个“分水岭”看清楚 如果你是从零开始学PyTorch,前面几讲可能还算顺:线性模型、梯度下降、反向传播、逻辑回归,再到多维特征输入,每讲都是搭积木,改几行代码就能看到loss往下走。但到了…

2026/10/1 11:17:07 阅读更多 →
C++冒号用法全解析:单冒号与双冒号的实践指南

C++冒号用法全解析:单冒号与双冒号的实践指南

写了不少年C,我越来越觉得,C里最容易被低估的标点不是分号,也不是大括号,而是冒号。单冒号“:”和双冒号“::”看起来只差一个字符,实际用途隔了十万八千里。今天这篇C使用技巧系列第四篇,就把这两种冒号的…

2026/10/1 11:17:07 阅读更多 →
Flink与Dgraph集成实践:实时风控图数据的批量写入与调优

Flink与Dgraph集成实践:实时风控图数据的批量写入与调优

开工之前先交代一下背景。我最近在做一个实时风控图计算的项目,上游是Kafka里的用户行为事件流,下游需要把实时关系数据落到图数据库里供在线查询。早期调研过Neo4j、JanusGraph,最后选了Dgraph,原因后面会细说。而流处理引擎这边…

2026/10/1 11:17:07 阅读更多 →

最新新闻

论文摘要和正文怎么互相呼应?按五个对位点做方向一致性校验

论文摘要和正文怎么互相呼应?按五个对位点做方向一致性校验

摘要要交代的和正文是同一件事、同一个方向,而不是把正文按比例缩短。把研究问题、方法、结果方向、断言强度与量化口径这五个对位点逐一对齐,呼应关系就从「读起来像」落到「对得上」。知学术AIPaperGPT 采用自研模型,学术用语按规范约束&am…

2026/10/1 17:15:05 阅读更多 →
DeepSeek    LeetCode 200. 岛屿数量 Java实现

DeepSeek LeetCode 200. 岛屿数量 Java实现

LeetCode 200. 岛屿数量 题目描述 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 解法…

2026/10/1 17:15:05 阅读更多 →
企业级数据爬虫集工具实测,Bright Data凭什么成了我的首选

企业级数据爬虫集工具实测,Bright Data凭什么成了我的首选

最贵的不是模型,是数据 最近在折腾机器人训练数据(就是 VLA,视觉-语言-动作模型那种),我发现一个扎心的事实:最烧钱的不是模型和硬件,是训练数据,将近占到50%成本,多可怕…

2026/10/1 17:15:05 阅读更多 →
基于S7-200 PLC与组态王的矿井通风控制系统设计与调试

基于S7-200 PLC与组态王的矿井通风控制系统设计与调试

矿井通风系统是煤矿安全运行的生命线,这句话在矿上干了十年的人体会最深。井下瓦斯一旦积聚,温度湿度一上来,光靠自然通风根本顶不住。我前两年接手了一套基于S7-200 PLC和组态王的矿井通风控制改造项目,目标是实现主通风机的自动…

2026/10/1 17:15:05 阅读更多 →
因果图法:功能测试中的逻辑显微镜与AI时代质量标尺

因果图法:功能测试中的逻辑显微镜与AI时代质量标尺

1. 为什么因果图法在今天依然不可替代——它不是老古董,而是功能测试的“逻辑显微镜”你翻过测试用例设计教材,大概率见过“因果图法”四个字,旁边配着几个圆圈加箭头的示意图,底下写着“适用于输入条件存在约束关系的场景”。但说…

2026/10/1 17:15:05 阅读更多 →
第 25-3 篇:随机源纪律——内核 CSPRNG 与 k 复用灾难

第 25-3 篇:随机源纪律——内核 CSPRNG 与 k 复用灾难

上一篇:25-2《工具链实操:vllm_vqf_sign 的 genkey/sign/verify》| 下一篇:26-1《信任根与验签闭环:发布方 → 设备》 真机实测通过:本文实验已在 RK3588 板端实测完成(2026-09;方法…

2026/10/1 17:14:05 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →