Python北京空气质量数据处理

2020-04-27 22:46:19 浏览数 (2)

北京空气质量数据处理

这是我接单的一个单,看了数据源,马发现很有印象,马上就知道来源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

这个作业挺简单的,做了下出这个作业的老师挺有水平的,学习的时候,口袋又多了几块钱

0 人点赞