由于雾霾问题,全社会都很关注空气质量,政府也花了很多钱力图改善空气质量。我们作为城市市民经常要问:我们城市的空气质量到底怎样?这几年我们城市的空气质量是在改善还是恶化?我们城市的空气质量与其他城市相比,是更好还是更差?
官方媒体一般都是说:我们的空气质量在改善,但有数据证明吗?官方数据可信吗?我们心存疑虑。所以,作为数据狗,还是自己动手吧。
PM2.5是最近几年特别热议的空气质量指标,这要归功于美帝大使馆哦。美国驻华使馆和领馆自己检测PM2.5数据并且在官网发布,这才让国人知道了这个指标,后来国内官方也开始公布这个指标了。
言归正传,差点忘了,这是一篇Python技术贴。回到这篇文章的主题:用Python做数据分析。我生活在广州,当然以我大广州为分析目标了。
数据源:美国驻华使馆的空气质量检测数据,http://www.stateair.net/web/historical/1/1.html 包含以下字段:
其中,PM2.5数值所代表的空气质量评价如下表1-1所示:
In [1]:
import unicodecsv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb
%matplotlib inline
In [2]:
# 从csv中读取北京2015年pm2.5数据,保存在DataFrame中
df_bj2015 = pd.read_csv('data/Beijing_2015_HourlyPM25_created20160201.csv')
# 重新设定各个字段的名称
df_bj2015.columns=['Year','Month','Day','Hour','Value','QC']
In [3]:
# 查看DataFrame中的前几条数据
df_bj2015.head()
Out[3]:
In [4]:
# DataFrame的简要描述
df_bj2015.describe()
Out[4]:
In [5]:
len(df_bj2015.ix[df_bj2015.Value<0, :])
Out[5]:
In [6]:
# 把错误值置为空值
df_bj2015.loc[df_bj2015.Value<0,'Value']=np.nan
# 删除空值记录
df_bj2015.dropna(inplace=True)
In [7]:
df_bj2015.describe()
Out[7]:
In [8]:
df_bj2015.describe()
Out[8]:
In [9]:
def get_grade(value):
if value <= 50 and value>=0:
return 'Good'
elif value <= 100:
return 'Moderate'
elif value <= 150:
return 'Unhealthy for Sensi'
elif value <= 200:
return 'Unhealthy'
elif value <= 300:
return 'Very Unhealthy'
elif value <= 500:
return 'Hazardous'
elif value > 500:
return 'Beyond Index' # 爆表了
else:
return None # 输入值无效
In [10]:
df_bj2015.loc[:, 'Grade'] = df_bj2015['Value'].apply(get_grade)
In [11]:
df_bj2015.head()
Out[11]:
In [12]:
# 从csv中读取北京2016年pm2.5数据,保存在DataFrame中
df_bj2016 = pd.read_csv('data/Beijing_2016_HourlyPM25_created20170201.csv')
# 重新设定各个字段的名称
df_bj2016.columns=['Year','Month','Day','Hour','Value','QC']
# 对错误和缺失值赋为空值
df_bj2016.loc[df_bj2016.Value<0,'Value']=np.nan
# 删除空值记录
df_bj2016.dropna(inplace=True)
#增加空气质量等级字段‘Grade’
df_bj2016.loc[:, 'Grade'] = df_bj2016['Value'].apply(get_grade)
In [13]:
df_bj2016.head()
Out[13]:
In [14]:
# 从csv中读取广州2016年pm2.5数据,保存在DataFrame中
df_gz2016 = pd.read_csv('data/Guangzhou_2016_HourlyPM25_created20170201.csv')
# 重新设定各个字段的名称
df_gz2016.columns=['Year','Month','Day','Hour','Value','QC']
# 对错误和缺失值赋为空值
df_gz2016.loc[df_gz2016.Value<0,'Value']=np.nan
# 删除空值记录
df_gz2016.dropna(inplace=True)
#增加空气质量等级字段‘Grade’
df_gz2016.loc[:, 'Grade'] = df_gz2016['Value'].apply(get_grade)
In [15]:
df_gz2016.head()
Out[15]:
In [16]:
# 从csv中读取广州2015年pm2.5数据,保存在DataFrame中
df_gz2015 = pd.read_csv('data/Guangzhou_2015_HourlyPM25_created20160201.csv')
# 重新设定各个字段的名称
df_gz2015.columns=['Year','Month','Day','Hour','Value','QC']
# 对错误和缺失值赋为空值
df_gz2015.loc[df_gz2015.Value<0,'Value']=np.nan
# 删除空值记录
df_gz2015.dropna(inplace=True)
#增加空气质量等级字段‘Grade’
df_gz2015.loc[:, 'Grade'] = df_gz2015['Value'].apply(get_grade)
In [17]:
df_gz2015.head()
Out[17]: