Python北京空氣質量數據處理

北京空氣質量數據處理

這是我接單的一個單,看了數據源,馬發現很有印象,馬上就知道來源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的單元格,其值用後項數據填充並計算北京空氣質量。

Python北京空氣質量數據處理

分析解決方法

第一對HUMI,PRES,TEMP線性插值處理,主要用numpy.interp,超出3倍標準差的高度異常數據,修改成3倍標準差的數值來一個判斷OK,關鍵是其值用後項數據填充一開始想使用轉化為Nan值,再後項數據填充,使用的時候發現後項數據填充只適合數值類型,不適合文本類型,那隻好遍歷了。

代碼

<code>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)
/<code>

執行上面的代碼,運行結果就是下面的圖片

Python北京空氣質量數據處理

計算北京每年的PM2.5情況

<code>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())
/<code>

運行上面的代碼,結果如下

<code>year
2010 104.045730
2011 99.093240
2012 90.538768
2013 98.402664
2014 93.917704
2015 85.858942
Name: PM_ave, dtype: float64
/<code>

計算北京每年1-12月的PM2.5情況

<code>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())
/<code>

運行上面的代碼,結果如下

<code>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
/<code>

這個作業挺簡單的,做了下出這個作業的老師挺有水平的,學習的時候,口袋又多了幾塊錢


分享到:


相關文章: