pandas是一种专门分析处理数据的库
# 1 Series & dataFrame 主要的数据结构
# 2 Basic & Select & Set 基本操作
# 3 Missing Data Processing 丢失值处理
# 4 Merge & Reshape 数据融合 形状定义
# 5 Time Series & Graph & Files 时间序列 图形绘制 文件操作
#encoding=utf-8
'''
pandas 数据分析库
是为了解决数据分析任务而创建的一种基于numpy的工具
纳入了大量的库和一些标准的数据模型,提供了非常高效的操作大型数据集的方法,提供了大量使我们快速的便捷的处理数据的函数
使得python成为广泛使用的高效的数据环境
官网:http://pandas.pydata.org
'''
import numpy as np
import pandas as pd
from pylab import *
def main():
# 1、pandas基础数据结构Series & DataFrame
s=pd.Series([i*2 for i in range(1,11)])#series是pandas当中一个基本的数据结构,填入数组1~10
print(type(s))#得<class 'pandas.core.series.Series'>
dates=pd.date_range("20170301",periods=8)#periods表示8天,下面是第二个数据结构,dataframe
df=pd.DataFrame(np.random.randn(8,5),index=dates,columns=list("ABCDE"))
#定义8行5列随机数,index是主键(索引),columns表示属性命名,这里list将字符串序列化可以得到一个数组
print(df)
#dataframe还有下面这种定义方式,分别定义各个属性的值
# df=pd.DataFrame({"A":1,"B":pd.Timestamp("20170301"),"C":pd.Series(1,index=list(range(4)),dtype="float32"),\
# "D":np.array([3]*4,dtype="float32"),"E":pd.Categorical(["police","student","teacher","doctor"])})
# print(df)
#2、pandas基本操作Basic & Select & Set
#basic
print(df.head(3))#head就是打印出前几行
print(df.tail(3))#tail就是打印出后几行
print(df.index)#可以直接打印出dataframe的index
print(df.values)#values已经是数组了
print(df.T) # 矩阵转置
#print(df.sort(columns="C")) # 排序,可以针对某一列进行排序,升序,index也变了
print(df.sort_index(axis=1,ascending=False)) # axis=1表示通过属性值进行排序,ascending=False表示进行 降序
print(df.describe()) # 打印出所有属性值的数量,可大致了解数据
#select
print("下面开始学select")
print(type(df["A"])) #得<class 'pandas.core.series.Series'>,dataframe由各个series组成的,series是dataframe的一个特例,所以操作通用
print(df[:3]) # 数组中可以直接这么用,dataframe也可以用下标进行切片
print(df["20170301":"20170304"]) #用index进行切片
print(df.loc[dates[0]])#更为通用的可以用loc函数进行处理
print(df.loc["20170301":"20170304",["B","D"]])#进行多维度的进行选择,取20170301到20170304的数据且B列到D列的数据
print(df.at[dates[0],"C"])#也可以通过at指定特定的一个值
#print(df.at[20170301,"C"]) 但这样写不行
print("上面通过索引进行选择,下面通过下标进行选择")#通过命令iloc
print(df.iloc[1:3,2:4])#1到3行且2到4列,左包含右不包含
print(df.iloc[1,4])#指定一个
print(df.iat[1, 4])
print("有条件语句")
print(df[df.B>0][df.A<0])#注意这里是df.B不能直接写成B
print(df[df> 0])#表里>0的元素直接返回数,<0的元素返回NaN
print(df[df["E"].isin([1,2])])#表示数值是不是在后面的范围里,因为表里都是浮点数,所以应该返回空即Index: []
#set
print("对dataframe属性进行设置修改")
s1=pd.Series(list(range(10,18)),index=pd.date_range("20170301",periods=8))
df["F"]=s1
print(df)#可得新加了属性F一列
df.at[dates[0],"A"]=0
print(df)
df.iat[1,1]=1
df.loc[:,"D"]=np.array([4]*len(df))#D列全赋成4,这里需要添加一个数组
print(df)
df2=df.copy()
df2[df2>0]=-df2#把所有>0的数变成负的,于是表里所有数都变成负数了
print(df2)
#3、pandas缺失值处理Missing Data Processing
#Missing Values
print("Missing Values")
df1=df.reindex(index=dates[:4],columns=list("ABCD")+["G"])
#定义的df1取df的前四行,columns取ABCD列且加一个G列
df1.loc[dates[0]:dates[1],"G"]=1#给G列的第一行第二行进行赋值成1
print(df1)#其中有NaN值,也就是所谓空值
#缺失的处理方式有两种,一种是直接丢弃,另一种是进行填充,包括填充固定值以及插值(可参考scipy中插值算法)
print(df1.dropna())#带有NaN的两行数据没了
print(df1.fillna(value=2))
#4、pandas表统计与整合 数据融合和形状定义Merge&Reshape
#Statistic
print("统计方面的应用")
print(df.mean())#求所有属性的均值,返回结果的属性就是series
print(df.var()) #求方差
s=pd.Series([1,2,4,np.nan,5,7,9,10],index=dates)
print(s)
print(s.shift(2))#把所有的值移位2个,而后面的值不会补到前面,前面的值为NaN
print(s.diff())#不填数字表示一阶,递减的结果,第一个数字前面没有,所以减去的结果是NaN
print(s.value_counts())#每一个值在series当中出现的次数,绘制直方图比较方便
print(df.apply(np.cumsum))#通过apply直接填入函数,cumsum表示后面所有的值都是前面的累加值,参考D列
print(df.apply(lambda x:x.max()-x.min()))#还可以自定义函数,打印每个属性的最大值和最小值的差,即极差
#Concat
print("表格拼接和类sql的操作")
pieces=[df[:3],df[-3:]]
print(pd.concat(pieces))#拼接df的前三行和df的后三行
left=pd.DataFrame({"key":["x","y"],"value":[1,2]})#key和value是两个属性
right=pd.DataFrame({"key":["x","z"],"value":[3,4]})
print("LEFT:",left)
print("RIGHT:",right)
print(pd.merge(left,right,on="key",how="left"))#类似sql中的join函数
# 保留了左边的x和y,根据key属性拼接,拼接方式how是left,默认为inner会去掉所有不同的,也可以是outer,所有值都会有
df3=pd.DataFrame({"A":["a","b","c","b"],"B":list(range(4))})
print(df3.groupby("A").sum())#按照A属性分类,将B聚合
#Reshape
print("透视功能,交叉分析,透视表")
import datetime
df4=pd.DataFrame({'A':['one','one','two','three']*6,#这表格有24行
'B':['a','b','c']*8,
'C':['foo','foo','foo','bar','bar','bar']*4,
'D':np.random.randn(24),
'E':np.random.randn(24),
'F':[datetime.datetime(2017,i,1) for i in range(1,13)]+#F属性元素都是拼接来的
[datetime.datetime(2017, i, 15) for i in range(1, 13)]})
print(pd.pivot_table(df4,values="D",index=["A","B"],columns=["C"]))#透视交叉表的命令是pivot_table
#对df4进行操作,输出值是D,赋值项是A和B,列值是C,F没用到即为空
#5、pandas时间序列、图形绘制和文件操作Time Series & Graph & Files
#Time Series
print("时间序列")
t_exam=pd.date_range("20170301",periods=10,freq="S")#periods定义有多少个时间段,freq参数定义为s表示秒
print(t_exam)
#Graph
print("绘图功能")#除了用matplotlib实现,pandas可自己实现画图
ts=pd.Series(np.random.randn(1000),index=pd.date_range("20170301",periods=1000))
ts=ts.cumsum()
ts.plot()
show()
#File
print("文件操作")
df6=pd.read_csv("./data/test.csv")
print("Csv",df6)
df7 = pd.read_excel("./data/test.xlsx","Sheet1")
print("Excel",df7)
df6.to_csv("./data/test2.csv")
df7.to_excel("./data/test2.xlsx")
if __name__=='__main__':
main()
pandas:数据分析库

#pandas数据分析官网:
http://pandas.pydata.org/
pandas 官网