可视化是数据分析的重要一环,也是python比较擅长的工作,本笔记系列尽可能采用统一的数据源和基于matplotlib原生版本进行可视化。
数据源是从国家统计局网站上下载的2000年-2017年的全国各省、直辖市、自治区的GDP数据和人口统计数据,2018年的数据尚未公布,不过网上已公布,可作为后续机器学习预测的比对目标;数据源采用csv格式。
本笔记是基于pandas进行数据读取的,因此也简单的总结了一下pandas的一些常规操作,比如文件读取、数据显示、数据分布、数据列名的展示,数据的分组和统计,数据的排序,行列数据的汇总,以及行列的转换。
其次本文简单演示了一下如何展示行数据和列数据,以及如何展示多列数据。
本系列的最终目标是通过GDP和人口统计数据集来演示matplotlib的各种主要图表。
代码示例
代码语言:javascript复制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()