1.1.1 空气质量监测数据得到预处理

import numpy as np

import pandas as pd

data=pd.read_excel('北京市空气质量数据.xlsx') # 数据文件地址

data=data.replace(0,np.NaN)

data['年']=data['日期'].apply(lambda x:x.year) #利用apply方法以及匿名函数,基于数据data中的日期变量的到每个样本观测到的年份和月份

month=data['日期'].apply(lambda x:x.month)

quarter_month={'1':'一季度','2':'一季度','3':'一季度',

'4':'二季度','5':'二季度','6':'二季度',

'7':'三季度','8':'三季度','9':'三季度',

'10':'四季度','11':'四季度','12':'四季度'}

data['季度']=month.map(lambda x:quarter_month[str(x)])#数据的映射对应

bins=[0,50,100,150,200,300,1000]#生成用于指定分组组限的列别

#依据bins对AQI进行分组

data['等级']=pd.cut(data['AQI'],bins,labels=['一级优','二级良','三级轻度污染','四级中度污染','五级重度污染','六级严重污染'])

print('对AQI的分组结果:\n{0}'.format(data[['日期','AQI','等级','季度']]))#显示数据中的指定变量内容

对AQI的分组结果:

日期 AQI 等级 季度

0 2014-01-01 81.0 二级良 一季度

1 2014-01-02 145.0 三级轻度污染 一季度

2 2014-01-03 74.0 二级良 一季度

3 2014-01-04 149.0 三级轻度污染 一季度

4 2014-01-05 119.0 三级轻度污染 一季度

... ... ... ... ...

2150 2019-11-22 183.0 四级中度污染 四季度

2151 2019-11-23 175.0 四级中度污染 四季度

2152 2019-11-24 30.0 一级优 四季度

2153 2019-11-25 40.0 一级优 四季度

2154 2019-11-26 73.0 二级良 四季度

[2155 rows x 4 columns]

在Python版本较高时,Iterable被移动到了collections.abc模块中,所以会出现出现"cannot import name ‘Iterable’ from ‘collections’"错误,所以可以替换导入语句

#判断month是否为可迭代对象

try:

from collections.abc import Iterable

except ImportError:

from collections import Iterable

isinstance(month,Iterable)

True

1.1.2 空气质量监测数据的基本分析

1.基本描述统计

#利用数据框的groupby()方法,计算各季度AQI和PM2.5的平均值

print('各季度AQI和PM2.5的均值:\n{0}'.format(data.loc[:,['AQI','PM2.5']].groupby(data['季度']).mean()))

#计算每个季度AQI和PM2.5的基本描述统计量

print('各季度AQI和PM2.5的描述统计量:\n',data.groupby(data['季度'])['AQI','PM2.5'].apply(lambda x:x.describe()))

def top(df,n=10,column='AQI'):#定义函数,对给定的数据框,按指定变量列值降序排序,并返回排在前n条的数据

return df.sort_values(by=column,ascending=False)[:n] # 对AQI列的数据进行降序排列,然后返回前n个(这里n=10)

print('空气质量最差的5天:\n',top(data,n=5)[['日期','AQI','PM2.5','等级']])

print('各季度空气质量最差的3天:\n',data.groupby(data['季度']).apply(lambda x:top(x,n=3)[['日期','AQI','PM2.5','等级']]))

print('各季度空气质量情况:\n',pd.crosstab(data['等级'],data['季度'],margins=True,margins_name='总计',normalize=False))

各季度AQI和PM2.5的均值:

AQI PM2.5

季度

一季度 109.327778 77.225926

三季度 98.911071 49.528131

二季度 109.369004 55.149723

四季度 109.612403 77.195736

各季度AQI和PM2.5的描述统计量:

AQI PM2.5

季度

一季度 count 540.000000 540.000000

mean 109.327778 77.225926

std 80.405408 73.133857

min 26.000000 4.000000

25% 48.000000 24.000000

50% 80.000000 53.000000

75% 145.000000 109.250000

max 470.000000 454.000000

三季度 count 551.000000 551.000000

mean 98.911071 49.528131

std 45.484516 35.394897

min 28.000000 3.000000

25% 60.000000 23.000000

50% 95.000000 41.000000

75% 130.500000 67.000000

max 252.000000 202.000000

二季度 count 542.000000 541.000000

mean 109.369004 55.149723

std 49.608042 35.918345

min 35.000000 5.000000

25% 71.000000 27.000000

50% 99.000000 47.000000

75% 140.750000 73.000000

max 500.000000 229.000000

四季度 count 516.000000 516.000000

mean 109.612403 77.195736

std 84.192134 76.651794

min 21.000000 4.000000

25% 55.000000 25.000000

50% 78.000000 51.000000

75% 137.250000 101.500000

max 485.000000 477.000000

空气质量最差的5天:

日期 AQI PM2.5 等级

1218 2017-05-04 500.0 NaN 六级严重污染

723 2015-12-25 485.0 477.0 六级严重污染

699 2015-12-01 476.0 464.0 六级严重污染

1095 2017-01-01 470.0 454.0 六级严重污染

698 2015-11-30 450.0 343.0 六级严重污染

各季度空气质量最差的3天:

日期 AQI PM2.5 等级

季度

一季度 1095 2017-01-01 470.0 454.0 六级严重污染

45 2014-02-15 428.0 393.0 六级严重污染

55 2014-02-25 403.0 354.0 六级严重污染

三季度 186 2014-07-06 252.0 202.0 五级重度污染

211 2014-07-31 245.0 195.0 五级重度污染

183 2014-07-03 240.0 190.0 五级重度污染

二季度 1218 2017-05-04 500.0 NaN 六级严重污染

1219 2017-05-05 342.0 181.0 六级严重污染

103 2014-04-14 279.0 229.0 五级重度污染

四季度 723 2015-12-25 485.0 477.0 六级严重污染

699 2015-12-01 476.0 464.0 六级严重污染

698 2015-11-30 450.0 343.0 六级严重污染

各季度空气质量情况:

季度 一季度 三季度 二季度 四季度 总计

等级

一级优 145 96 38 108 387

二级良 170 209 240 230 849

三级轻度污染 99 164 152 64 479

四级中度污染 57 72 96 33 258

五级重度污染 48 10 14 58 130

六级严重污染 21 0 2 23 46

总计 540 551 542 516 2149

2.派生虚拟自变量

pd.get_dummies(data['等级'])#生成关于等级的虚拟变量

data.join(pd.get_dummies(data['等级']))#将原始数据与等级的虚拟变量进行合并

日期AQI质量等级PM2.5PM10SO2CONO2O3年季度等级一级优二级良三级轻度污染四级中度污染五级重度污染六级严重污染02014-01-0181.0良45.0111.028.01.562.052.02014一季度二级良01000012014-01-02145.0轻度污染111.0168.069.03.493.014.02014一季度三级轻度污染00100022014-01-0374.0良47.098.029.01.352.056.02014一季度二级良01000032014-01-04149.0轻度污染114.0147.040.02.875.014.02014一季度三级轻度污染00100042014-01-05119.0轻度污染91.0117.036.02.367.044.02014一季度三级轻度污染001000.........................................................21502019-11-22183.0中度污染138.0181.09.02.494.05.02019四季度四级中度污染00010021512019-11-23175.0中度污染132.0137.06.01.669.034.02019四季度四级中度污染00010021522019-11-2430.0优7.030.03.00.211.058.02019四季度一级优10000021532019-11-2540.0优13.030.03.00.432.029.02019四季度一级优10000021542019-11-2673.0良38.072.06.00.858.014.02019四季度二级良010000

2155 rows × 18 columns

3.数据集的抽样

np.random.seed(123)#指定随机数字种子

sampler=np.random.randint(0,len(data),10)#在指定范围内(0至样本N-1)随机抽取10个整数作为索引导,其对应的样本观测后续将被抽中

print(sampler)

[1346 1122 1766 2154 1147 1593 1761 96 47 73]

sampler=np.random.permutation(len(data))[:10]#对数字随机打乱重排在获得前10个样本观测索引号,其对应的样本观测后续将被抽中

print(sampler)

[1883 326 43 1627 1750 1440 993 1469 1892 865]

data.take(sampler)#获得随机抽取的索引号对应的样本观测组成的随机数据子集

data.loc[data['质量等级']=='优', :]#抽取满足指定条件行的数据子集

日期AQI质量等级PM2.5PM10SO2CONO2O3年季度等级72014-01-0827.0优15.025.013.00.521.053.02014一季度一级优82014-01-0946.0优27.046.019.00.835.053.02014一季度一级优112014-01-1247.0优27.047.027.00.739.059.02014一季度一级优192014-01-2035.0优8.035.06.00.315.065.02014一季度一级优202014-01-2126.0优18.025.027.00.734.050.02014一季度一级优.......................................21222019-10-2530.0优8.020.02.00.424.055.02019四季度一级优21312019-11-0348.0优33.048.03.00.634.033.02019四季度一级优21352019-11-0747.0优24.047.03.00.537.044.02019四季度一级优21522019-11-2430.0优7.030.03.00.211.058.02019四季度一级优21532019-11-2540.0优13.030.03.00.432.029.02019四季度一级优

387 rows × 12 columns

1.2.1 AQI的时序变化特点

# - coding: utf-8 -*-

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

# %matplotlib inline

#指定默认字体

plt.rcParams['font.sans-serif']=['SimHei']

plt.rcParams['axes.unicode_minus'] = False

data=pd.read_excel('北京市空气质量数据.xlsx')

data=data.replace(0,np.NaN) # 将缺失值用0代替

plt.figure(figsize=(10,5))

plt.plot(data['AQI'],color='black',linestyle='-',linewidth=0.5)

plt.axhline(y=data['AQI'].mean(),color='red', linestyle='-',linewidth=0.5,label='AQI总平均值')

data['年']=data['日期'].apply(lambda x:x.year)

AQI_mean=data['AQI'].groupby(data['年']).mean().values

year=['2014年','2015年','2016年','2017年','2018年','2019年']

col=['red','blue','green','yellow','purple','brown']

for i in range(6):

plt.axhline(y=AQI_mean[i],color=col[i], linestyle='--',linewidth=0.5,label=year[i])

plt.title('2014年至2019年AQI时间序列折线图')

plt.xlabel('年份')

plt.ylabel('AQI')

plt.xlim(xmax=len(data), xmin=1)

plt.ylim(ymax=data['AQI'].max(),ymin=1)

plt.yticks([data['AQI'].mean()],['AQI平均值'])

plt.xticks([1,365,365*2,365*3,365*4,365*5],['2014','2015','2016','2017','2018','2019'])

plt.legend(loc='best')

plt.text(x=list(data['AQI']).index(data['AQI'].max()),y=data['AQI'].max()-20,s='空气质量最差日',color='red')

plt.show()

1.2.2 AQI的分布特征及相关性分析

import warnings

import matplotlib.pyplot as plt

warnings.filterwarnings(action='ignore') # 指定忽略代码运行过程中的警告信息

plt.figure(figsize=(10, 5))

plt.subplots_adjust(hspace=0.5)#增大上下距离

# 绘制各年AQI均值折线图

plt.subplot(2, 2, 1)

plt.plot(AQI_mean, color='black', linestyle='-', linewidth=0.5)

plt.title('各年AQI均值折线图')

plt.xticks([0, 1, 2, 3, 4, 5], ['2014', '2015', '2016', '2017', '2018', '2019'])#设置横坐标

# 绘制AQI直方图

plt.subplot(2, 2, 2)

plt.hist(data['AQI'], bins=20)

plt.title('AQI直方图')

# 绘制PM2.5与AQI散点图

plt.subplot(2, 2, 3)

plt.scatter(data['PM2.5'], data['AQI'], s=0.5, c='green', marker='.')

plt.title('PM2.5与AQI散点图')

plt.xlabel('PM2.5')

plt.ylabel('AQI')

# 绘制空气质量整体情况的饼图

plt.subplot(2, 2, 4)

tmp = pd.value_counts(data['质量等级'], sort=False) # 等同:tmp=data['质量等级'].value_counts()

share = tmp / sum(tmp)

labels = tmp.index

explode = [0, 0.2, 0, 0, 0, 0.2, 0]

plt.pie(share, explode=explode, labels=labels, autopct='%3.1f%%', startangle=180, shadow=True)

plt.title('空气质量整体情况的饼图')

plt.show()

生成的图像有重叠部分,可以使用plt.subplots_adjust() 函数进行调整

plt.subplots_adjust(hspace=0.5)#增大上下距离

该函数在 matplotlib.pyplot 模块中,主要用于微调子图之间的空间,包括水平间距(wspace)和垂直间距(hspace)。这个函数对于优化图形布局非常有用,尤其是在创建具有多个子图的复杂图形时。hspace 参数控制的是子图之间的垂直间距。这个值是以子图大小为单位的,所以 hspace=0.5 表示子图之间的垂直间距为半个子图的高度。通过调整 hspace 的值,可以增加或减少子图之间的垂直距离,从而改善图形的整体外观和可读性。

北京空气质量监测数据下载地址

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: