【Python】处理城市空气质量数据(异常值处理,interpolate()线性插值)

拼搏现实的明天。 2023-03-13 13:01 126阅读 0赞

一、内容来源

课程来源:大数据分析师(第一期)(学堂在线 北邮 杨亚)

数据集分享:链接:https://pan.baidu.com/s/1nU29LEfrILve3-ERqccUTQ
提取码:6ptf

二、学习笔记(广州)

3σ原则为

数值分布在(μ-σ,μ+σ)中的概率为0.6827

数值分布在(μ-2σ,μ+2σ)中的概率为0.9545

数值分布在(μ-3σ,μ+3σ)中的概率为0.9973

数据处理代码1:找出异常值,并通过线性插值的方式处理掉

  1. import numpy as np
  2. import pandas as pd
  3. #1 读取数据
  4. filename = 'GuangzhouPM20100101_20151231.csv'
  5. #df = pd.read_csv(filename,encoding='utf-8',dtype=str)
  6. #df = pd.read_csv(filename,encoding='utf-8')
  7. df = pd.read_csv(filename,encoding='utf-8',usecols=[0,1,2,3,4,5,10])
  8. #2 查看数据基本情况
  9. print('head--------------------------------\n',df.head())
  10. print('deacribe----------------------------\n',df.describe())
  11. print('info--------------------------------\n',df.info())
  12. # 查找HUMI中小于0的值
  13. temp_list = df[df.HUMI < 0].index.tolist()
  14. print(temp_list)
  15. df["HUMI_new1"] = df["HUMI"]
  16. for i in temp_list:
  17. df["HUMI_new1"][i] = np.nan
  18. #df.loc['HUMI_new1',i] = np.nan
  19. df["HUMI_new2"]=df["HUMI_new1"].interpolate()
  20. # 保存文件
  21. df.to_csv('gz1.csv')

数据处理代码2:找出小于3σ的异常数据并处理掉

  1. import numpy as np
  2. import pandas as pd
  3. #读取数据
  4. filename = 'gz1.csv'
  5. df = pd.read_csv(filename,encoding='utf-8',usecols=[1,2,3,4,5,6,9])
  6. print('-------------------------head--------------------------\n',df.head())
  7. print('------------------------deacribe------------------------\n',df.describe())
  8. print('-------------------------info---------------------------\n',df.info())
  9. HUMI_mean = df.HUMI_new2.mean()
  10. HUMI_std = df.HUMI_new2.std()
  11. print(HUMI_mean-3 * HUMI_std, HUMI_mean + 3 *HUMI_std)
  12. #求出HUMI_new2列中数据小于3倍标准差的数据
  13. index_list = df[df.HUMI_new2 < HUMI_mean-3 * HUMI_std].index.tolist()
  14. value_list = df[df.HUMI_new2 < HUMI_mean-3 * HUMI_std]
  15. print("there are {} item:".format(len(index_list)))
  16. print(index_list)
  17. print(value_list)
  18. #将这些数改为3倍标准差(下边界)
  19. df["HUMI_new3"] = df["HUMI_new2"]
  20. for i in index_list:
  21. df["HUMI_new3"][i] = int(HUMI_mean-3 * HUMI_std)
  22. #保存文件
  23. df.to_csv("gz2.csv")

三、作业(北京)

在这里插入图片描述

  1. import numpy as np
  2. import pandas as pd
  3. #读取数据
  4. filename = 'BeijingPM20100101_20151231.csv'
  5. df = pd.read_csv(filename,encoding='utf-8')
  6. #查看数据基本情况
  7. print('-------------------------head--------------------------\n',df.head())
  8. print('------------------------deacribe------------------------\n',
  9. df["HUMI"].describe(),df["PRES"].describe(),df["TEMP"].describe())
  10. print('-----------------------缺失值---------------------------\n',
  11. df.isnull().sum().sort_values(ascending=False))
  12. #对缺失值进行线性插值
  13. df["HUMI"]=df["HUMI"].interpolate()
  14. df["PRES"]=df["PRES"].interpolate()
  15. df["TEMP"]=df["TEMP"].interpolate()
  16. print('-----------------------缺失值---------------------------\n',
  17. df.isnull().sum().sort_values(ascending=False))
  18. #对超过3倍标准差的高度异常数据,修改为3倍标准差的数值
  19. #这里只写一个,其他两个同理,其实观察describe结果可知没有数据超过3倍标准差
  20. HUMI_mean = df.HUMI.mean()
  21. HUMI_std = df.HUMI.std()
  22. index_list = df[df.HUMI > HUMI_mean+3 * HUMI_std].index.tolist()
  23. for i in index_list:
  24. df["HUMI"][i] = int(HUMI_mean+3 * HUMI_std)
  25. #对PM_Dongsi、PM_Dongsihuan、PM_Nongzhanguan三列中超过500的数据,修改为500
  26. print('------------------------deacribe(before)------------------------\n',
  27. df["PM_Dongsi"].describe(),df["PM_Dongsihuan"].describe(),df["PM_Dongsihuan"].describe())
  28. for i in df[df.PM_Dongsi > 500 ].index.tolist():
  29. df["PM_Dongsi"][i] = 500
  30. for i in df[df.PM_Dongsihuan > 500 ].index.tolist():
  31. df["PM_Dongsihuan"][i] = 500
  32. for i in df[df.PM_Nongzhanguan > 500 ].index.tolist():
  33. df["PM_Nongzhanguan"][i] = 500
  34. print('------------------------deacribe(after)------------------------\n',
  35. df["PM_Dongsi"].describe(),df["PM_Dongsihuan"].describe(),df["PM_Dongsihuan"].describe())
  36. #修改cbwd列中值为“cv"的单元格,其值用后项数据填充。
  37. temp_index = df[df.cbwd =='cv' ].index.tolist()
  38. for i in reversed(temp_index): #倒叙遍历
  39. df["cbwd"][i] = df["cbwd"][i+1]
  40. print("after",len(df[df.cbwd =='cv' ].index.tolist()))
  41. '''#方法2:全部数据倒序遍历
  42. print("before",len(df[df.cbwd =='cv' ].index.tolist()))
  43. for i in reversed(range(len(df))):
  44. if df["cbwd"][i] =='cv':
  45. df["cbwd"][i] = df["cbwd"][i+1]
  46. print("after",len(df[df.cbwd =='cv' ].index.tolist()))
  47. '''
  48. #保存文件
  49. df.to_csv("bj.csv")

发表评论

表情:
评论列表 (有 0 条评论,126人围观)

还没有评论,来说两句吧...

相关阅读