北京空气质量数据处理
这是我接单的一个单,看了数据源,马发现很有印象,马上就知道来源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值,再后项数据填充,使用的时候发现后项数据填充只适合数值类型,不适合文本类型,那只好遍历了。
代码
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情况
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())
运行上面的代码,结果如下
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情况
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())
运行上面的代码,结果如下
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
这个作业挺简单的,做了下出这个作业的老师挺有水平的,学习的时候,口袋又多了几块钱
查看更多关于Python北京空气质量数据处理的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did127733