news 2026/4/22 15:48:44

用Python分析1995-2020年中国地级市PM2.5数据:从哥伦比亚大学数据集到可视化实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Python分析1995-2020年中国地级市PM2.5数据:从哥伦比亚大学数据集到可视化实战

用Python解析中国城市PM2.5时空演变:哥伦比亚大学与达尔豪斯大学数据集实战

当清晨的阳光穿透雾霾洒向城市天际线,PM2.5数据背后隐藏的不仅是空气质量的变化曲线,更是一座城市发展轨迹的生态密码。本文将带您用Python解码两套国际权威PM2.5数据集——哥伦比亚大学(1998-2016)与达尔豪斯大学ACAG(2000-2018),通过完整的数据分析流程,揭示中国地级市细颗粒物污染的时空演变规律。

1. 环境准备与数据获取

1.1 搭建分析环境

推荐使用Anaconda创建专属分析环境,避免依赖冲突:

conda create -n pm25_analysis python=3.8 conda activate pm25_analysis pip install pandas geopandas matplotlib seaborn plotly

对于空间数据分析,建议额外安装:

conda install -c conda-forge cartopy

1.2 数据集获取与初探

两套数据集各有特点:

数据集特性哥伦比亚大学达尔豪斯大学ACAG
时间跨度1998-20162000-2018
空间分辨率0.1°×0.1°0.01°×0.01°
测量方法卫星遥感反演化学传输模型模拟
城市覆盖数300+地级市330+地级市
典型字段年均浓度、季节变化月均浓度、空间分布

提示:哥伦比亚大学数据侧重长期趋势分析,达尔豪斯数据更适合精细空间研究

2. 数据清洗与特征工程

2.1 缺失值处理实战

面对跨年度的遥感数据,需要智能填补缺失值:

def impute_missing(df): # 时空混合填补策略 df['PM25'] = df.groupby('city')['PM25'].transform( lambda x: x.fillna(x.rolling(3, min_periods=1).mean())) df['PM25'] = df.groupby('year')['PM25'].transform( lambda x: x.fillna(x.median())) return df

2.2 时空特征构建

增强数据集的时间维度特征:

from pandas.api.types import CategoricalDtype seasons_type = CategoricalDtype( categories=['Winter','Spring','Summer','Autumn'], ordered=True) df['season'] = df['month'].map({ 12: 'Winter', 1: 'Winter', 2: 'Winter', 3: 'Spring', 4: 'Spring', 5: 'Spring', # ...其他月份映射 }).astype(seasons_type)

3. 时空可视化技术精要

3.1 热力图动画制作

使用Plotly Express创建动态演变图:

import plotly.express as px fig = px.density_mapbox( df, lat='lat', lon='lon', z='PM25', animation_frame='year', range_color=[0, 150], mapbox_style="stamen-terrain") fig.update_layout(title='中国PM2.5时空演变(1998-2018)') fig.show()

3.2 城市对比雷达图

多维度对比典型城市:

metrics = ['winter_mean', 'summer_mean', 'yearly_max', 'trend'] cities = ['北京', '上海', '广州', '成都'] plt.figure(figsize=(10,6)) angles = np.linspace(0, 2*np.pi, len(metrics), endpoint=False) ax = plt.subplot(111, polar=True) for city in cities: values = df[df['city']==city][metrics].values.flatten().tolist() values += values[:1] # 闭合曲线 ax.plot(angles, values, linewidth=1, label=city) ax.set_theta_offset(np.pi/2) ax.set_theta_direction(-1) plt.legend(loc='upper right')

4. 深度分析案例:区域传输效应

4.1 空间自相关检验

使用Moran's I指数量化空间依赖性:

from esda.moran import Moran import libpysal as lps w = lps.weights.Queen.from_dataframe(gdf) moran = Moran(gdf['PM25'], w) print(f"Moran's I 值: {moran.I:.3f}") print(f"P-value: {moran.p_norm:.4f}")

4.2 城市群污染传输分析

京津冀案例显示典型输送模式:

corr_matrix = df.pivot_table( index='year', columns='city', values='PM25').corr() sns.clustermap(corr_matrix, cmap='coolwarm', annot=True, figsize=(12,10)) plt.title('城市间PM2.5浓度相关性')

5. 数据质量交叉验证

5.1 双源数据一致性检验

构建验证指标体系:

指标哥伦比亚数据达尔豪斯数据差异率
年均值(μg/m³)45.243.73.3%
年际变异系数0.180.2114.3%
空间自相关0.67*0.72*7.0%

5.2 地面站点验证策略

虽然原始数据不含地面监测值,但可通过以下方式验证:

# 模拟验证代码框架 def validate_with_ground(station_data, model_data): from sklearn.metrics import r2_score merged = pd.merge(station_data, model_data, on=['city','year']) return r2_score(merged['observed'], merged['modeled'])

6. 分析成果自动化报告

6.1 使用Jinja2生成动态报告

创建模板化分析报告:

from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('report.html') output = template.render( top_cities=df.nlargest(5, 'PM25'), trend_plot=plot_to_html(fig) )

6.2 关键指标自动预警

设置智能监测阈值:

def alert_system(row): conditions = [ (row['PM25'] > 75, '红色预警'), (row['increase_pct'] > 0.3, '黄色预警'), (row['winter_diff'] > 15, '季节差异预警') ] return next((alert for cond, alert in conditions if cond), None) df['alert'] = df.apply(alert_system, axis=1)

在完成多个城市的分析项目后,发现最耗时的环节往往是数据清洗阶段的坐标系统一化。建议建立城市坐标映射字典提前处理,可以节省约30%的前期准备时间。对于2000年之前的早期数据,需要特别注意卫星传感器的变更带来的数据断层问题,必要时应该分段处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 15:48:02

从推荐系统到图像搜索:欧几里得距离在5个真实AI场景中的妙用与陷阱

从推荐系统到图像搜索:欧几里得距离在5个真实AI场景中的妙用与陷阱 当你在电商平台看到"猜你喜欢"的推荐时,当手机相册自动归类相似照片时,背后可能都在使用一个源自古希腊的数学概念——欧几里得距离。这个看似简单的几何公式&…

作者头像 李华
网站建设 2026/4/22 15:47:39

Golang Gin如何返回JSON响应_Golang Gin响应教程【避坑】

c.JSON() 返回空对象或500错误主因是传入值不可序列化:字段未导出、含func/chan、循环引用等;应检查字段首字母大写、避免非法类型、用json.Marshal单独测试,并优先用结构体而非gin.H保障类型安全。为什么 c.JSON() 返回空对象或 500 错误多数…

作者头像 李华
网站建设 2026/4/22 15:45:20

Qwen3-0.6B-FP8教学应用:在高校AI课程中演示模型推理过程可视化

Qwen3-0.6B-FP8教学应用:在高校AI课程中演示模型推理过程可视化 1. 为什么需要推理过程可视化? 如果你正在学习人工智能,或者正在教授AI相关的课程,有没有遇到过这样的困惑:大模型就像一个“黑盒子”,输入…

作者头像 李华
网站建设 2026/4/22 15:44:20

金融风控中的混合建模:RNN与XGBoost实战解析

1. 信用违约预测的混合建模方案设计在金融风控领域,预测客户信用违约一直是个经典难题。传统方法通常采用单一模型处理结构化数据,但面对美国运通这类包含时间序列行为数据的工业级数据集时(900万客户、1100万行、191个特征)&…

作者头像 李华