可视化是数据分析的重要一环,也是python比较擅长的工作,本笔记系列尽可能采用统一的数据源和基于matplotlib原生版本进行可视化。
数据源是从国家统计局网站上下载的2000年-2017年的全国各省、直辖市、自治区的GDP数据和人口统计数据,2018年的数据尚未公布,不过网上已公布,可作为后续机器学习预测的比对目标;数据源采用csv格式。
本笔记是基于pandas进行数据读取的,因此也简单的总结了一下pandas的一些常规操作,比如文件读取、数据显示、数据分布、数据列名的展示,数据的分组和统计,数据的排序,行列数据的汇总,以及行列的转换。
其次本文简单演示了一下如何展示行数据和列数据,以及如何展示多列数据。
本系列的最终目标是通过GDP和人口统计数据集来演示matplotlib的各种主要图表。
代码示例
-
import pandas as pd
-
import numpy as np
-
import matplotlib.pyplot as plt
-
import matplotlib
-
#--------------------------获取相关数据------------------------
-
#从国家统计局下载2000年-2017年GDP数据和人口数据
-
#打开GDP数据文件,并输出其前五行,各列数据分布、各列名
-
'''
-
df=pd.read_csv('GDP.csv', encoding = "gbk")
-
print(df.head())
-
print(df.describe())
-
print(list(df.columns.values))
-
'''
-
#打开人口数据文件,并输出其前五行,各列数据分布、各列名
-
df=pd.read_csv('population.csv', encoding = "gbk",index_col=1)
-
print(df.head())
-
print(df.describe())
-
#-----------以下为六种列名打印方法,均以数组形式返回------------
-
print([column for column in df])
-
print(list(df))
-
print(list(df.columns))
-
print(list(df.columns.values))
-
print(list(df.columns.tolist()))
-
print([i for i in df.columns if i not in ['区域', '地区']])
-
#------------------dataframe进行groupby分组----------------------
-
#对个别维度进行分组统计
-
print(df.groupby('区域').sum())
-
#对多个维度进行分组统计
-
print(df.groupby(['区域','地区']).mean())
-
#对多个指标按照不同规则进行分组统计
-
print(df.groupby('区域').agg({'2017年':[np.mean, 'sum'],
-
'2016年':['count',np.std],
-
'2015年':[np.average,np.max,np.min,np.std,np.sum],
-
'2014年':['count','min', 'mean', 'max'],
-
'2013年':['min',np.min,'max',np.max]}))
-
#------------------datafame增加新列或新行----------------------
-
#新增一列汇总列,对同行数据进行汇总
-
#由于前两列是非数字列,所以要从第三列开始统计2017年~2000年的数字
-
#df['total'] = df.apply(lambda x: x.sum(), axis=1)
-
df['total'] = df.apply(lambda x: x[2:].sum(), axis=1)
-
#新增一行,对同一列数据进行汇总
-
#df.loc['row_total'] = df.apply(lambda x: x.sum())
-
#---------------------dataframe排序-----------------------------
-
#Dataframe排序,但不影响实际存储值
-
df.sort_values(by="total",ascending= False)
-
print(df.sort_values(by="total",ascending= False))
-
#-------------------dataframe行列转换---------------------------
-
df2=df.stack()
-
print(df2)
-
#-------------------dataframe简单画图----------------------------
-
matplotlib.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
-
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
-
#对某列数据画图
-
#df['2017年'].plot()
-
#对索引行数据画图,时间是倒序的,为了体现社会主义优越性,只好把行转置一下顺序
-
#df.loc['北京市'][2:19].plot()
-
#df.loc['北京市'][18:2:-1].plot()
-
#plt.show()
-
fig=plt.figure()
-
#取2010年和2017年的列数据作图
-
ax=fig.add_subplot(3,1,1)
-
ax.plot(df['2017年'].values)
-
ax.plot(df['2000年'].values)
-
#取2010年到2017年的列数据作图
-
ax1=fig.add_subplot(3,1,2)
-
colname=[i for i in df.columns if i not in ['区域', '地区','total']]
-
for i in colname:
-
ax1.plot(df[i].values)
-
#取北京市2010年到2017年的行数据作图,并且倒排序
-
ax2=fig.add_subplot(3,1,3)
-
ax2.plot(df.loc['北京市'][18:2:-1])
-
plt.xticks(rotation=90)
-
plt.show()