python如何期货交易_Python期货量化交易基础教程(15)

15、pandas模块:

K线、tick数据都是pandas.DataFrame类型,因此我们有必要介绍下pandas模块。

Pandas 的主要数据结构是 Series(一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。Pandas 基于 NumPy 开发,可以与其它第三方科学计算支持库完美集成。

Pandas 数据结构就像是低维数据的容器。比如,DataFrame 是 Series 的容器,Series 则是标量的容器。使用这种方式,可以在容器中以字典的形式插入或删除对象。

15.1、Series一维数据结构

Series包含行索引index(行标签)和数据两个部分,数据也可以有一个name属性,例如:

import pandas as pd

s=pd.Series([4266.0,4270.0,4270.0,4268.0],index=None,name='open')

print(s)

print('索引为2的数据:',s[2])

print('s的索引:',s.index)

print('s的数据名',s.name)

print('索引1-3的数据,间隔2行:')

print(s[1:3])

'''输出结果为:0 4266.01 4270.02 4270.03 4268.0Name: open, dtype: float64索引为2的数据: 4270.0s的索引: RangeIndex(start=0, stop=4, step=1)s的数据名 open索引1-3的数据,间隔2行:1 4270.02 4270.0Name: open, dtype: float64'''

我们用pd.Series类实例化了一个一维序列对象,数据由列表[4266.0,4270.0,4270.0,4268.0]生成,行索引index默认为None,则索引是从0开始的整数,我们为数据指定了一个名称'open'。Series可以通过索引获取单个数据,也可以像列表数据那样用切片获取多个数据,注意这里的索引类似于“键”,也称为行标签,是可哈希类型,不同于列表的索引为位置序号。

Series可按索引取值,也可按位置取值,例如:

>>> s

0 4266.0

1 4270.0

2 4270.0

3 4268.0

Name: open, dtype: float64

>>> s[2] #索引为2的数据

4270.0

>>> s.loc[2] #索引为2的数据

4270.0

>>> s.iloc[2] #位置序号为2的数据

4270.0

>>> s.iloc[-2] #位置序号为-2的数据

4270.0

>>>

Series结构转换为DataFrame结构,例如:

>>> s

0 4266.0

1 4270.0

2 4270.0

3 4268.0

Name: open, dtype: float64

>>> d=s.to_frame() #行索引的name属性自动变成了列标签

>>> d

open

0 4266.0

1 4270.0

2 4270.0

3 4268.0

>>>

15.2、DataFrame二维数据结构

DataFrame包含index(行标签,又称行索引)和columns(列标签,又称列索引)及数据,行和列的标签也可以指定names属性,例如:

>>> import pandas as pd

>>> k1=[4266.0,4272.0,4265.0,4270.0]

>>> k2=[4270.0,4273.0,4270.0,4270.0]

>>> k3=[4270.0,4271.0,4267.0,4268.0]

>>> df=pd.DataFrame([k1,k2,k3],index=None,columns=['open','high','low','close'])

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>>

我们用三个列表k1、k2、k3创建一个3行4列的DataFrame数据,未指定行索引index,index值默认是从0开始的整数,指定了行标签columns,标签数量和列表元素个数要一致,即列数要和列表的长度相等。从输出结果可知,k1、k2、k3是按行从上到下放入DataFrame中的。

属性shape获取行数和列数,例如:

>>> df.shape #获取行和列

(3, 4)

>>> df.shape[0] #获取行

3

>>> df.shape[1] #获取列

4

>>> len(df) #获取行

3

属性index和columns可以获取行和列的标签,例如:

>>> df.index

RangeIndex(start=0, stop=3, step=1)

>>> df.columns

Index(['open', 'high', 'low', 'close'], dtype='object')

我们可以设置index和columns的names属性,即行和列标签的名称,例如:

>>> df.index.names

FrozenList([None])

>>> df.columns.names=['price']

>>> df.index.names=['id']

>>> df.columns.names

FrozenList(['price'])

>>> df.index.names

FrozenList(['id'])

>>> df

price open high low close

id

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>>

我们可用列的标签获取列数据,可以用“[ ]”和“.”两种方式,形式为df[col_label] 和 df.col_label,例如选择一列:

>>> df['open']

id

0 4266.0

1 4270.0

2 4270.0

Name: open, dtype: float64

>>> df.open

id

0 4266.0

1 4270.0

2 4270.0

Name: open, dtype: float64

>>>

通过标签获取一列数据返回值是Series结构。

如果选择多列,则把列标签放入列表中,再把列表放入切片操作符,形式为df[[col_label1, col_label2, col_label3]],例如:

>>> df[['open','low']]

price open low

id

0 4266.0 4265.0

1 4270.0 4270.0

2 4270.0 4267.0

>>>

我们可以用“[ ]”切片选取多行,例如:

>>> df[0:1]

price open high low close

id

0 4266.0 4272.0 4265.0 4270.0

>>> df[0:2]

price open high low close

id

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

>>> df[1:2]

price open high low close

id

1 4270.0 4273.0 4270.0 4270.0

>>>

切片不包含结束行,因此用“[ ]”切片相邻的两个行标签可以间接获取一行。

获取单个数据,可以先通过列标签选择数据所在的列,再选择数据所在的行,例如:

>>> df['open'][2]

4270.0

>>> df.open[2]

4270.0

>>>

获取数据还可以用loc和iloc属性,loc通过标签获取数据,iloc通过位置获取数据,形式为:df.loc[row_label, col_label] 和 df.iloc[row_loc, col_loc]。

df.loc[row_label, col_label]:row_label默认值为全部行,也可用切片选择多行,注意包含结束标签

col_label默认值为全部列,也可用标签选择多列

例如:

>>> df.loc[2] #选择2行全部列,返回值为Series结构

price

open 4270.0

high 4271.0

low 4267.0

close 4268.0

Name: 2, dtype: float64

>>> df.loc[:1] #选择行起始标签至标签1,包括1

price open high low close

id

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

>>> df.loc[1:2] #选择行起始标签1至标签2,包括2

price open high low close

id

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.loc[:,'open'] #选择'open'列,全部行

id

0 4266.0

1 4270.0

2 4270.0

Name: open, dtype: float64

>>> df.loc[:,['open','low']] #选择'open'列、'low'列,全部行

price open low

id

0 4266.0 4265.0

1 4270.0 4270.0

2 4270.0 4267.0

>>> df.loc[1:,['open','low']] #选择'open'列、'low'列,行起始标签1至末尾行

price open low

id

1 4270.0 4270.0

2 4270.0 4267.0

>>>

df.iloc[row_loc, col_loc],按位置选择,可像序列数据切片一样,切片的方向不同,位置序号可以有正负值:row_loc默认值为全部行,也可用切片选择多行,注意不包含结束位置序号

col_loc默认值为全部列,也可用切片选择多列

例如:

>>> df.iloc[1] #选择行号1,全部列,返回值为Series结构

price

open 4270.0

high 4273.0

low 4270.0

close 4270.0

Name: 1, dtype: float64

>>> df.iloc[-1] #选择行号-1(即末尾行),全部列,返回值为Series结构

price

open 4270.0

high 4271.0

low 4267.0

close 4268.0

Name: 2, dtype: float64

>>> df.iloc[1:2] #选择行号1-2,不包括2,全部列

price open high low close

id

1 4270.0 4273.0 4270.0 4270.0

>>> df.iloc[:,1] #选择全部行,列号1,返回值为Series结构

id

0 4272.0

1 4273.0

2 4271.0

Name: high, dtype: float64

>>> df.iloc[:,-1] #选择全部行,列号-1(即末尾列),返回值为Series结构

id

0 4270.0

1 4270.0

2 4268.0

Name: close, dtype: float64

>>> df.iloc[1:,-2:] #选择行号1至末尾行,最后2列

price low close

id

1 4270.0 4270.0

2 4267.0 4268.0

>>>

df.head(n),获取前n行数据,df.tail(n),获取后n行数据例如:

>>> df.head(2)

price open high low close

id

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

>>> df.tail(2)

price open high low close

id

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>>

df.index=['a','b','c'],修改行索引,df.columns=['m','n','p','q'],修改列索引,例如:

>>> df.index=['a','b','c']

>>> df.columns=['m','n','p','q']

>>> df

m n p q

a 4266.0 4272.0 4265.0 4270.0

b 4270.0 4273.0 4270.0 4270.0

c 4270.0 4271.0 4267.0 4268.0

>>>

astype():用来设置数据的类型,例如'int'、'float'、'str':

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.open.astype('int')

0 4266

1 4270

2 4270

Name: open, dtype: int32

>>> df.open.astype('float')

0 4266.0

1 4270.0

2 4270.0

Name: open, dtype: float64

>>> df.open.astype('str')

0 4266.0

1 4270.0

2 4270.0

Name: open, dtype: object

>>> df.astype('int')

open high low close

0 4266 4272 4265 4270

1 4270 4273 4270 4270

2 4270 4271 4267 4268

>>>

pandas的一些操作函数带有参数inplace或axis,inplace默认值为False,表示返回一个新的数据对象,inplace为True表示直接修改原数据;axis默认值为0,表示按纵向操作,即按行操作,axis为1表示按横向操作,即按列操作,0也可用'index'表示,1也可用'columns'表示。

df.set_index():设置某一列为索引,例如:

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.set_index('open')

high low close

open

4266.0 4272.0 4265.0 4270.0

4270.0 4273.0 4270.0 4270.0

4270.0 4271.0 4267.0 4268.0

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.set_index('open',inplace=True)

>>> df

high low close

open

4266.0 4272.0 4265.0 4270.0

4270.0 4273.0 4270.0 4270.0

4270.0 4271.0 4267.0 4268.0

>>> df.index

Float64Index([4266.0, 4270.0, 4270.0], dtype='float64', name='open')

>>>

执行df.set_index('open',inplace=True)把'open'列设置为行索引,且对原数据df修改。

df.reset_index():把行索引重置为整数,例如:

>>> df.reset_index(inplace=True)

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>>

df.rename():修改行或列的标签,参数传入映射类型,把原标签修改为新标签,可以修改单个或多个标签,传入不存在的标签默认不会报错,例如:

>>> df #原始数据

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.rename(columns={'open':'a','B':'b'}) #修改列标签'open'为'a','B'不存在忽略

a high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.rename({'open':'a','B':'b'},axis='columns') #修改列标签'open'为'a','B'不存在忽略

a high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.rename({'open':'a','B':'b'},axis=1) #修改列标签'open'为'a','B'不存在忽略

a high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.rename(index={1:'m','B':'b'}) #修改行标签1为'm','B'不存在忽略

open high low close

0 4266.0 4272.0 4265.0 4270.0

m 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.rename({1:'m','B':'b'},axis='index') #修改行标签1为'm','B'不存在忽略

open high low close

0 4266.0 4272.0 4265.0 4270.0

m 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.rename({1:'m','B':'b'},axis=0) #修改行标签1为'm','B'不存在忽略

open high low close

0 4266.0 4272.0 4265.0 4270.0

m 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df #原始数据未变

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.rename(index={1:'m','B':'b'},columns={'open':'a','B':'b'},inplace=True) #修改原始数据行列标签

>>> df

a high low close

0 4266.0 4272.0 4265.0 4270.0

m 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>>

对pandas数据赋值,可以直接修改pandas数据,例如:

>>> df #原始数据

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.open[1]=1234 #把'open'列1行的数据修改为1234

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 1234.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.high=[1,2,3] #把'high'列的数据修改为[1,2,3]

>>> df

open high low close

0 4266.0 1 4265.0 4270.0

1 1234.0 2 4270.0 4270.0

2 4270.0 3 4267.0 4268.0

>>>

df.drop():删除行或列,例如:

>>> df #原始数据

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.drop(['open'],axis=1) #删除'open'列

high low close

0 4272.0 4265.0 4270.0

1 4273.0 4270.0 4270.0

2 4271.0 4267.0 4268.0

>>> df.drop(['open','high'],axis=1) #删除'open'、'high'列

low close

0 4265.0 4270.0

1 4270.0 4270.0

2 4267.0 4268.0

>>> df.drop([0],axis=0) #删除0行

open high low close

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.drop([0,1],axis=0) #删除0、1行

open high low close

2 4270.0 4271.0 4267.0 4268.0

>>>

df.drop_duplicates(keep='first'):去除重复行,keep默认值'first'表示保留第一次出现的行,若为'last'表示保留最后一次出现的行,若为False表示删除所有重复行,例如:

>>> df #原始数据,2、3行重复

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

3 4270.0 4271.0 4267.0 4268.0

>>> df.drop_duplicates(keep='last') #保留最后一行3

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

3 4270.0 4271.0 4267.0 4268.0

>>> df.drop_duplicates(keep=False) #删除全部重复行

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

>>>

sum():求和,mean():均值,std():标准差,例如:

>>> df #原始数据

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.iloc[-2:,0].sum() #求位置第0列最后两行的和

8540.0

>>> df.iloc[-2:,0].mean() #求位置第0列最后两行的均值

4270.0

>>> df.iloc[-2:,0].std() #求位置第0列最后两行的标准差

0.0

>>>

max():最大值,min():最小值,例如:

>>> df

open high low close diff

0 4266.0 4272.0 4265.0 4270.0 -6.0

1 4270.0 4273.0 4270.0 4270.0 -3.0

2 4270.0 4271.0 4267.0 4268.0 -1.0

>>> df.high.max() #high列的最大值

4273.0

>>> df.high.min() #high列的最小值

4271.0

>>> df.iloc[-2:].low.max() #最后两行里,low列的最大值

4270.0

>>> df.iloc[-2:].low.min() #最后两行里,low列的最小值

4267.0

>>>

idxmax(0):一列中最大值所在的行,idxmax(1):一行中最大值所在的列,idxmin(0):一列中最小值所在的行,idxmin(1):一行中最小值所在的列。若无参数默认值为0,返回值是行和列的标签,当最大、最小值有重复时取第一个出现的行或列,例如:

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.high.idxmax(0) #high列最大值所在的行

1

>>> df.high.idxmin(0) #high列最小值所在的行

2

>>> df.iloc[2].idxmax(1) #第2行最大值所在的列

'high'

>>> df.iloc[2].idxmin(1) #第2行最小值所在的列

'low'

>>> df.close.idxmax(0) #close列最大值所在的行,取第一次出现的行

0

>>> df.iloc[1].idxmin(1) #第1行最小值所在的列,取第一次出现的列

'open'

>>> df.iloc[-2:].high.idxmax(0) #最后两行,high列最大值所在的行

1

>>> df.iloc[-2,1:3].idxmax(1) #第-2行,第1-2列最大值所在的列

'high'

>>>

df.append(data):把data按行追加到df,ignore_index默认False即不忽略data的索引,例如:

>>> df1

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df2

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df1.append(df2)

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df1.append(df2,ignore_index=True)

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

3 4266.0 4272.0 4265.0 4270.0

4 4270.0 4273.0 4270.0 4270.0

5 4270.0 4271.0 4267.0 4268.0

>>>

pd.concat([df1, df2],axis=0):轴向连接多个DateFrame数据,axis默认为0,即按行连接,例如:

>>> df1

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df2

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> pd.concat([df1, df2],axis=0)

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> pd.concat([df1, df2],axis=1)

open high low close open high low close

0 4266.0 4272.0 4265.0 4270.0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0 4270.0 4271.0 4267.0 4268.0

通过标签df[label]添加一列,例如:

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df['id']=['a','b','c']

>>> df

open high low close id

0 4266.0 4272.0 4265.0 4270.0 a

1 4270.0 4273.0 4270.0 4270.0 b

2 4270.0 4271.0 4267.0 4268.0 c

>>>

如果只给df[label]赋一个值,则将其赋值给该列所有值,例如:

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df['ma_B2.board']='B2'

>>> df

open high low close ma_B2.board

0 4266.0 4272.0 4265.0 4270.0 B2

1 4270.0 4273.0 4270.0 4270.0 B2

2 4270.0 4271.0 4267.0 4268.0 B2

>>>

对列做运算,例如:

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df['diff']=df.open - df.high #open列的值减去high列的值,结果添加到diff列

>>> df

open high low close diff

0 4266.0 4272.0 4265.0 4270.0 -6.0

1 4270.0 4273.0 4270.0 4270.0 -3.0

2 4270.0 4271.0 4267.0 4268.0 -1.0

>>>

通过标签df.loc[label]添加一行,例如:

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df.loc['a']=[1,2,3,4]

>>> df

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

a 1.0 2.0 3.0 4.0

>>>

map():Series对象的一个函数,map()将一个自定义函数作用于Series对象的每个元素,例如:

>>> df #原始数据

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

>>> df['open']=df['open'].map(lambda x:x*2) #把'open'列每一个元素乘以2

>>> df

open high low close

0 8532.0 4272.0 4265.0 4270.0

1 8540.0 4273.0 4270.0 4270.0

2 8540.0 4271.0 4267.0 4268.0

>>>

apply():将DateFrame的一行或多行,或者一列或多列的元素应用于自定义函数,例如:

>>> df #原始数据

open high low close

0 4266.0 4272.0 4265.0 4270.0

1 4270.0 4273.0 4270.0 4270.0

2 4270.0 4271.0 4267.0 4268.0

a 1.0 2.0 3.0 4.0

>>> df['open']=df['open'].apply(lambda x:x*2) #'open'列的元素乘以2

>>> df

open high low close

0 8532.0 4272.0 4265.0 4270.0

1 8540.0 4273.0 4270.0 4270.0

2 8540.0 4271.0 4267.0 4268.0

a 2.0 2.0 3.0 4.0

>>> df.loc['a']=df.loc['a'].apply(lambda x:x*2) #'a'行的元素乘以2

>>> df

open high low close

0 8532.0 4272.0 4265.0 4270.0

1 8540.0 4273.0 4270.0 4270.0

2 8540.0 4271.0 4267.0 4268.0

a 4.0 4.0 6.0 8.0

>>> df['b']=df[['open','high']].apply(lambda x:x.sum(),axis=1) #'open'和'high'列的元素求和

>>> df

open high low close b

0 8532.0 4272.0 4265.0 4270.0 12804.0

1 8540.0 4273.0 4270.0 4270.0 12813.0

2 8540.0 4271.0 4267.0 4268.0 12811.0

a 4.0 4.0 6.0 8.0 8.0

applymap():将自定义函数作用于DataFrame的所有元素,例如:

>>> df #原始数据

open high low close b

0 8532.0 4272.0 4265.0 4270.0 12804.0

1 8540.0 4273.0 4270.0 4270.0 12813.0

2 8540.0 4271.0 4267.0 4268.0 12811.0

a 4.0 4.0 6.0 8.0 8.0

>>> df=df.apply(lambda x:x*2) #所有元素乘以2

>>> df

open high low close b

0 17064.0 8544.0 8530.0 8540.0 25608.0

1 17080.0 8546.0 8540.0 8540.0 25626.0

2 17080.0 8542.0 8534.0 8536.0 25622.0

a 8.0 8.0 12.0 16.0 16.0

>>>

15.3、文件读写:

pd.read_csv()从CSV文件读取到DataFrame,可直接读取文件,参数: file,文件路径; sep,分隔符; index_col,用作行索引的一列或者多列; usecols,选择列; encoding,字符编码类型,通常为’utf-8’。但有的文件直接读取可能会报编码错误,推荐先用open()函数打开文件再读取,df.to_csv()把DataFrame写入CSV文件,例如:

data = open(r'C:\export\MA.csv')

df = pd.read_csv(data,header=None,dtype=object) #以字符串类型读取表格,无列名

df.to_csv(r'C:\export\MA.csv',index=False,header=False) #写入文件,不包含行列标签

read_csv的参数header=None表示读取文件时不把第一行作为列标签,自动使用整数作为列标签,行标签也自动使用整数,默认会把数值读取成浮点型数据或整型数据,可用dtype=object强制把所有数据读取成字符串,to_csv写入文件时,默认的整数标签若不需要可以不用写入。

pandas的用法还很多,更多用法可查阅pandas相关资料。

你可能感兴趣的:(python如何期货交易)