我很简单的设置如下:市场数据(ticks)在一个名为df的pandas数据框中,格式如下:
index period ask bid
00:00:00.126 42125 112.118 112.117
00:00:00.228 42125 112.120 112.117
00:00:00.329 42125 112.121 112.120
00:00:00.380 42125 112.123 112.120
00:00:00.432 42125 112.124 112.121
00:00:00.535 41126 112.124 112.121
00:00:00.586 41126 112.122 112.121
00:00:00.687 41126 112.124 112.121
00:00:01.198 41126 112.124 112.120
00:00:01.737 41126 112.124 112.121
00:00:02.243 41126 112.123 112.121
现在我使用pandas.groupy来聚合时间段。
g=df.groupby('period')
您可以轻松获取每个时期的最低和最高价格,例如:
import numpy as np
res=g.agg({'ask': [np.amax, np.amin]})
这个也相当快。现在,我还想知道每个时期的第一个和最后一个价格。这就是问题所在。当然,我可以这样做:
res=g.agg({'ask': lambda x: x[0]})
基本上,它能够正常工作,但对于大型数据集来说速度非常慢。 Python函数调用的呼叫开销非常高。
有没有人知道类似于np.amax的numpy函数,可以返回一组中的第一个或最后一个元素?我找不到这样的函数。iloc [0]行不通,因为它是一个对象的方法,因此我无法将其作为函数传递给g.agg,因为在这个阶段我还没有该对象(这就是需要lambda的原因)。
现在,我并不是懒惰,我尝试使用cython自己完成这个任务。
import numpy as np
cimport numpy as np
cpdef double first(np.ndarray array_series):
return array_series[0]
但是Pandas不接受这个作为聚合函数,因为它传递的是pd.core.series对象而不是np.ndarray。(尽管一个从另一个导出,但编译器并不认识。)
有没有人知道如何编写一个Cython函数,可以接受Pandas series而没有Python调用开销?
df.groupby('period').first()
和df.groupby('period').last()
吗? - EdChum