与熊猫的滚动和移动概念作斗争。在这个论坛中有很多很好的建议,但我很遗憾地将这些建议应用到我的场景中。
现在我在时间序列上使用传统的循环,但是,迭代超过 150,000 行大约需要 8 个小时,这对于所有代码来说大约是 3 天的数据。有 2 个月的数据来处理它可能不会在我休假回来后完成,更不用说断电的风险,之后我必须重新开始,这次没有休假,等待。
我有以下 15 分钟的股票价格时间序列(日期时间(时间戳)和股票代码的层次索引,唯一的原始列是 closePrice):
closePrice
datetime ticker
2014-02-04 09:15:00 AAPL xxx
EQIX xxx
FB xxx
GOOG xxx
MSFT xxx
2014-02-04 09:30:00 AAPL xxx
EQIX xxx
FB xxx
GOOG xxx
MSFT xxx
2014-02-04 09:45:00 AAPL xxx
EQIX xxx
FB xxx
GOOG xxx
MSFT xxx
我需要添加两列:
- 12sma,12天移动平均线。搜索了几个小时后,最好的建议是使用 rolling_mean,所以我尝试了。但考虑到我的 TS 结构,它不起作用,即它自上而下地工作,第一个 MA 是基于前 12 行计算的,而不管不同的股票代码值。我如何根据索引(即第一个日期时间然后股票代码)使其平均值,以便我获得 MA 表示 AAPL?目前确实如此(AAPL+EQIX+FB+GOOG+MSFT+AAPL...直到第 12 行)/12
- 一旦我得到 12sma 柱,我需要 12ema 柱,12 天指数 MA。对于计算,每个代码的时间序列中的第一个值只会从同一行复制 12sma 值。随后,我需要同一行的 closePrice 和前一行的 12ema,即过去 15 分钟。我做了长时间的研究,似乎解决方案是滚动和移位的组合,但我不知道如何将它们组合在一起。
任何帮助我将不胜感激。
谢谢。
编辑:
感谢 Jeff 的提示,在交换和排序 ix 级别之后,我能够使用 rolling_mean() 正确地获得 12sma,并努力在同一时间戳插入从 12sma 复制的第一个 12ema 值:
close 12sma 12ema
sec_code datetime
AAPL 2014-02-05 11:45:00 113.0 NaN NaN
2014-02-05 12:00:00 113.2 NaN NaN
2014-02-05 13:15:00 112.9 NaN NaN
2014-02-05 13:30:00 113.2 NaN NaN
2014-02-05 13:45:00 113.0 NaN NaN
2014-02-05 14:00:00 113.1 NaN NaN
2014-02-05 14:15:00 113.3 NaN NaN
2014-02-05 14:30:00 113.3 NaN NaN
2014-02-05 14:45:00 113.3 NaN NaN
2014-02-05 15:00:00 113.2 NaN NaN
2014-02-05 15:15:00 113.2 NaN NaN
2014-02-05 15:30:00 113.3 113.16 113.16
2014-02-05 15:45:00 113.3 113.19 NaN
2014-02-05 16:00:00 113.2 113.19 NaN
2014-02-06 09:45:00 112.6 113.16 NaN
2014-02-06 10:00:00 113.5 113.19 NaN
2014-02-06 10:15:00 113.8 113.25 NaN
2014-02-06 10:30:00 113.5 113.29 NaN
2014-02-06 10:45:00 113.7 113.32 NaN
2014-02-06 11:00:00 113.5 113.34 Nan
我知道 pandas 有 pandas.stats.moments.ewma 但我更喜欢使用我从一本书中得到的公式,该公式需要“目前”的收盘价和前一行的 12ema。
因此,我尝试从 2 月 5 日 15:45 开始填充 12ema 列。我用一个函数尝试了 apply() 但 shift 给出了一个错误:
def f12ema(x):
K = 2 / (12 + 1)
return x['price_nom'] * K + x['12ema'].shift(-1) * (1-K)
df1.apply(f12ema, axis=1)
AttributeError: ("'numpy.float64' object has no attribute 'shift'", u'occurred at index 2014-02-05 11:45:00')
我想到的另一种可能性是 rolling_appy() ,但它超出了我的知识范围。