概述
中国五大城市PM2.5数据分析
- 前言
- 一、关于数据集
- 1.数据集是5个CSV文件
- 2.对于每一个数据集而言有这些属性
- 3.如何衡量污染状态
- 4.数据准备
- 5.处理方法
- 二、分析五城市污染状态
- 三、五城市每个区空气质量的月度差异
- 四、统计每个城市每天的平均PM2.5的数值
- 五、基于天数对比中国环保部和美国驻华大使馆统计的污染状态
- 六、全代码
前言
老师给我们提供了5个数据文件,对应记录着5个城市的从2010年1月1日到2015年12月31日的逐小时的部分与空气质量相关的指标数据。
我们需要完成以下4个任务:
1.分析五城市污染状态
2.五城市每个区空气质量的月度差异
3.统计每个城市每天的平均PM2.5的数值
4.基于天数对比中国环保部和美国驻华大使馆统计的污染状态
一、关于数据集
1.数据集是5个CSV文件
BeijingPM20100101_20151231.csv
ChengduPM20100101_20151231.csv
GuangzhouPM20100101_20151231.csv
ShanghaiPM20100101_20151231.csv
ShenyangPM20100101_20151231.csv
2.对于每一个数据集而言有这些属性
No:记录编号,整型
year:年份,整型
month:月份,整型
day:日期,整型
hour:小时,整型
season:季度,整型
PM2.5:中国环保部发布的PM2.5指数(ug/m3),浮点型
PM_US:美国驻华大使馆发布的PM2.5指数(ug/m3),浮点型
DEWP:露点温度(摄氏度)
TEMP:温度(摄氏度)
HUMI:湿度(%)
PRES:气压(hpa)
cbwd:合成风向
Iws:合成风速(m/s)
Precipitation:每小时降水量(mm)
Iprec:累积降水量(mm)
3.如何衡量污染状态
首先找到相关的标准文件
中华人民共和国生态环境部 环境空气质量指数(AQI)技术规定(试行)
这里我们做了一个不是很合理的假设–PM2.5是首要污染物,即令AQI = IAQI(PM2.5)
我们使用空气质量分指数IAQI中的PM2.5数值高低来衡量污染状态,从以上文件中分为六个区间:
等级 | 污染程度 | 区间 |
---|---|---|
level_1 | 优(excellent) | PM2.5 <= 50 |
level_2 | 良(good) | 50 < PM2.5 <= 100 |
level_3 | 轻度污染(light) | 100 < PM2.5 <= 150 |
level_4 | 中度污染(medium) | 150 < PM2.5 <= 200 |
level_5 | 重度污染(heavy) | 200 < PM2.5 <= 300 |
level_6 | 严重污染(serious) | PM2.5 > 300 |
这5个城市都有至少2个监测点,我们用每个监测点的PM2.5来衡量这个区的AQI,用每个城市各个区PM2.5的平均值衡量这个城市的AQI
4.数据准备
对每个城市而言分析方法是一样的,即对于每个城市,我们需要该城市每个小时的各个区的PM2.5数据。
# 公共列
common_cols = ['year', 'month', 'day', 'hour']
# 5个城市
citys = ['beijing', 'chengdu', 'guangzhou', 'shanghai', 'shenyang']
# 数据集部分属性
data_config_dict = {
'beijing': ('data/BeijingPM20100101_20151231.csv', ['PM_Dongsi', 'PM_Dongsihuan', 'PM_Nongzhanguan'], '北京'),
'chengdu': ('data/ChengduPM20100101_20151231.csv', ['PM_Caotangsi', 'PM_Shahepu'], '成都'),
'guangzhou': ('data/GuangzhouPM20100101_20151231.csv', ['PM_City Station', 'PM_5th Middle School'], '广州'),
'shanghai': ('data/ShanghaiPM20100101_20151231.csv', ['PM_Jingan', 'PM_Xuhui'], '上海'),
'shenyang': ('data/ShenyangPM20100101_20151231.csv', ['PM_Taiyuanjie', 'PM_Xiaoheyan'], '沈阳')
}
filepath = data_config_dict[city][0]
districts = data_config_dict[city][1]
city_name = data_config_dict[city][2]
data = pd.read_csv(filepath, usecols=common_cols + districts)
5.处理方法
在处理数据的时候可以先准备好一个城市的各个区的PM2.5数据,在把数据传入我们实现写好的函数中处理,实现代码复用。
def pct_pol_level(data_arr):
level_1 = data_arr[data_arr <= 50].shape[0]
level_2 = data_arr[data_arr <= 100].shape[0]
level_3 = data_arr[(100 < data_arr) & (data_arr <= 150)].shape[0]
level_4 = data_arr[(150 < data_arr) & (data_arr <= 200)].shape[0]
level_5 = data_arr[(200 < data_arr) & (data_arr <= 300)].shape[0]
level_6 = data_arr[data_arr > 300].shape[0]
levels = np.array([level_1, level_2, level_3, level_4, level_5, level_6])
print(levels)
result = levels / np.sum(levels)
print(result)
return result
二、分析五城市污染状态
# 分析五城市污染状态
# size 是该城市的各空气质量等级对应天数占比列表
size = pct_pol_level(data[districts].mean(axis=1))
# 通过饼状图可视化
ax1.pie(size, explode=explode, labels=level_label,autopct='%1.2f%%',radius=1.1,labeldistance=1.05,startangle=90)
三、五城市每个区空气质量的月度差异
group = data.groupby(data['month'])[districts]
group.mean().plot(ax=ax2)
ax2.set_ylabel('PM2.5')
ax2.set_title('月度指数')
四、统计每个城市每天的平均PM2.5的数值
df[city] = data.groupby(by=["year", "month", "day"])[districts].mean().mean(axis=1)
五、基于天数对比中国环保部和美国驻华大使馆统计的污染状态
data["PM_US Post"] = pd.read_csv(filepath, usecols=['PM_US Post'])
group = data.groupby(by=['year', 'month', 'day'])
Y1 = pct_pol_level(group[districts].mean().mean(axis=1))
Y2 = pct_pol_level(group['PM_US Post'].mean())
X = np.arange(6)
ax4 = ax3.twinx()
width = 0.45
bar1 = ax3.bar(X - width / 2, Y1, width=width, alpha=0.8, color='r', label="中国")
bar2 = ax4.bar(X + width / 2, Y2, width=width, alpha=0.8, color='g', label="美国")
ax3.legend((bar1, bar2), ('中国', '美国'), loc='upper right')
plt.title('中美对比')
plt.xticks(X, labels=level_label)
六、全代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
# 指定数据集路径
from matplotlib import gridspec
dataset_path = './data'
# 结果保存路径
output_path = './output'
if not os.path.exists(output_path):
os.mkdir(output_path)
# 公共列
common_cols = ['year', 'month', 'day', 'hour']
# 5个城市
citys = ['beijing', 'chengdu', 'guangzhou', 'shanghai', 'shenyang']
# 数据集部分属性
data_config_dict = {
'beijing': ('data/BeijingPM20100101_20151231.csv', ['PM_Dongsi', 'PM_Dongsihuan', 'PM_Nongzhanguan'], '北京'),
'chengdu': ('data/ChengduPM20100101_20151231.csv', ['PM_Caotangsi', 'PM_Shahepu'], '成都'),
'guangzhou': ('data/GuangzhouPM20100101_20151231.csv', ['PM_City Station', 'PM_5th Middle School'], '广州'),
'shanghai': ('data/ShanghaiPM20100101_20151231.csv', ['PM_Jingan', 'PM_Xuhui'], '上海'),
'shenyang': ('data/ShenyangPM20100101_20151231.csv', ['PM_Taiyuanjie', 'PM_Xiaoheyan'], '沈阳')
}
def pct_pol_level(data_arr):
level_1 = data_arr[data_arr <= 50].shape[0]
level_2 = data_arr[data_arr <= 100].shape[0]
level_3 = data_arr[(100 < data_arr) & (data_arr <= 150)].shape[0]
level_4 = data_arr[(150 < data_arr) & (data_arr <= 200)].shape[0]
level_5 = data_arr[(200 < data_arr) & (data_arr <= 300)].shape[0]
level_6 = data_arr[data_arr > 300].shape[0]
levels = np.array([level_1, level_2, level_3, level_4, level_5, level_6])
print(levels)
result = levels / np.sum(levels)
print(result)
return result
# 使得绘图能够显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.DataFrame()
# 饼图参数
explode = [0.1, 0, 0, 0, 0, 0]
# 空气质量各个级别标签
level_label = ["优", "良", "轻度", "中度", "重度", "严重"]
for city in citys:
# 数据准备
filepath = data_config_dict[city][0]
districts = data_config_dict[city][1]
city_name = data_config_dict[city][2]
data = pd.read_csv(filepath, usecols=common_cols + districts)
fig = plt.figure(figsize=(13.5, 5))
spec = gridspec.GridSpec(ncols=3, nrows=1, width_ratios=[2, 3, 3])
ax1 = fig.add_subplot(spec[0])
ax2 = fig.add_subplot(spec[1])
ax3 = fig.add_subplot(spec[2])
# 分析五城市污染状态
# size 是该城市的各空气质量等级对应天数占比列表
size = pct_pol_level(data[districts].mean(axis=1))
# 通过饼状图可视化
ax1.pie(size, explode=explode, labels=level_label, autopct='%1.2f%%', radius=1.1, labeldistance=1.05, startangle=90)
# 五城市每个区空气质量的月度差异
group = data.groupby(data['month'])[districts]
group.mean().plot(ax=ax2)
ax2.set_ylabel('PM2.5')
ax2.set_title('月度指数')
# 统计每个城市每天的平均PM2.5的数值
df[city] = data.groupby(by=["year", "month", "day"])[districts].mean().mean(axis=1)
# 基于天数对比中国环保部和美国驻华大使馆统计的污染状态
data["PM_US Post"] = pd.read_csv(filepath, usecols=['PM_US Post'])
group = data.groupby(by=['year', 'month', 'day'])
Y1 = pct_pol_level(group[districts].mean().mean(axis=1))
Y2 = pct_pol_level(group['PM_US Post'].mean())
X = np.arange(6)
ax4 = ax3.twinx()
width = 0.45
bar1 = ax3.bar(X - width / 2, Y1, width=width, alpha=0.8, color='r', label="中国")
bar2 = ax4.bar(X + width / 2, Y2, width=width, alpha=0.8, color='g', label="美国")
ax3.legend((bar1, bar2), ('中国', '美国'), loc='upper right')
plt.title('中美对比')
plt.xticks(X, labels=level_label)
plt.suptitle(city_name, x=0.05,y=0.5, fontsize=24,fontweight='bold')
plt.savefig(output_path + '/' + city_name)
plt.show()
df.to_csv(output_path + "/city_daily_average.csv")
最后
以上就是奋斗蚂蚁为你收集整理的中国五大城市PM2.5数据分析前言一、关于数据集二、分析五城市污染状态三、五城市每个区空气质量的月度差异四、统计每个城市每天的平均PM2.5的数值五、基于天数对比中国环保部和美国驻华大使馆统计的污染状态六、全代码的全部内容,希望文章能够帮你解决中国五大城市PM2.5数据分析前言一、关于数据集二、分析五城市污染状态三、五城市每个区空气质量的月度差异四、统计每个城市每天的平均PM2.5的数值五、基于天数对比中国环保部和美国驻华大使馆统计的污染状态六、全代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复