这篇分析是来自于《Python科学计算(第二版)》中的一篇实践,也是我在学习利用Python进行数据分析的第一个案例实践,在此分享给大家。
我在重现过程中发现有些代码已经不能够使用,所以我用我能够实现的方法重现了一下。分析的主要过程、思路还是书上的内容。
导入库
直接先导入最常用的几个数据分析库,如果分析过程中需要其他库,再添加。
# 导入数据库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
from IPython.display import display
plt.style.use('fivethirtyeight')
sns.set_style({'font.sans-serif':['simhei','Arial']})
%matplotlib inline
导入数据
导入HDF5格式的数据
# 使用HDFStore打开保存的HDF5数据
store = pd.HDFStore('data/aqi.hdf5')
# 调用select()读入所有数据
df_aqi = store.select('aqi')
# 显示前n行数据,n默认为5
df_aqi.head()
清洗城市名
# 使用value_counts()查看所有的城市名
df_aqi.City.value_counts()
天津 134471
北京 109999
上海 92745
天津市 13
北京市 12
上海市 10
Name: City, dtype: int64
同一个城市有两个名字,清洗城市名使其统一,并转化为分类格式
# 使用str.replace()统一城市名,并将其转化为分类类型
df_aqi['City'] = df_aqi.City.str.replace('市', '').astype('category')
df_aqi.City.value_counts()
天津 134484
北京 110011
上海 92755
Name: City, dtype: int64
相关性及热力图
AQI列是空气质量的评分,而其他的数值列为各种成分的指标值。下面通过corr()计算这些值的相关性。
# 使用corr()计算相关性
corr = df_aqi.corr()
corr
由上表绘制相关系数热力图,由图可知空气质量指数与PM2.5的相关性最大,而与O3略呈负相关性。
# 绘制相关系数热力图
plt.subplots(figsize=(8, 8))
sns.heatmap(corr, annot=True, vmax=1, square=True, cmap="Blues")
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.show()空气质量参数之间的相关性
每座城市PM2.5日平均值分布
按照日期、城市分组,并计算平均值,再使用unstack()转换为日期、城市数据的DataFrame对象。
# 使用groupby按照日期、城市分组
daily_city_groupby = df_aqi.groupby([df_aqi.Time.dt.date, 'City'])
# 计算每个分组PM2.5平均值,使用unstack()将第一级索引转换为列
mean_pm2_5 = daily_city_groupby.PM2_5.mean().unstack()
mean_pm2_5.head()
绘制直方统计图和核密度估计分布图,由于使用高斯核,因此图中均值小于0的概率密度不为0。
# 绘制直方统计图
mean_pm2_5.plot(kind='hist', histtype='step', bins=20, density=True, lw=10, figsize=(15,5))
# 绘制密度估计分布图
ax = mean_pm2_5.plot(kind='kde', figsize=(15,5))
ax.set_xlim(0, 400)
plt.show()每座城市的日平均PM2.5的分布图
# 三座城市PM2.5相关性
mean_pm2_5.corr()
一星期中每天的PM2.5平均值
将数据按照星期几、城市分组,求出PM2.5平均值,绘制柱形图。北京周四、周五、周六的空气质量比其他时候差。
# 统计一星期中每天的PM2.5平均值
week_mean = df_aqi.groupby([df_aqi.Time.dt.dayofweek, 'City']).PM2_5.mean()
# 绘制柱形图
ax = week_mean.unstack().plot(kind='bar', figsize=(15,5))
ax.legend(bbox_to_anchor=(0, 1.02, 1, 0.102), loc=3,
ncol=3, mode='expand', borderaxespad=0, fontsize=15)
plt.xticks(range(7), ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], rotation=0, fontsize=15)
plt.yticks(fontsize=15)
plt.show()一星期中PM2.5的平均值
一天中每小时的PM2.5的平均值
统计一天中每个小时的PM2.5的平均值,并绘制柱形图。
可以看出北京、天津下午的空气质量要好一点。
# 统计每个小时的PM2.5平均值
hour_mean = df_aqi.groupby([df_aqi.Time.dt.hour, 'City']).PM2_5.mean()
# 绘制柱形图
ax = hour_mean.unstack().plot(kind='bar', figsize=(15,5))
ax.legend(bbox_to_anchor=(0, 1.02, 1, 0.102), loc=3,
ncol=3, borderaxespad=0.102)
plt.show()一天中不同时段的PM2.5的平均值
北京各个观测点PM2.5平均值
选择北京这个城市,然后逐月、逐地点求PM2.5的平均值,再逐地点求月平均,获得每个观测点的平均值,并排序,绘制柱形图。
# 选择城市为北京的数据
df_bj = df_aqi.query("City=='北京'")
# 按月份、位置分组
month_place_mean = df_bj.groupby([df_bj.Time.dt.to_period('M'), 'Position']).PM2_5.mean()
# 计算每月、每个位置的平均值,并排序
place_mean = month_place_mean.mean(level=1).sort_values()
#绘制柱形图
place_mean.plot(kind='bar', figsize=(15,5))
plt.xticks(rotation=0, fontsize=15)
plt.yticks(fontsize=15)
plt.show()北京市各个观测点的PM2.5平均值
选择最好和最差的各两个观测点,显示他们每个月的平均值。
# 选择空气质量最好和最差的两个位置,绘图
places = place_mean.iloc[[0, 1, -2, -1]].index
month_place_mean.unstack().loc[:, places].plot(kind='bar', figsize=(15, 5), width=0.8)
plt.show()北京市个观测点的月平均PM2.5