python疫情地图

admin 101 0
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外,其他专业库可满足复杂需求:

  • Plotly:支持3D地球、 choropleth(分级统计图),适合多维度指标展示;
  • Kepler.gl:基于Uber的流线型可视化框架,处理亿级点位数据;
  • Pydeck:基于Deck.gl的3D地理可视化库,适合

    标签: #疫情 #地图