0
我想找到每秒最大的买卖差价。假设我有这个报价文件:熊猫中的时间戳聚合
In [1]: !head quotes.txt
exchtime|bid|ask
1389178814.587758|520.0000|541.0000
1389178830.462050|540.4300|540.8700
1389178830.462050|540.4300|540.8700
1389178830.468602|540.4300|540.8600
1389178830.468602|540.4300|540.8600
1389178847.67500|540.4300|540.8500
1389178847.67500|540.4300|540.8500
1389178847.73541|540.4300|540.8400
1389178847.73541|540.4300|540.8400
时间戳只是自UTC时代以来的秒数。随着第一列一些技巧,我可以读这样的文件:
import pandas as pd
import numpy as np
from datetime import datetime
def convert(x): return np.datetime64(datetime.fromtimestamp(float(x)).isoformat())
df = pd.read_csv('quotes.txt', sep='|', parse_dates=True, converters={0:convert})
并且这产生我想要的东西:
In [10]: df.head()
Out[10]:
exchtime bid ask
0 2014-01-08 11:00:14.587758 520.00 541.00
1 2014-01-08 11:00:30.462050 540.43 540.87
2 2014-01-08 11:00:30.462050 540.43 540.87
3 2014-01-08 11:00:30.468602 540.43 540.86
4 2014-01-08 11:00:30.468602 540.43 540.86
我难倒上聚集。在Q/KDB +,我只想做:
select spread:max ask-bid by exchtime.second from df
我什么来-了在熊猫是
df['spread'] = df.ask - df.bid
df['exchtime_sec'] = [e.replace(microsecond=0) for e in df.exchtime]
df.groupby('exchtime_sec')['spread'].agg(np.max)
这似乎工作,但exchtime_sec
线大约需要三个数量级长于预计将运行!是否有更快(更简洁)的方式来表达这种汇总?
感谢您的支持!尽管如此,我仍然遇到了麻烦。如果我使用50U频率的100000随机采样,我会在3.62毫秒的时间,根据您的具体情况。但是如果我以50L的频率和相同数量的样本走,那么我会在612ms时间!更高的频率更符合我的蜱样本,所以我的真实世界的表现仍然令人生气。任何关于更高频率的想法?我的假设是大熊猫正在逢迎每一个新的指数值。 – chrisaycock
所以这两个分布是完全不同的,U和L之间每1秒有更多的值(当然这就是它的结构)。如果您使用cythonized函数(例如np.mean/np.sum/np.prod/np.var/np.median),那么您将获得类似的性能。最大/最小值不会被cython化,所以它回落到一个较慢的方法(需要一个增强来解决这个问题)...我会打开一个问题。您也可以稍微不同的方式使用first/last。你也可以试试ohlc,这也应该起作用。我将编辑该问题。 – Jeff
有关perf或max/min的问题(但您应该在任何情况下都使用OHLC)https://github.com/pydata/pandas/issues/5927。我之前的评论是关闭的(np.max/min)是cythonized,但由于某种原因,采取较慢的路径。 – Jeff