pandas 是基于 Numpy 构建的,让以 Numpy 为中心的应用变得更加简单。
pandas主要包括三类数据结构,分别是:
Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
Panel :三维的数组,可以理解为DataFrame的容器。
Pandas官网,更多功能请参考http://pandas-docs.github.io/pandas-docs-travis/index.html
#首先导入库
import pandas as pd
import numpy as np
Series
由一组数据(各种Numpy数据类型),以及一组与之相关的标签数据(即索引)组成。仅由一组数据即可产生最简单的Series,可以通过传递一个list对象来创建一个Seriess
s = pd.Series([1,3,5,np.nan,6,8])
s
获取 Series 的索引:
s.index
DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每一列的数据结构都是相同的,而不同的列之间则可以是不同的数据结构(数值、字符、布尔值等)。或者以数据库进行类比,DataFrame中的每一行是一个记录,名称为Index的一个元素,而每一列则为一个字段,是这个记录的一个属性。DataFrame既有行索引也有列索引,可以被看做由Series组成的字典(共用同一个索引)。
创建一个DataFrame,包括一个numpy array, 时间索引和列名字:
dates = pd.date_range('20130101', periods=6)
dates
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
通过传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame:
df2 = pd.DataFrame({'A':1.,
'B':pd.Timestamp('20130102'),
'C':pd.Series(1, index=list(range(4)),dtype='float32'),
'D':np.array([3] * 4, dtype='int32'),
'E':pd.Categorical(['test','train', 'test','train']),
'F':'foo'
})
df2
查看不同列的数据类型:
df2.dtypes
使用Tab自动补全功能会自动识别所有的属性以及自定义的列
查看数据
我们以平台获取的数据为例进行讲解:
# 获取平安银行近几个工作日的开盘价、最高价、最低价、收盘价。
df = get_price('000001.XSHE','2017-06-01','2017-06-14','1d',['open','high','low','close'])
df
查看前几条数据:
df.head()
查看后几条数据:
df.tail()
显示索引、列和底层的numpy数据:
df.index
查看 DataFrame 的列名
df.columns
查看 DataFrame 的值
df.values
describe()函数对于数据的快速统计汇总:
df.describe()
对数据的转置(tranverse):
df.T
按轴进行排序
df.sort_index(axis=1,ascending=False)
6.按值进行排序
df.sort_values(by= 'open',ascending = False)
选择数据
通过下标选取数据:
df[‘open’],df.open
以上两个语句是等效的,都是返回 df 名称为 open 列的数据,返回的为一个 Series。
df[0:3], df[‘2017-06-01′:’2017-06-05’]
下标索引选取的是 DataFrame 的记录,与 List 相同 DataFrame 的下标也是从0开始,区间索引的话,为一个左闭右开的区间,即[0:3]选取的为0-2三条记录。
与此等价,还可以用起始的索引名称和结束索引名称选取数据,如:df[‘a’:’b’]。有一点需要注意的是使用起始索引名称和结束索引名称时,也会包含结束索引的数据。具体看下方示例:
以上两种方式返回的都是DataFrame。
选择一列数据:
df['open']
选择多列数据:
df[['open','close']]
选择多行:
df[0:3]
df['2017-06-01':'2017-06-05']
使用标签选取数据:
df.loc[行标签,列标签]
df.loc[‘a’:’b’] #选取 ab 两行数据
df.loc[:,’open’] #选取 open 列的数据
df.loc 的第一个参数是行标签,第二个参数为列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,如果两个参数都为列表则返回的是 DataFrame,否则,则为 Series。
PS:loc为location的缩写。
df.loc['2017-06-01','open']
df.loc['2017-06-01':'2017-06-06']
df.loc[:, 'open']
df.loc['2017-06-01':'2017-06-06','open']
使用位置选取数据:
df.iloc[行位置,列位置]
df.iloc[1,1] #选取第二行,第二列的值,返回的为单个值
df.iloc[[0,2],:] #选取第一行及第三行的数据
df.iloc[0:2,:] #选取第一行到第三行(不包含)的数据
df.iloc[:,1] #选取所有记录的第二列的值,返回的为一个Series
df.iloc[1,:] #选取第一行数据,返回的为一个Series
PS:iloc 则为 integer & location 的缩写
df.iloc[1,1] # 选取第二行,第二列的值,返回的为单个值
df.iloc[[0,2],:] # 选取第一行及第三行的数据
df.iloc[0:2,:] # 选取第一行到第三行(不包含)的数据
df.iloc[:,1] # 选取所有记录的第一列的值,返回的为一个Series
df.iloc[1,:] # 选取第一行数据,返回的为一个Series
更广义的切片方式是使用.ix,它自动根据给到的索引类型判断是使用位置还是标签进行切片¶
df.ix[1,1]
df.ix['2017-06-01':'2017-06-05']
df.ix['2017-06-05','open']
df.ix[1,'open']
df.ix['2017-06-01',0]
通过逻辑指针进行数据切片:
df[逻辑条件]
df[df.one >= 2] #单个逻辑条件
df[(df.one >=1 ) & (df.one < 3) ] #多个逻辑条件组合
# 筛选出 open 大于 8.8 的数据
df[df.open > 9.12]
# 筛选出 open 大于 9.12 的数据,并且 close 小于 9.17 的数据
df[(df.open >9.12) & (df.close < 9.17)]
使用 条件过来更改数据。
df[df>10]
观察可以发现,df 中小于 9 的数都变为 NaN。
下面我们就把大于 9 的数赋值为0.
df[df > 9.12] = 0
df
发现大于 9.12 的数都被替换为了0.
使用isin()方法来过滤在指定列中的数据:
# 选取 high 列中数为 0 和 9 的数。
df[df['high'].isin([0.00,9.00])]
Panel
平台get_price,如果是多支股票, 则返回pandas.Panel对象。
可通过 panel[列标,行标,股票代码] 获取数据.
panel = get_price(['000001.XSHE','000002.XSHE'],'2017-06-01','2017-06-14', '1d', fields=['open','high','low','close'])
panel
由打印的结果可以看出:
列标(Items axis: close to open)
行标(Major_axis axis: 2017-06-01 00:00:00 to 2017-06-14 00:00:00)
股票代码(Minor_axis axis: 000001.XSHE to 000002.XSHE)
# 取出 'open'数据
panel['open',:,:]
# 取出 '2016-07-15'数据
panel[:,'2017-06-01',:]
# 取出 000001 的 DataFrame 数据
panel[:,:,'000001.XSHE']
Panel 操作与 DataFrame 基本相同,下节会为大家讲解 DataFrame 的数据处理与规整。
缺失数据处理
去掉包含缺失值的行:
# 获取平安银行近几个工作日的开盘价、最高价、最低价、收盘价。
df = get_price('000001.XSHE','2017-06-01','2017-06-14', '1d', fields=['open','high','low','close'])
df = df[df > 9.0]
df
df.dropna()
对缺失值进行填充:
df.fillna(value=0)
判断数据是否为nan,并进行布尔填充:
pd.isnull(df)
函数的应用和映射
df.mean()#列计算平均值
df.mean(1)#行计算平均值
df.mean(axis = 1,skipna = False) # skipna参数默认是 True 表示排除缺失值
常用的方法如上所介绍们,还要其他许多,可自行学习,下面罗列了一些,可供参考:
- count 非na值的数量
- describe 针对Series或个DataFrame列计算汇总统计
- min、max 计算最小值和最大值
- argmin、argmax 计算能够获取到最大值和最小值得索引位置(整数)
- idxmin、idxmax 计算能够获取到最大值和最小值得索引值
- quantile 计算样本的分位数(0到1)
- sum 值的总和
- mean 值得平均数
- median 值得算术中位数(50%分位数)
- mad 根据平均值计算平均绝对离差
- var 样本值的方差
- std 样本值的标准差
- skew 样本值得偏度(三阶矩)
- kurt 样本值得峰度(四阶矩)
- cumsum 样本值得累计和
- cummin,cummax 样本值得累计最大值和累计最小值
- cumprod 样本值得累计积
- diff 计算一阶差分(对时间序列很有用)
- pct_change 计算百分数变化
数据规整
Pandas提供了大量的方法能够轻松的对Series,DataFrame和Panel对象进行各种符合各种逻辑关系的合并操作
- concat 可以沿一条轴将多个对象堆叠到一起。
- append 将一行连接到一个DataFrame上
- duplicated 移除重复数据
concat
df1 = get_price('000001.XSHE','2017-06-01', '2017-06-14','1d',['open','high','low','close'])
df1
df2 = get_price('000001.XSHE','2017-05-15','2017-05-31','1d',['open','high','low','close'])
df2
pd.concat([df1,df2],axis=0)
横向拼接,index对不上的会用 NaN 填充:
pd.concat([df1,df2],axis=1)
append
df1
s = df1.iloc[0]
s
df1.append(s, ignore_index=False) # ignore_index=False 表示索引不变
df1.append(s, ignore_index=True) # ignore_index=True 表示索引重置
移除重复数据duplicated
z = df1.append(s, ignore_index=False)
z
查看重复数据:
z.duplicated()
Python编程系列目录:
1. Python编程系列1-变量、字符串与列表
2. Python编程系列2-字典、元组与集合
3. Python编程系列3-条件与循环
4. Python编程系列4-函数
5. Python编程系列5-Numpy库
6. Python编程系列6-Scipy库
当前阅读> 7. Python编程系列7-Pandas库
8. Python编程系列8-Matplotlib库