北京空气质量数据处理
这是我接单的一个单,看了数据源,马发现很有印象,马上就知道来源kaggle中国北京上海广州成都,沈阳的Pm2.5数据集,对应的链接:https://www.kaggle.com/uciml/pm25-data-for-five-chinese-cities,数据集去kaggle下载,在kaggle上就是一个时间序列的问题。
他们老师的要求:将源码与生成的数据(rar或zip格式)提交 源码命名为statistics.py,将输出信息保存到文件PM_BeiJing.csv中 对HUMI,PRES,TEMP线性插值处理,超出3倍标准差的高度异常数据,修改成3倍标准差的数值。假设PM指数最高500,对PM_Dongsi,PM_Dongsihuan,PM_Nongzhanguan三列超过500的数据,修改为500PM指数修改cbwd列中的值为cv的单元格,其值用后项数据填充并计算北京空气质量。
分析解决方法
第一对HUMI,PRES,TEMP线性插值处理,主要用numpy.interp,超出3倍标准差的高度异常数据,修改成3倍标准差的数值来一个判断OK,关键是其值用后项数据填充一开始想使用转化为Nan值,再后项数据填充,使用的时候发现后项数据填充只适合数值类型,不适合文本类型,那只好遍历了。
代码
代码语言:javascript复制import numpy as np
import pandas as pd
print("开始处理数据")
data= pd.read_csv('BeijingPM20100101_20151231.csv',encoding='utf-8')
# 对HUMI,PRES,TEMP线性插值处理,超出3倍标准差的高度异常数据,修改成3倍标准差的数值。
data['HUMI'].interpolate()
data['PRES'].interpolate()
data['TEMP'].interpolate()
HUMI_std = np.std(data['HUMI'])
PRES_std = np.std(data['PRES'])
TEMP_std = np.std(data['TEMP'])
for i in data['HUMI']:
if (i > HUMI_std * 3):
i = HUMI_std * 3
for i in data['PRES']:
if (i > PRES_std * 3):
i = PRES_std * 3
for i in data['TEMP']:
if (i > TEMP_std * 3):
i = TEMP_std* 3
# 假设PM指数最高500,对PM_Dongsi,PM_Dongsihuan,PM_Nongzhanguan三列超过500的数据,修改为500PM指数
for i in data['PM_Dongsi']:
if i > 500:
i = 500
else:
pass
for i in data['PM_Dongsihuan']:
if i > 500:
i = 500
else:
pass
for i in data['PM_Nongzhanguan']:
if i > 500:
i = 500
else:
pass
# 修改cbwd列中的值为cv的单元格,其值用后项数据填充。
for i in range(len(data['cbwd'])):
if data['cbwd'][i] == 'cv':
data['cbwd'][i] = data['cbwd'][i 1]
else:
pass
print("处理数据完成")
data.to_csv("PM_Beijing.csv",index=False)
执行上面的代码,运行结果就是下面的图片
计算北京每年的PM2.5情况
代码语言:javascript复制import pandas as pd
# 打开文件,仅读取第7至第10列
FileNameStr = 'PM_Beijing.csv'
df = pd.read_csv(FileNameStr, encoding='utf-8', usecols=[1, 6, 7, 8, 9])
# 新建平均值列,并将平均值写入
# 其中,iloc[:, 1:5]指第2到第5列,mean(axis=1)为求行平均值
df['PM_ave'] = df.iloc[:, 1:5].mean(axis=1)
# 保存到文件,其中以'year'分组,计算'PM_ave'列的平均值。
df.groupby('year')['PM_ave'].mean().to_csv("北京每年的PM2.5结果.csv")
# 查看结果
print(df.groupby('year')['PM_ave'].mean())
运行上面的代码,结果如下
代码语言:javascript复制year
2010 104.045730
2011 99.093240
2012 90.538768
2013 98.402664
2014 93.917704
2015 85.858942
Name: PM_ave, dtype: float64
计算北京每年1-12月的PM2.5情况
代码语言:javascript复制import pandas as pd
df = pd.read_csv('PM_Beijing.csv', encoding='utf-8', usecols=[1, 2, 6, 7, 8, 9])
# 新建平均值列,并将平均值写入
# 其中,iloc[:, 2:6]指第3到第6列,mean(axis=1)为求行平均值
df['PM_ave'] = df.iloc[:, 2:6].mean(axis=1)
# 保存到文件,其中以'year'和'month'分组,计算'PM_ave'列的平均值。
df.groupby(['year', 'month'])['PM_ave'].mean().to_csv("北京每年1-12月的PM2.5结果.csv")
# 打印一份
print(df.groupby(['year', 'month'])['PM_ave'].mean())
运行上面的代码,结果如下
代码语言:javascript复制year month
2010 1 90.403670
2 97.239940
3 94.046544
4 80.072423
5 87.071913
6 109.038938
7 123.426075
8 97.683432
9 122.792735
10 118.784367
11 138.384036
12 97.115747
2011 1 44.873700
2 150.290179
3 57.991987
4 91.720670
5 65.108146
6 108.794655
7 107.386486
8 103.733800
9 94.969402
10 145.556818
11 109.434965
12 108.721400
2012 1 118.922388
2 84.442029
3 96.474324
4 87.835883
5 90.966715
6 96.634181
...
2013 7 74.932839
8 67.923611
9 85.717824
10 102.208781
11 85.146296
12 90.317764
2014 1 107.911738
2 160.513889
3 103.183244
4 92.160648
5 64.958557
6 59.154630
7 91.799955
8 65.668237
9 68.232639
10 135.269713
11 106.337500
12 76.622536
2015 1 110.022737
2 103.445561
3 94.483423
4 79.396991
5 61.167563
6 60.332407
7 60.229503
8 45.896057
9 50.924769
10 77.257841
11 125.803125
12 162.178987
Name: PM_ave, Length: 72, dtype: float64
这个作业挺简单的,做了下出这个作业的老师挺有水平的,学习的时候,口袋又多了几块钱