use*_*059 6 python csv numpy cython pandas
我有一个非常简单的设置:pandas数据帧df中的市场数据(滴答)如下:
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
Run Code Online (Sandbox Code Playgroud)
现在我使用pandas.groupy来聚合句点
g=df.groupby('period')
Run Code Online (Sandbox Code Playgroud)
按期间很容易获得最低和最高价格,例如
import numpy as np
res=g.agg({'ask': [np.amax, np.amin]})
Run Code Online (Sandbox Code Playgroud)
这也相当快.现在,我还想要每个时期的第一个和最后一个价格.这就是麻烦开始的地方.当然,我可以这样做:
res=g.agg({'ask': lambda x: x[0]})
Run Code Online (Sandbox Code Playgroud)
它基本上可以工作,但是对于大型数据集来说它非常慢.基本上,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]
Run Code Online (Sandbox Code Playgroud)
但是pandas不会接受它作为聚合函数,因为它传递的是pd.core.series-object而不是np.ndarray.(没有一个派生自另一个,编译器无法识别.)
有没有人知道怎么写一个接受熊猫系列的cython函数而没有python调用开销?
IIUC 那么你可以first这样做last:
In [270]:
g=df.groupby('period')
res=g.agg({'ask': [np.amax, np.amin, 'first', 'last']})
res
Out[270]:
ask
amax amin first last
period
41126 112.124 112.122 112.124 112.123
42125 112.124 112.118 112.118 112.124
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |