编译环境:Python 3.8,PyCharm 2020.2,Jupyter Notebook

本练习的主要内容是根据csv格式的数据,对五大城市的空气质量进行简要分析。具体内容包括:

1.分析五城市污染状态

2.统计每个城市每天的平均PM2.5的数值

数据字典

# 数据字典
"""
<city>_Data:存放从.csv文件中读取的原始数据
get_level():函数,用于根据PM2.5数值返回空气质量等级
<city>_Level:存放各城市的各等级空气质量占比
air_level:空气质量等级索引
df_level:DataFrame类型,存放所有城市的各等级空气质量百分比
<city>_Level_Per_Day:各城市每天的平均PM2.5的数值
Output_<City>_Level_Per_Day.csv:输出、保存各城市每天的平均PM2.5数值的文件
"""

分析过程

首先,打开.csv格式的数据文件,并删除编号、温度、湿度等无用信息:

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt

BJ_Data = pd.read_csv("BeijingPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)
CD_Data = pd.read_csv("ChengduPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)
GZ_Data = pd.read_csv("GuangzhouPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)
SH_Data = pd.read_csv("ShanghaiPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)
SY_Data = pd.read_csv("ShenyangPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)

以BJ_Data为例,查看一下前几行数据:

BJ_Data

可以看到,数据内包含多行数值为NaN的内容,这里将PM_US Post值为NaN的数据行删除:

BJ_Data.drop(BJ_Data[np.isnan(BJ_Data['PM_US Post'])].index, inplace=True)
CD_Data.drop(CD_Data[np.isnan(CD_Data['PM_US Post'])].index, inplace=True)
GZ_Data.drop(GZ_Data[np.isnan(GZ_Data['PM_US Post'])].index, inplace=True)
SH_Data.drop(SH_Data[np.isnan(SH_Data['PM_US Post'])].index, inplace=True)
SY_Data.drop(SY_Data[np.isnan(SY_Data['PM_US Post'])].index, inplace=True)

删除完成后,再看一下BJ_Data的内容,可以看到,数据已经没问题了,接下来就进入正式的分析。

BJ_Data

为了获取空气质量等级,这里定义一个get_level函数,通过传入PM2.5的值,返回空气质量等级:

def get_level(pm_us):
    if 0 <= pm_us <= 35:
        return '优'
    elif pm_us <= 75:
        return '良'
    elif pm_us <= 115:
        return '轻度污染'
    elif pm_us <= 150:
        return '中度污染'
    elif pm_us <= 250:
        return '重度污染'
    elif pm_us > 250:
        return '严重污染'
    else:
        return None  # 输入值无效

之后,根据PM_US Post的值获取空气质量等级,并新建level列,添加至数据中:

BJ_Data.loc[:, 'level'] = BJ_Data['PM_US Post'].apply(get_level)
CD_Data.loc[:, 'level'] = CD_Data['PM_US Post'].apply(get_level)
GZ_Data.loc[:, 'level'] = GZ_Data['PM_US Post'].apply(get_level)
SH_Data.loc[:, 'level'] = SH_Data['PM_US Post'].apply(get_level)
SY_Data.loc[:, 'level'] = SY_Data['PM_US Post'].apply(get_level)

添加level列

对每个城市的数据按空气质量等级分组,并除以数据总量,求得各质量等级所占百分比:

BJ_Level = BJ_Data.groupby(['level']).size() / len(BJ_Data)
CD_Level = CD_Data.groupby(['level']).size() / len(CD_Data)
GZ_Level = GZ_Data.groupby(['level']).size() / len(GZ_Data)
SH_Level = SH_Data.groupby(['level']).size() / len(SH_Data)
SY_Level = SY_Data.groupby(['level']).size() / len(SY_Data)

可以查看、检查一下BJ_Level中的数据:

BJ_Level

建立空气质量索引,并创建一个DataFrame类型的df_level存放各城市、各类型数据比例:

# 空气质量等级索引
air_level = ['优', '良', '轻度污染', '中度污染', '重度污染', '严重污染']

# 使用df_level存放空气质量百分比数据
df_level = pd.DataFrame(BJ_Level, index=air_level, columns=['北京'])
df_level['成都'] = CD_Level
df_level['广州'] = GZ_Level
df_level['上海'] = SH_Level
df_level['沈阳'] = SY_Level

输出df_level检查一下数据,可以看到,数据已经按照城市和等级显示:

各等级空气质量占比

接下来就可以按照df_level中的数据绘制饼图啦:

# 调整中文字体
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['font.sans-serif'] = 'SimHei'

# 绘图
fig = plt.figure(figsize=(9, 7))

ax1 = plt.subplot(3, 2, 1)
df_level['北京'].plot.pie(title='北京-城市污染状态分析', autopct='%.1f%%')

ax2 = plt.subplot(3, 2, 2)
df_level['成都'].plot.pie(title='成都-城市污染状态分析', autopct='%.1f%%')

ax3 = plt.subplot(3, 2, 3)
df_level['广州'].plot.pie(title='广州-城市污染状态分析', autopct='%.1f%%')

ax4 = plt.subplot(3, 2, 4)
df_level['上海'].plot.pie(title='上海-城市污染状态分析', autopct='%.1f%%')

ax5 = plt.subplot(3, 2, 5)
df_level['沈阳'].plot.pie(title='沈阳-城市污染状态分析', autopct='%.1f%%')

plt.show()

绘图的结果如下:

饼图

到这里,五个城市的污染状态就分析完成了,接下来统计一下每个城市每天的平均PM2.5的数值,对每个城市的数据按年、月、日分组,并对PM_US Post数据计算平均值:

BJ_Level_Per_Day = BJ_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})
CD_Level_Per_Day = CD_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})
GZ_Level_Per_Day = GZ_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})
SH_Level_Per_Day = SH_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})
SY_Level_Per_Day = SY_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})

输出BJ_Level_Per_Day的数据,可以看到数据共2155行,按照年月日分别统计了PM2.5的平均值,非常完美~

数据

最后,将相关的数据输出,由于数据有2000+行,PyCharm或Notebook只会输出部分内容,因此可以选择将数据保存至csv文件:

# 输出数据,并分别保存至Output_<City>_Level_Per_Day.csv文件中(可选)
print("北京每天的平均PM2.5的数值分析:\n{}\n".format(BJ_Level_Per_Day))
BJ_Level_Per_Day.to_csv("Output_BJ_Level_Per_Day.csv")
print("成都每天的平均PM2.5的数值分析:\n{}\n".format(CD_Level_Per_Day))
# CD_Level_Per_Day.to_csv("Output_CD_Level_Per_Day.csv")
print("广州每天的平均PM2.5的数值分析:\n{}\n".format(GZ_Level_Per_Day))
# GZ_Level_Per_Day.to_csv("Output_GZ_Level_Per_Day.csv")
print("上海每天的平均PM2.5的数值分析:\n{}\n".format(SH_Level_Per_Day))
# SH_Level_Per_Day.to_csv("Output_SH_Level_Per_Day.csv")
print("沈阳每天的平均PM2.5的数值分析:\n{}\n".format(SY_Level_Per_Day))
# SY_Level_Per_Day.to_csv("Output_SY_Level_Per_Day.csv")

完整代码

以上就是分析的全部内容啦,完整代码如下:

# 分析五城市污染状态;统计每个城市每天的平均PM2.5的数值;

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt

# 打开文件,并删除无用数据列
BJ_Data = pd.read_csv("BeijingPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)
CD_Data = pd.read_csv("ChengduPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)
GZ_Data = pd.read_csv("GuangzhouPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)
SH_Data = pd.read_csv("ShanghaiPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)
SY_Data = pd.read_csv("ShenyangPM20100101_20151231.csv").drop(
    ['No', 'DEWP', 'HUMI', 'PRES', 'TEMP', 'cbwd', 'Iws', 'precipitation', 'Iprec'], axis=1)

# 将PM_US Post值为NaN的行删除
BJ_Data.drop(BJ_Data[np.isnan(BJ_Data['PM_US Post'])].index, inplace=True)
CD_Data.drop(CD_Data[np.isnan(CD_Data['PM_US Post'])].index, inplace=True)
GZ_Data.drop(GZ_Data[np.isnan(GZ_Data['PM_US Post'])].index, inplace=True)
SH_Data.drop(SH_Data[np.isnan(SH_Data['PM_US Post'])].index, inplace=True)
SY_Data.drop(SY_Data[np.isnan(SY_Data['PM_US Post'])].index, inplace=True)


# 定义get_level函数,判断空气质量等级
def get_level(pm_us):
    if 0 <= pm_us <= 35:
        return '优'
    elif pm_us <= 75:
        return '良'
    elif pm_us <= 115:
        return '轻度污染'
    elif pm_us <= 150:
        return '中度污染'
    elif pm_us <= 250:
        return '重度污染'
    elif pm_us > 250:
        return '严重污染'
    else:
        return None  # 输入值无效


# 根据PM_US Post的值获取空气质量等级,并新建level列,添加至数据中
BJ_Data.loc[:, 'level'] = BJ_Data['PM_US Post'].apply(get_level)
CD_Data.loc[:, 'level'] = CD_Data['PM_US Post'].apply(get_level)
GZ_Data.loc[:, 'level'] = GZ_Data['PM_US Post'].apply(get_level)
SH_Data.loc[:, 'level'] = SH_Data['PM_US Post'].apply(get_level)
SY_Data.loc[:, 'level'] = SY_Data['PM_US Post'].apply(get_level)

# 各等级空气质量百分比分析
BJ_Level = BJ_Data.groupby(['level']).size() / len(BJ_Data)
CD_Level = CD_Data.groupby(['level']).size() / len(CD_Data)
GZ_Level = GZ_Data.groupby(['level']).size() / len(GZ_Data)
SH_Level = SH_Data.groupby(['level']).size() / len(SH_Data)
SY_Level = SY_Data.groupby(['level']).size() / len(SY_Data)

# 空气质量等级索引
air_level = ['优', '良', '轻度污染', '中度污染', '重度污染', '严重污染']

# 使用df_level存放空气质量百分比数据
df_level = pd.DataFrame(BJ_Level, index=air_level, columns=['北京'])
df_level['成都'] = CD_Level
df_level['广州'] = GZ_Level
df_level['上海'] = SH_Level
df_level['沈阳'] = SY_Level

# 调整中文字体
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['font.sans-serif'] = 'SimHei'

# 绘图
fig = plt.figure(figsize=(9, 7))

ax1 = plt.subplot(3, 2, 1)
df_level['北京'].plot.pie(title='北京-城市污染状态分析', autopct='%.1f%%')

ax2 = plt.subplot(3, 2, 2)
df_level['成都'].plot.pie(title='成都-城市污染状态分析', autopct='%.1f%%')

ax3 = plt.subplot(3, 2, 3)
df_level['广州'].plot.pie(title='广州-城市污染状态分析', autopct='%.1f%%')

ax4 = plt.subplot(3, 2, 4)
df_level['上海'].plot.pie(title='上海-城市污染状态分析', autopct='%.1f%%')

ax5 = plt.subplot(3, 2, 5)
df_level['沈阳'].plot.pie(title='沈阳-城市污染状态分析', autopct='%.1f%%')

# 统计每个城市每天的平均PM2.5的数值
BJ_Level_Per_Day = BJ_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})
CD_Level_Per_Day = CD_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})
GZ_Level_Per_Day = GZ_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})
SH_Level_Per_Day = SH_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})
SY_Level_Per_Day = SY_Data.groupby(['year', 'month', 'day']).agg({'PM_US Post': 'mean'})

# 输出数据,并分别保存至Output_<City>_Level_Per_Day.csv文件中(可选)
print("北京每天的平均PM2.5的数值分析:\n{}\n".format(BJ_Level_Per_Day))
BJ_Level_Per_Day.to_csv("Output_BJ_Level_Per_Day.csv")
print("成都每天的平均PM2.5的数值分析:\n{}\n".format(CD_Level_Per_Day))
# CD_Level_Per_Day.to_csv("Output_CD_Level_Per_Day.csv")
print("广州每天的平均PM2.5的数值分析:\n{}\n".format(GZ_Level_Per_Day))
# GZ_Level_Per_Day.to_csv("Output_GZ_Level_Per_Day.csv")
print("上海每天的平均PM2.5的数值分析:\n{}\n".format(SH_Level_Per_Day))
# SH_Level_Per_Day.to_csv("Output_SH_Level_Per_Day.csv")
print("沈阳每天的平均PM2.5的数值分析:\n{}\n".format(SY_Level_Per_Day))
# SY_Level_Per_Day.to_csv("Output_SY_Level_Per_Day.csv")

plt.show()

相关下载

.csv数据文件及.py源代码下载:【点击跳转】

最后修改:2020 年 11 月 06 日 11 : 46 PM