pandas 是基于 Numpy 构建的,让以 Numpy 为中心的应用变得更加简单。
平台获取的数据主要是 DataFrame 的形式,它便是 pandas 中的。
除此之外,pandas 还包括 一位数组series 以及三维的Panel。
下面将进行详细介绍:
-
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
本节主要讲解 DataFrame 的数据查看与选择
In [84]:
# 首先导入库 import pandas as pd
1. Series
由一组数据(各种Numpy数据类型),以及一组与之相关的标签数据(即索引)组成。仅由一组数据即可产生最简单的Series,可以通过传递一个list对象来创建一个Series,pandas会默认创建整型索引,更多series内容请参考官网 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html
创建一个Series:
In [3]:
s = pd.Series([1,3,5,np.nan,6,8]) s
Out[3]:
0 1 1 3 2 5 3 NaN 4 6 5 8 dtype: float64
获取 Series 的索引:
In [4]:
s.index
Out[4]:
Int64Index([0, 1, 2, 3, 4, 5], dtype='int64')
由于 Series 的用法在后续的 DataFrame 讲解及涉及,所以这了不做过多介绍,精彩内容请往下看。
2. DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每一列的数据结构都是相同的,而不同的列之间则可以是不同的数据结构(数值、字符、布尔值等)。或者以数据库进行类比,DataFrame中的每一行是一个记录,名称为Index的一个元素,而每一列则为一个字段,是这个记录的一个属性。DataFrame既有行索引也有列索引,可以被看做由Series组成的字典(共用同一个索引)。
更多内容请参考:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html
2.1 创建一个DataFrame,包括一个numpy array, 时间索引和列名字:
In [6]:
dates = pd.date_range('20130101',periods=6) dates
Out[6]:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D', tz=None)
In [7]:
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD')) df
Out[7]:
A | B | C | D | |
---|---|---|---|---|
2013-01-01 | 0.970600 | 1.034030 | -1.195059 | -1.202971 |
2013-01-02 | 0.514210 | 1.438718 | 0.983266 | -0.561351 |
2013-01-03 | 0.374372 | -0.995714 | 0.457419 | 0.801048 |
2013-01-04 | -1.806843 | -1.307637 | 0.162970 | -1.051681 |
2013-01-05 | -0.056926 | -1.308821 | -1.128257 | -0.532996 |
2013-01-06 | -0.606822 | 0.213184 | -1.159009 | -1.218311 |
In [13]:
df.<TAB>
File "<ipython-input-13-8b5fccb86f33>", line 1 df.<TAB> ^ SyntaxError: invalid syntax
2.2 查看数据
我们以平台获取的数据为例进行讲解:
In [77]:
# 获取平安银行近几个工作日的开盘价、最高价、最低价、收盘价。 df = get_price('000001.XSHE',start_date='2016-07-01', end_date='2016-07-20', frequency='daily', fields=['open','high','low','close']) df
Out[77]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
2016-07-06 | 8.80 | 8.82 | 8.76 | 8.79 |
2016-07-07 | 8.79 | 8.80 | 8.74 | 8.78 |
2016-07-08 | 8.79 | 8.79 | 8.73 | 8.74 |
2016-07-11 | 8.75 | 8.79 | 8.74 | 8.75 |
2016-07-12 | 8.75 | 8.89 | 8.74 | 8.88 |
2016-07-13 | 8.88 | 9.05 | 8.86 | 8.99 |
2016-07-14 | 8.97 | 9.00 | 8.91 | 8.94 |
2016-07-15 | 8.95 | 9.00 | 8.91 | 8.99 |
2016-07-18 | 8.99 | 9.08 | 8.97 | 9.04 |
2016-07-19 | 9.04 | 9.05 | 8.95 | 8.97 |
2016-07-20 | 8.96 | 8.99 | 8.95 | 8.96 |
查看前几条数据:
In [20]:
df.head()
Out[20]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
2016-07-06 | 8.80 | 8.82 | 8.76 | 8.79 |
2016-07-07 | 8.79 | 8.80 | 8.74 | 8.78 |
查看后几条数据:
In [21]:
df.tail()
Out[21]:
open | high | low | close | |
---|---|---|---|---|
2016-07-14 | 8.97 | 9.00 | 8.91 | 8.94 |
2016-07-15 | 8.95 | 9.00 | 8.91 | 8.99 |
2016-07-18 | 8.99 | 9.08 | 8.97 | 9.04 |
2016-07-19 | 9.04 | 9.05 | 8.95 | 8.97 |
2016-07-20 | 8.96 | 8.99 | 8.95 | 8.96 |
查看 DataFrame 的索引
In [22]:
df.index
Out[22]:
DatetimeIndex(['2016-07-01', '2016-07-04', '2016-07-05', '2016-07-06', '2016-07-07', '2016-07-08', '2016-07-11', '2016-07-12', '2016-07-13', '2016-07-14', '2016-07-15', '2016-07-18', '2016-07-19', '2016-07-20'], dtype='datetime64[ns]', freq=None, tz=None)
查看 DataFrame 的列名
In [23]:
df.columns
Out[23]:
Index([u'open', u'high', u'low', u'close'], dtype='object')
查看 DataFrame 的值
In [24]:
df.values
Out[24]:
array([[ 8.69, 8.73, 8.68, 8.71], [ 8.69, 8.86, 8.67, 8.81], [ 8.8 , 8.83, 8.77, 8.81], [ 8.8 , 8.82, 8.76, 8.79], [ 8.79, 8.8 , 8.74, 8.78], [ 8.79, 8.79, 8.73, 8.74], [ 8.75, 8.79, 8.74, 8.75], [ 8.75, 8.89, 8.74, 8.88], [ 8.88, 9.05, 8.86, 8.99], [ 8.97, 9. , 8.91, 8.94], [ 8.95, 9. , 8.91, 8.99], [ 8.99, 9.08, 8.97, 9.04], [ 9.04, 9.05, 8.95, 8.97], [ 8.96, 8.99, 8.95, 8.96]])
使用 describe() 函数对于数据的快速统计汇总:
In [25]:
df.describe()
Out[25]:
open | high | low | close | |
---|---|---|---|---|
count | 14.000000 | 14.000000 | 14.000000 | 14.000000 |
mean | 8.846429 | 8.905714 | 8.812857 | 8.868571 |
std | 0.116461 | 0.118043 | 0.107018 | 0.110722 |
min | 8.690000 | 8.730000 | 8.670000 | 8.710000 |
25% | 8.760000 | 8.805000 | 8.740000 | 8.782500 |
50% | 8.800000 | 8.875000 | 8.765000 | 8.845000 |
75% | 8.957500 | 9.000000 | 8.910000 | 8.967500 |
max | 9.040000 | 9.080000 | 8.970000 | 9.040000 |
对数据的转置:
In [26]:
df.T
Out[26]:
2016-07-01 00:00:00 | 2016-07-04 00:00:00 | 2016-07-05 00:00:00 | 2016-07-06 00:00:00 | 2016-07-07 00:00:00 | 2016-07-08 00:00:00 | 2016-07-11 00:00:00 | 2016-07-12 00:00:00 | 2016-07-13 00:00:00 | 2016-07-14 00:00:00 | 2016-07-15 00:00:00 | 2016-07-18 00:00:00 | 2016-07-19 00:00:00 | 2016-07-20 00:00:00 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
open | 8.69 | 8.69 | 8.80 | 8.80 | 8.79 | 8.79 | 8.75 | 8.75 | 8.88 | 8.97 | 8.95 | 8.99 | 9.04 | 8.96 |
high | 8.73 | 8.86 | 8.83 | 8.82 | 8.80 | 8.79 | 8.79 | 8.89 | 9.05 | 9.00 | 9.00 | 9.08 | 9.05 | 8.99 |
low | 8.68 | 8.67 | 8.77 | 8.76 | 8.74 | 8.73 | 8.74 | 8.74 | 8.86 | 8.91 | 8.91 | 8.97 | 8.95 | 8.95 |
close | 8.71 | 8.81 | 8.81 | 8.79 | 8.78 | 8.74 | 8.75 | 8.88 | 8.99 | 8.94 | 8.99 | 9.04 | 8.97 | 8.96 |
按列对 DataFrame 进行排序
In [28]:
df.sort(columns='open')
Out[28]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
2016-07-11 | 8.75 | 8.79 | 8.74 | 8.75 |
2016-07-12 | 8.75 | 8.89 | 8.74 | 8.88 |
2016-07-07 | 8.79 | 8.80 | 8.74 | 8.78 |
2016-07-08 | 8.79 | 8.79 | 8.73 | 8.74 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
2016-07-06 | 8.80 | 8.82 | 8.76 | 8.79 |
2016-07-13 | 8.88 | 9.05 | 8.86 | 8.99 |
2016-07-15 | 8.95 | 9.00 | 8.91 | 8.99 |
2016-07-20 | 8.96 | 8.99 | 8.95 | 8.96 |
2016-07-14 | 8.97 | 9.00 | 8.91 | 8.94 |
2016-07-18 | 8.99 | 9.08 | 8.97 | 9.04 |
2016-07-19 | 9.04 | 9.05 | 8.95 | 8.97 |
2.3 选择数据
2.3.1 通过下标选取数据:
df['open'],df.open
以上两个语句是等效的,都是返回 df 名称为 open 列的数据,返回的为一个 Series。
df[0:3], df['2016-07-05':'2016-07-08']
下标索引选取的是 DataFrame 的记录,与 List 相同 DataFrame 的下标也是从0开始,区间索引的话,为一个左闭右开的区间,即[0:3]选取的为0-2三条记录。
与此等价,还可以用起始的索引名称和结束索引名称选取数据,如:df['a':'b']。有一点需要注意的是使用起始索引名称和结束索引名称时,也会包含结束索引的数据。具体看下方示例:
以上两种方式返回的都是DataFrame。
选择一列数据:
In [37]:
df['open']
Out[37]:
2016-07-01 8.69 2016-07-04 8.69 2016-07-05 8.80 2016-07-06 8.80 2016-07-07 8.79 2016-07-08 8.79 2016-07-11 8.75 2016-07-12 8.75 2016-07-13 8.88 2016-07-14 8.97 2016-07-15 8.95 2016-07-18 8.99 2016-07-19 9.04 2016-07-20 8.96 Name: open, dtype: float64
选择多列数据:
In [31]:
df[['open','close']]
Out[31]:
open | close | |
---|---|---|
2016-07-01 | 8.69 | 8.71 |
2016-07-04 | 8.69 | 8.81 |
2016-07-05 | 8.80 | 8.81 |
2016-07-06 | 8.80 | 8.79 |
2016-07-07 | 8.79 | 8.78 |
2016-07-08 | 8.79 | 8.74 |
2016-07-11 | 8.75 | 8.75 |
2016-07-12 | 8.75 | 8.88 |
2016-07-13 | 8.88 | 8.99 |
2016-07-14 | 8.97 | 8.94 |
2016-07-15 | 8.95 | 8.99 |
2016-07-18 | 8.99 | 9.04 |
2016-07-19 | 9.04 | 8.97 |
2016-07-20 | 8.96 | 8.96 |
选择多行:
In [32]:
df[0:3]
Out[32]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
或者按 index 选取:
In [42]:
df['2016-07-05':'2016-07-08']
Out[42]:
open | high | low | close | |
---|---|---|---|---|
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
2016-07-06 | 8.80 | 8.82 | 8.76 | 8.79 |
2016-07-07 | 8.79 | 8.80 | 8.74 | 8.78 |
2016-07-08 | 8.79 | 8.79 | 8.73 | 8.74 |
2.3.2 使用标签选取数据:
df.loc[行标签,列标签]
df.loc['a':'b'] #选取 ab 两行数据
df.loc[:,'open'] #选取 open 列的数据
df.loc 的第一个参数是行标签,第二个参数为列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,如果两个参数都为列表则返回的是 DataFrame,否则,则为 Series。
PS:loc为location的缩写。
In [44]:
df.loc['2016-07-05','open']
Out[44]:
8.8000000000000007
In [46]:
df.loc['2016-07-05':'2016-07-08']
Out[46]:
open | high | low | close | |
---|---|---|---|---|
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
2016-07-06 | 8.80 | 8.82 | 8.76 | 8.79 |
2016-07-07 | 8.79 | 8.80 | 8.74 | 8.78 |
2016-07-08 | 8.79 | 8.79 | 8.73 | 8.74 |
In [47]:
df.loc[:, 'open']
Out[47]:
2016-07-01 8.69 2016-07-04 8.69 2016-07-05 8.80 2016-07-06 8.80 2016-07-07 8.79 2016-07-08 8.79 2016-07-11 8.75 2016-07-12 8.75 2016-07-13 8.88 2016-07-14 8.97 2016-07-15 8.95 2016-07-18 8.99 2016-07-19 9.04 2016-07-20 8.96 Name: open, dtype: float64
In [48]:
df.loc['2016-07-05':'2016-07-08','open']
Out[48]:
2016-07-05 8.80 2016-07-06 8.80 2016-07-07 8.79 2016-07-08 8.79 Name: open, dtype: float64
2.3.3. 使用位置选取数据:
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 的缩写
In [64]:
df
Out[64]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
2016-07-06 | 8.80 | 8.82 | 8.76 | 8.79 |
2016-07-07 | 8.79 | 8.80 | 8.74 | 8.78 |
2016-07-08 | 8.79 | 8.79 | 8.73 | 8.74 |
2016-07-11 | 8.75 | 8.79 | 8.74 | 8.75 |
2016-07-12 | 8.75 | 8.89 | 8.74 | 8.88 |
2016-07-13 | 8.88 | 9.05 | 8.86 | 8.99 |
2016-07-14 | 8.97 | 9.00 | 8.91 | 8.94 |
2016-07-15 | 8.95 | 9.00 | 8.91 | 8.99 |
2016-07-18 | 8.99 | 9.08 | 8.97 | 9.04 |
2016-07-19 | 9.04 | 9.05 | 8.95 | 8.97 |
2016-07-20 | 8.96 | 8.99 | 8.95 | 8.96 |
In [58]:
df.iloc[1,1] # 选取第二行,第二列的值,返回的为单个值
Out[58]:
8.8599999999999994
In [59]:
df.iloc[[0,2],:] # 选取第一行及第三行的数据
Out[59]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
In [60]:
df.iloc[0:2,:] # 选取第一行到第三行(不包含)的数据
Out[60]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
In [61]:
df.iloc[:,1] # 选取所有记录的第一列的值,返回的为一个Series
Out[61]:
2016-07-01 8.73 2016-07-04 8.86 2016-07-05 8.83 2016-07-06 8.82 2016-07-07 8.80 2016-07-08 8.79 2016-07-11 8.79 2016-07-12 8.89 2016-07-13 9.05 2016-07-14 9.00 2016-07-15 9.00 2016-07-18 9.08 2016-07-19 9.05 2016-07-20 8.99 Name: high, dtype: float64
In [57]:
df.iloc[1,:] # 选取第一行数据,返回的为一个Series
Out[57]:
open 8.69 high 8.86 low 8.67 close 8.81 Name: 2016-07-04 00:00:00, dtype: float64
2.3.4. 更广义的切片方式是使用.ix,它自动根据给到的索引类型判断是使用位置还是标签进行切片
df.ix[1,1]
df.ix['a':'b']
In [63]:
df
Out[63]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
2016-07-06 | 8.80 | 8.82 | 8.76 | 8.79 |
2016-07-07 | 8.79 | 8.80 | 8.74 | 8.78 |
2016-07-08 | 8.79 | 8.79 | 8.73 | 8.74 |
2016-07-11 | 8.75 | 8.79 | 8.74 | 8.75 |
2016-07-12 | 8.75 | 8.89 | 8.74 | 8.88 |
2016-07-13 | 8.88 | 9.05 | 8.86 | 8.99 |
2016-07-14 | 8.97 | 9.00 | 8.91 | 8.94 |
2016-07-15 | 8.95 | 9.00 | 8.91 | 8.99 |
2016-07-18 | 8.99 | 9.08 | 8.97 | 9.04 |
2016-07-19 | 9.04 | 9.05 | 8.95 | 8.97 |
2016-07-20 | 8.96 | 8.99 | 8.95 | 8.96 |
In [62]:
df.ix[1,1]
Out[62]:
8.8599999999999994
In [66]:
df.ix['2016-07-01':'2016-07-05']
Out[66]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
In [67]:
df.ix['2016-07-05','open']
Out[67]:
8.8000000000000007
In [68]:
df.ix[1,'open']
Out[68]:
8.6899999999999995
In [70]:
df.ix['2016-07-01',0]
Out[70]:
8.6899999999999995
2.3.5 通过逻辑指针进行数据切片:
df[逻辑条件]
df[df.one >= 2] #单个逻辑条件
df[(df.one >=1 ) & (df.one < 3) ] #多个逻辑条件组合
In [71]:
df
Out[71]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
2016-07-06 | 8.80 | 8.82 | 8.76 | 8.79 |
2016-07-07 | 8.79 | 8.80 | 8.74 | 8.78 |
2016-07-08 | 8.79 | 8.79 | 8.73 | 8.74 |
2016-07-11 | 8.75 | 8.79 | 8.74 | 8.75 |
2016-07-12 | 8.75 | 8.89 | 8.74 | 8.88 |
2016-07-13 | 8.88 | 9.05 | 8.86 | 8.99 |
2016-07-14 | 8.97 | 9.00 | 8.91 | 8.94 |
2016-07-15 | 8.95 | 9.00 | 8.91 | 8.99 |
2016-07-18 | 8.99 | 9.08 | 8.97 | 9.04 |
2016-07-19 | 9.04 | 9.05 | 8.95 | 8.97 |
2016-07-20 | 8.96 | 8.99 | 8.95 | 8.96 |
In [72]:
# 筛选出 open 大于 8.8 的数据 df[df.open > 8.8]
Out[72]:
open | high | low | close | |
---|---|---|---|---|
2016-07-13 | 8.88 | 9.05 | 8.86 | 8.99 |
2016-07-14 | 8.97 | 9.00 | 8.91 | 8.94 |
2016-07-15 | 8.95 | 9.00 | 8.91 | 8.99 |
2016-07-18 | 8.99 | 9.08 | 8.97 | 9.04 |
2016-07-19 | 9.04 | 9.05 | 8.95 | 8.97 |
2016-07-20 | 8.96 | 8.99 | 8.95 | 8.96 |
In [73]:
# 筛选出 open 大于 8.8 的数据,并且 close 小于 9.0 的数据 df[(df.open > 8.8) & (df.close < 9.0)]
Out[73]:
open | high | low | close | |
---|---|---|---|---|
2016-07-13 | 8.88 | 9.05 | 8.86 | 8.99 |
2016-07-14 | 8.97 | 9.00 | 8.91 | 8.94 |
2016-07-15 | 8.95 | 9.00 | 8.91 | 8.99 |
2016-07-19 | 9.04 | 9.05 | 8.95 | 8.97 |
2016-07-20 | 8.96 | 8.99 | 8.95 | 8.96 |
使用 条件过来更改数据。
In [79]:
df[df>9.0]
Out[79]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | NaN | NaN | NaN | NaN |
2016-07-04 | NaN | NaN | NaN | NaN |
2016-07-05 | NaN | NaN | NaN | NaN |
2016-07-06 | NaN | NaN | NaN | NaN |
2016-07-07 | NaN | NaN | NaN | NaN |
2016-07-08 | NaN | NaN | NaN | NaN |
2016-07-11 | NaN | NaN | NaN | NaN |
2016-07-12 | NaN | NaN | NaN | NaN |
2016-07-13 | NaN | 9.05 | NaN | NaN |
2016-07-14 | NaN | NaN | NaN | NaN |
2016-07-15 | NaN | NaN | NaN | NaN |
2016-07-18 | NaN | 9.08 | NaN | 9.04 |
2016-07-19 | 9.04 | 9.05 | NaN | NaN |
2016-07-20 | NaN | NaN | NaN | NaN |
观察可以发现,df 中小于 9 的数都变为 NaN。
下面我们就把大于 9 的数赋值为0.
In [80]:
df[df > 9.0] = 0
In [81]:
df
Out[81]:
open | high | low | close | |
---|---|---|---|---|
2016-07-01 | 8.69 | 8.73 | 8.68 | 8.71 |
2016-07-04 | 8.69 | 8.86 | 8.67 | 8.81 |
2016-07-05 | 8.80 | 8.83 | 8.77 | 8.81 |
2016-07-06 | 8.80 | 8.82 | 8.76 | 8.79 |
2016-07-07 | 8.79 | 8.80 | 8.74 | 8.78 |
2016-07-08 | 8.79 | 8.79 | 8.73 | 8.74 |
2016-07-11 | 8.75 | 8.79 | 8.74 | 8.75 |
2016-07-12 | 8.75 | 8.89 | 8.74 | 8.88 |
2016-07-13 | 8.88 | 0.00 | 8.86 | 8.99 |
2016-07-14 | 8.97 | 9.00 | 8.91 | 8.94 |
2016-07-15 | 8.95 | 9.00 | 8.91 | 8.99 |
2016-07-18 | 8.99 | 0.00 | 8.97 | 0.00 |
2016-07-19 | 0.00 | 0.00 | 8.95 | 8.97 |
2016-07-20 | 8.96 | 8.99 | 8.95 | 8.96 |
发现大于 9 的数都被替换为了0.
接下来教大家使用isin()方法来过滤在指定列中的数据:
In [83]:
# 选取 high 列中数为 0 和 9 的数。 df[df['high'].isin([0.00,9.00])]
Out[83]:
open | high | low | close | |
---|---|---|---|---|
2016-07-13 | 8.88 | 0 | 8.86 | 8.99 |
2016-07-14 | 8.97 | 9 | 8.91 | 8.94 |
2016-07-15 | 8.95 | 9 | 8.91 | 8.99 |
2016-07-18 | 8.99 | 0 | 8.97 | 0.00 |
2016-07-19 | 0.00 | 0 | 8.95 | 8.97 |
3. Panel
平台get_price,如果是多支股票, 则返回pandas.Panel对象。更多内容请参考http://pandas.pydata.org/pandas-docs/stable/api.html#panel
可通过 panel[列标,行标,股票代码] 获取数据.
In [1]:
panel = get_price(['000001.XSHE','000002.XSHE'],start_date='2016-07-12', end_date='2016-07-15', frequency='daily', fields=['open','high','low','close']) panel
Out[1]:
<class 'pandas.core.panel.Panel'> Dimensions: 4 (items) x 4 (major_axis) x 2 (minor_axis) Items axis: close to open Major_axis axis: 2016-07-12 00:00:00 to 2016-07-15 00:00:00 Minor_axis axis: 000001.XSHE to 000002.XSHE
由打印的结果可以看出:
- 列标(Items axis: close to open)
- 行标(Major_axis axis: 2016-07-12 00:00:00 to 2016-07-15 00:00:00)
- 股票代码(Minor_axis axis: 000001.XSHE to 000002.XSHE)
In [2]:
# 取出 'open'数据 panel['open',:,:]
Out[2]:
000001.XSHE | 000002.XSHE | |
---|---|---|
2016-07-12 | 8.75 | 17.53 |
2016-07-13 | 8.88 | 17.27 |
2016-07-14 | 8.97 | 17.41 |
2016-07-15 | 8.95 | 17.18 |
In [3]:
# 取出 '2016-07-15'数据 panel[:,'2016-07-15',:]
Out[3]:
close | high | low | open | |
---|---|---|---|---|
000001.XSHE | 8.99 | 9.00 | 8.91 | 8.95 |
000002.XSHE | 17.17 | 17.32 | 17.14 | 17.18 |
In [4]:
# 取出 000001 的 DataFrame 数据 panel[:,:,'000001.XSHE']
Out[4]:
close | high | low | open | |
---|---|---|---|---|
2016-07-12 | 8.88 | 8.89 | 8.74 | 8.75 |
2016-07-13 | 8.99 | 9.05 | 8.86 | 8.88 |
2016-07-14 | 8.94 | 9.00 | 8.91 | 8.97 |
2016-07-15 | 8.99 | 9.00 | 8.91 | 8.95 |
Panel 操作与 DataFrame 基本相同,下节会为大家讲解 DataFrame 的数据处理与规整。
来自:https://www.joinquant.com/post/e0cdefd3356965b702231ad2babc227b?f=stydy&m=python