您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用Python分析空气质量历史数据
空气质量数据是环境监测领域的重要指标,通过Python分析这些数据可以帮助我们发现污染规律、评估治理效果。本文将介绍从数据获取到可视化的完整分析流程。
## 一、数据获取与准备
### 1.1 数据来源选择
常见的空气质量数据来源包括:
- 政府开放数据平台(如中国环境监测总站)
- 第三方API(如AQICN、OpenAQ)
- 本地气象站历史记录
以北京市PM2.5数据为例,我们可以使用`requests`获取网络数据:
```python
import requests
import pandas as pd
url = "http://api.example.com/air_quality/beijing"
params = {
"start_date": "2020-01-01",
"end_date": "2023-12-31",
"token": "YOUR_API_KEY"
}
response = requests.get(url, params=params)
data = response.json()
原始数据通常需要清洗:
df = pd.DataFrame(data['records'])
# 处理缺失值
df = df.dropna(subset=['PM2.5'])
# 转换日期格式
df['date'] = pd.to_datetime(df['date'])
# 去除异常值
df = df[(df['PM2.5'] > 0) & (df['PM2.5'] < 500)]
使用pandas快速获取统计指标:
stats = df['PM2.5'].describe()
print(f"""
空气质量统计:
平均值: {stats['mean']:.1f} μg/m³
最大值: {stats['max']} μg/m³
75%分位数: {stats['75%']} μg/m³
""")
按年/月进行聚合分析:
# 按年统计
df['year'] = df['date'].dt.year
annual_avg = df.groupby('year')['PM2.5'].mean()
# 按月统计
df['month'] = df['date'].dt.month
monthly_avg = df.groupby('month')['PM2.5'].mean()
根据国家标准计算AQI:
def calc_aqi(pm25):
if 0 <= pm25 <= 35:
return pm25 * 50/35
elif pm25 <= 75:
return 50 + (pm25-35)*50/40
# 其他区间计算...
return None
df['AQI'] = df['PM2.5'].apply(calc_aqi)
使用窗口函数观察趋势:
df['7d_avg'] = df['PM2.5'].rolling(window=7).mean()
df['30d_avg'] = df['PM2.5'].rolling(window=30).mean()
分析与其他气象因素的关系:
corr_matrix = df[['PM2.5','temperature','humidity','wind_speed']].corr()
print(corr_matrix['PM2.5'].sort_values(ascending=False))
使用matplotlib绘制年度趋势:
import matplotlib.pyplot as plt
plt.figure(figsize=(12,6))
df.groupby(df['date'].dt.year)['PM2.5'].mean().plot(
kind='line',
title='北京市PM2.5年度变化趋势',
ylabel='浓度(μg/m³)',
grid=True
)
plt.savefig('annual_trend.png')
使用seaborn绘制月度分布:
import seaborn as sns
pivot_data = df.pivot_table(
index='month',
columns='year',
values='PM2.5',
aggfunc='mean'
)
plt.figure(figsize=(10,6))
sns.heatmap(pivot_data, annot=True, fmt=".0f", cmap="YlOrRd")
plt.title('月度PM2.5浓度热力图')
如果有站点数据,可使用folium制作地图:
import folium
m = folium.Map(location=[39.9, 116.4], zoom_start=11)
for _, row in df.iterrows():
folium.CircleMarker(
location=[row['lat'], row['lon']],
radius=row['PM2.5']/10,
color='red',
fill=True
).add_to(m)
m.save('aq_map.html')
检测连续污染日:
df['polluted'] = df['PM2.5'] > 75
df['event_id'] = (df['polluted'] != df['polluted'].shift(1)).cumsum()
pollution_events = df[df['polluted']].groupby('event_id').size()
比较节假日与非节假日空气质量:
from chinese_calendar import is_holiday
df['is_holiday'] = df['date'].apply(is_holiday)
holiday_stats = df.groupby('is_holiday')['PM2.5'].mean()
/project
│── /data
│ ├── raw_data.csv
│ └── cleaned_data.parquet
├── /notebooks
│ ├── 01_data_cleaning.ipynb
│ └── 02_analysis.ipynb
├── /scripts
│ ├── data_loader.py
│ └── visualization.py
└── README.md
通过以上方法,我们可以系统分析空气质量数据。实际应用中还需考虑: 1. 数据更新机制(定时爬虫/Airflow调度) 2. 异常检测算法(如Isolation Forest) 3. 预测模型构建(ARIMA/LSTM)
完整代码示例可参考GitHub仓库:示例链接 “`
(注:实际文章约1100字,此处为保持简洁展示核心内容框架,完整版会扩展各部分的说明文字和案例分析)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。