学习之旅
df = pd.read_csv('train.csv', nrows=11856)
#nrows:需要读取的行数
# Creating train and test set
# Index 10392 marks the end of October 2013
train = df[0:10392]
test = df[10392:]
带有时间的表格数据的处理(df.resample)量化交易
df.resample('D')
这个dataframe,时间不连续。分析建模都是需要时间均匀间隔的数据
因此用df = df.resample(‘60S’)把他洗成1min频率的数据
df = df.resample('60S').last()
#last()表示使用每个分钟段区间内的最后一个数据作为该分钟最终显示的数据,如果该分钟内没有任何数据则会显示NaN
#sum()表示总的
#mean()平均
两个参数我们想要的效果不一样就分开获取
price = df['price].resample('60S', label = 'right').last()
volume = df['price].resample('60S', label = 'right').sum()
df = pd.concat([price, volume], axis = 1)
'''
从新的dataframe中我们还是可以观察出问题:
原dataframe的第一个记录是00:00:07,然而这个数据却被自动附到了新dataframe中00:00:00的index上。
而事实上在00:00:00时刻,我们并不知道00:00:07发生了什么
所以我们通过设置label的参数去解决第一个问题。
在resample函数里,label默认值是left,也就是把一个区间内的数据的计算结果都附到区间左侧端点上,
而我们想要的则是相反的情况,也就是label = right
我们通过将price和volume分开处理,price使用last,volume则使用sum函数,达到了更合理的处理效果。
最后,我们用concat函数将两个Series合并
'''
还可以利用apply和lambda函数计算每分钟交易量加权的价格
df.resample('60S', label = 'right').apply(lambda x:np.average(x['price'] ,weights = x['volume']) #weights是每个时间区段内的所有volume数据
if sum(x['volume']) != 0
else np.average(x['price'])[['price']]
lamba:
def sum(x,y):
return x+y
#--------------------------------
p = lambda x,y:x+y
print(p(4,6))
apply 用在dataframe上,用于对row或者column进行计算
import numpy as np
import pandas as pd
f = lambda x: x.max()-x.min()
df = pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['utah', 'ohio', 'texas', 'oregon'])
print(df)
t1 = df.apply(f) #默认列计算
print(t1)
t2 = df.apply(f, axis=1) #axis=1:行计算
print(t2)
------------------------------
b d e
utah 1.106486 0.101113 -0.494279
ohio 0.955676 -1.889499 0.522151
texas 1.891144 -0.670588 0.106530
oregon -0.062372 0.991231 0.294464
b 1.953516
d 2.880730
e 1.016430
dtype: float64
utah 1.600766
ohio 2.845175
texas 2.561732
oregon 1.053603
dtype: float64
axis:使用0值表示沿着每一列或行标签\索引值向下执行方法
使用1值表示沿着每一行或者列标签模向执行对应的方法
reshape学习