中国五大城市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")
  • 10
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值