import os
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['savefig.dpi'] = 300 #图片像素
plt.rcParams['figure.dpi'] = 300 #分辨率
# 默认的像素:[6.0,4.0],分辨率为100,图片尺寸为 600&400
# 指定dpi=200,图片尺寸为 1200*800
# 指定dpi=300,图片尺寸为 1800*1200
# 设置figsize可以在不改变分辨率情况下改变比例
outpath = '/Users/miraco/PycharmProjects/DataMining/output3'
filepath = '/Users/miraco/PycharmProjects/DataMining/data_pd/happiness_report.csv'
#获取数据
data_df= pd.read_csv(filepath)
#数据处理
data_df.dropna(inplace = True)
# 先按照年份从小到大排序、同一年份内再按照幸福指数从大到小排序,默认是升序的
data_df.sort_values(['Year', 'Happiness Score'], ascending = [True, False], inplace= True)
print(data_df.head(),'\n--以上是多维排序结果--------------------------') #输出来看看
#按年度和区域进行分析,每年每个区的均值,这个是个多级索引的series
year_region_grouped_results = data_df.groupby(by = ['Year', 'Region'])['Happiness Score'].mean()
print(year_region_grouped_results.head(),'\n--以上是按年和地区的幸福指数均值聚合结果--------------------------')
#生成透视表,纵向按照地区,横向逐年查看,
year_region_pivot_results = pd.pivot_table(data_df,
index = 'Region',
columns ='Year',
values = ['Happiness Score', 'Economy (GDP per Capita)'],
aggfunc = 'mean',
)
print(year_region_pivot_results.head(),'\n--以上是按年聚类的幸福指数和人均GDP结果--------------------------')
#储存数据
year_region_grouped_results.to_csv(os.path.join(outpath, 'year_region_grouped_results.csv'))
year_region_pivot_results.to_csv(os.path.join(outpath, 'year_region_pivot_results.csv'))
#幸福指数绘图
year_region_pivot_results['Happiness Score'].plot(kind = 'bar',title = 'Happiness Score')
plt.tight_layout()
plt.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) #这里如果不指定位置,会使图例盖住柱状图
plt.show()
#人均GDP绘图
year_region_pivot_results['Economy (GDP per Capita)'].plot(kind = 'bar',title = 'Economy (GDP per Capita)')
plt.tight_layout()
# legend(loc = 'best')
plt.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) #这里如果不指定位置,会使图例盖住柱状图
plt.show()
运行结果
Country Region ... Economy (GDP per Capita) Year
141 Switzerland Western Europe ... 1.39651 2015
60 Iceland Western Europe ... 1.30232 2015
38 Denmark Western Europe ... 1.32548 2015
108 Norway Western Europe ... 1.45900 2015
25 Canada North America ... 1.32629 2015
[5 rows x 6 columns]
--以上是多维排序结果--------------------------
Year Region
2015 Australia and New Zealand 7.285000
Central and Eastern Europe 5.332931
Eastern Asia 5.626167
Latin America and Caribbean 6.144682
Middle East and Northern Africa 5.406900
Name: Happiness Score, dtype: float64
--以上是按年和地区的幸福指数均值聚合结果--------------------------
Economy (GDP per Capita) ... Happiness Score
Year 2015 ... 2017
Region ...
Australia and New Zealand 1.291880 ... 7.299000
Central and Eastern Europe 0.942438 ... 5.409931
Eastern Asia 1.151780 ... 5.646667
Latin America and Caribbean 0.876815 ... 5.957818
Middle East and Northern Africa 1.066973 ... 5.369684
[5 rows x 6 columns]
--以上是按年聚类的幸福指数和人均GDP结果--------------------------
输出的文件
需要注意的地方
多维升降序排序
data_df.sort_values(['Year', 'Happiness Score'], ascending = [True, False], inplace= True)
多维求均值,这个的得到的是一个series
year_region_grouped_results = data_df.groupby(by = ['Year', 'Region'])['Happiness Score'].mean()
双索引列表变透视表并均值聚合
year_region_pivot_results = pd.pivot_table(data_df,
index = 'Region',
columns ='Year',
values = ['Happiness Score', 'Economy (GDP per Capita)'],
aggfunc = 'mean',
)
练习:对PM2.5值按年月两列进行统计分析
题目描述:对PM2.5值按年月两列进行统计分析,并使用分组柱状图可视化分析结果
题目要求:
使用Pandas进行数据分析及可视化
数据文件:
pm2.csv,包含了2013-2015年某地区每天的PM2.5值。每行记录为1天的数据。
共4列数据,分别表示:
- Year: 年
- Month: 月
- Day: 日
- PM: PM2.5值
import pandas as pd
import matplotlib.pyplot as plt
import os
outpath = '/Users/miraco/PycharmProjects/DataMining/output3'
if not os.path.exists(outpath):
os.makedirs(outpath)
filepath = '/Users/miraco/PycharmProjects/DataMining/data_pd/pm2.csv'
#数据获取
data_df = pd.read_csv(filepath).dropna()
#数据处理
data_df_group = data_df.groupby(['Year','Month'])['PM'].mean()
pivot_results = pd.pivot_table(data_df,
index = 'Year',
columns= 'Month',
values = 'PM',
aggfunc = 'mean'
)
data_df_group.to_csv(os.path.join(outpath, 'data_df_group.csv'))
pivot_results.to_csv(os.path.join(outpath, 'pivot_results'))
data_df_group.plot(kind = 'bar')
plt.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) #这里如果不指定位置,会使图例盖住柱状图
plt.tight_layout()
plt.show()
pivot_results.plot(kind = 'bar')
plt.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) #这里如果不指定位置,会使图例盖住柱状图
plt.tight_layout()
plt.show()
运行结果