在优矿上的-量化分析师的python日记中看到一个函数很不错--pd.crosstab 。因为我们平时取到的多股数据可能如以下所示;
取两股为例: Sec1, Sec2
利用pandas的date_range获得一列时间序列,当然这边价格是简单假设的。
import numpy as np
import pandas as pd
a = np.arange(10)
b = np.arange(10,20)
date = pd.date_range('2016-8-26', periods = 10)
df1 = pd.DataFrame({'date': date, 'SecName':'sec1', 'price': a})
df2 = pd.DataFrame({'date': date, 'SecName':'sec2', 'price': b})
df = pd.concat([df1,df2], axis = 0) #将两个数据框按行拼接
最终得到的df 数据框为 (第一列为自动获取的index)
SecName date price
0 sec1 2016-08-26 0
1 sec1 2016-08-27 1
2 sec1 2016-08-28 2
3 sec1 2016-08-29 3
4 sec1 2016-08-30 4
5 sec1 2016-08-31 5
6 sec1 2016-09-01 6
7 sec1 2016-09-02 7
8 sec1 2016-09-03 8
9 sec1 2016-09-04 9
0 sec2 2016-08-26 10
1 sec2 2016-08-27 11
2 sec2 2016-08-28 12
3 sec2 2016-08-29 13
4 sec2 2016-08-30 14
5 sec2 2016-08-31 15
6 sec2 2016-09-01 16
7 sec2 2016-09-02 17
8 sec2 2016-09-03 18
9 sec2 2016-09-04 19
接下来就是pd.crosstab登场的时间了
df = pd.crosstab(df['date'], df['SecName']) # 第一个参数是指定index,第二个参数是指定column
print df
SecName sec1 sec2
date
2016-08-26 1 1
2016-08-27 1 1
2016-08-28 1 1
2016-08-29 1 1
2016-08-30 1 1
2016-08-31 1 1
2016-09-01 1 1
2016-09-02 1 1
2016-09-03 1 1
2016-09-04 1 1
哎嘛不对,这样就成为了excel数据透视表中的count了,所以得到的值都是1,因为每组(date,SecName)对应的值是唯一的
所以应该指定一下第三,四个参数 values,aggfun=sum,这里表示将对应的值求和,因为每个值都是唯一的,结果就是我们想要的了。
df = pd.crosstab(df['date'], df['SecName'],values=df['price'],aggfunc=sum)
print df
SecName sec1 sec2
date
2016-08-26 0 10
2016-08-27 1 11
2016-08-28 2 12
2016-08-29 3 13
2016-08-30 4 14
2016-08-31 5 15
2016-09-01 6 16
2016-09-02 7 17
2016-09-03 8 18
2016-09-04 9 19
第一篇blog大功告成!哈哈,算是学习日记吧。希望能养成这个好习惯,不然一直学了就忘,通过这个方式记录自己在学习过程中的体会也是不错的。
在这贴出一个链接,有兴趣可以看看。
量化分析师的Python日记【第15天:如何在优矿上搞一个wealthfront出来】