Python疫情地图基于Pandas、Folium等库开发,整合公开疫情数据(如确诊、死亡、治愈病例),通过热力图、标记点等可视化形式,动态展示地区疫情分布与时间趋势,支持交互式筛选,可按国家/地区、时间范围查看数据,直观呈现疫情热点区域及变化规律,为公共卫生监测、政策制定及公众信息查询提供便捷的数据分析工具。
Python疫情地图:数据驱动的可视化与动态追踪实践
2020年新冠疫情爆发后,实时、直观的疫情数据可视化成为公众洞察疫情动态、政府制定防控策略的关键工具,Python凭借其强大的数据处理能力与丰富的可视化生态,成为构建疫情地图的核心技术栈,从静态病例分布图到动态传播趋势追踪,Python疫情地图不仅将抽象数据转化为可视化叙事,更在信息透明化与科学抗疫中发挥了不可替代的作用。
数据获取:疫情地图的"生命线"
高质量数据是疫情地图的基石,需兼顾时效性与权威性,主流数据来源包括:
- 全球数据集:约翰斯·霍普金斯大学(JHU)发布的全球疫情公开数据集(GitHub实时同步),覆盖国家/地区级确诊、死亡、治愈病例的每日时序数据;
- 国内数据源:国家卫健委、各省疾控中心官方通报,或第三方平台(如腾讯疫情、百度疫情)提供的API接口;
- 实时数据采集:通过爬虫技术动态抓取权威平台更新,例如使用
requests库调用API,或结合BeautifulSoup解析网页表格结构。
以JHU数据为例,其CSV格式数据集包含关键字段:Province_State(省/州)、Country_Region(国家/地区)、Date(日期)、Confirmed(确诊)、Deaths(死亡)、Recovered(治愈),通过pandas库可直接读取:
import pandas as pd url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv" df = pd.read_csv(url)
数据预处理需重点关注:缺失值填充/删除、地区名称标准化(如将"Hong Kong"统一为"中国香港")、日期格式转换,确保后续可视化分析的一致性。
数据处理与地理编码:数据"落地"的关键步骤
疫情地图的核心在于将疫情数据与地理空间关联,需通过地理编码(Geocoding)将地区名称转换为经纬度坐标,Python中geopy库是专业工具,支持Nominatim、Google Geocoding API等多种服务:
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="covid_map")
location = geolocator.geocode("北京市")
print(f"纬度: {location.latitude}, 经度: {location.longitude}") # 输出:39.9042, 116.4074
批量地理编码需优化性能,建议采用pandas.apply()结合异常处理:
def get_lat_lon(place):
try:
location = geolocator.geocode(place, timeout=5) # 设置超时避免阻塞
return (location.latitude, location.longitude) if location else (None, None)
except:
return (None, None)
df[['latitude', 'longitude']] = df['Province_State'].apply(get_lat_lon).apply(pd.Series)
数据聚合是另一关键环节,需按地区/日期维度计算累计值、新增值、治愈率等指标,
# 计算各省份累计确诊数
province_data = df.groupby(['Province_State', 'Date'])['Confirmed'].sum().reset_index()
# 计算日新增确诊(需先按日期排序)
province_data = province_data.sort_values(['Province_State', 'Date'])
province_data['Daily_New'] = province_data.groupby('Province_State')['Confirmed'].diff().fillna(0)
地图可视化:Python库的多元生态
Python提供多种地理可视化方案,可根据需求灵活选择:
Folium:轻量级交互式地图首选
基于Leaflet.js的Folium库,支持标记点、热力图、时间滑块等交互功能,适合动态疫情展示。
案例:省级累计确诊分布图
import folium
# 聚合数据并添加地理坐标
province_data = df.groupby('Province_State')['Confirmed'].max().reset_index()
province_data[['latitude', 'longitude']] = province_data['Province_State'].apply(get_lat_lon).apply(pd.Series)
# 创建中国中心地图
m = folium.Map(location=[35.8617, 104.1954], zoom_start=4, tiles='OpenStreetMap')
# 添加动态圆圈标记(半径与确诊数成正比)
for _, row in province_data.iterrows():
folium.Circle(
location=[row['latitude'], row['longitude']],
radius=row['Confirmed'] ** 0.5 * 50, # 对数缩放避免极端值
color='crimson',
fill=True,
fill_opacity=0.6,
popup=folium.Popup(f"{row['Province_State']}
确诊: {row['Confirmed']:,}例", max_width=200)
).add_to(m)
m.save("china_covid_static.html")
动态时间序列实现
通过folium.plugins.TimestampedGeoJson构建动态地图,展示疫情传播时序:
import folium.plugins as plugins
# 准备GeoJSON格式时序数据
features = []
for date in sorted(df['Date'].unique()):
date_data = df[df['Date'] == date].groupby('Province_State').agg({
'Confirmed': 'sum',
'latitude': 'first',
'longitude': 'first'
}).reset_index()
for _, row in date_data.iterrows():
features.append({
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [row['longitude'], row['latitude']]
},
"properties": {
"time": date,
"style": {"color": "red"},
"icon": "circle",
"iconstyle": {
"fillColor": "red",
"fillOpacity": 0.6,
"radius": min(row['Confirmed'] ** 0.5 * 10, 50)
},
"popup": f"{row['Province_State']}
确诊: {row['Confirmed']:,}例"
}
})
# 创建时间滑块地图
time_slider = plugins.TimestampedGeoJson(
{"type": "FeatureCollection", "features": features},
period="1D", # 每日更新
add_last_point=True,
auto_play=True
).add_to(m)
m.save("china_covid_dynamic.html")
进阶可视化方案
除Folium外,其他专业库可满足复杂需求: