pandas - 需要改进我在某个时间点返回多个 SMA 的函数
问题描述
当我传递典型的 OHLCV 数据帧以及参数“retro_days”时,我有一个函数返回 SMA(简单移动平均线)SMA200、SMA50、SMA20 和 SMA10。因此,如果我通过retro_days = 0,它将返回截至今天的 4 个 SMA 。如果我通过retro_days = 10,它将返回10 个交易日之前的 4 个 SMA 。
我的问题是,它在准确性方面都运行良好,但是当我遍历多个股票代码时,每个股票代码的时间都会累加,这个循环最终会花费很多时间。我为每个股票代码调用此函数 6 次,retro_days 为 20、10、5、3、1 和 0。
有人可以提出一种更有效的方法来实现这一目标吗?谢谢你。
我的函数看起来像这样,其中df_SMA被传递给股票代码的df_OHLCV。:
def get_SMA_Stats( df_SMA, retro_days):
if retro_days > 0:
df_SMA = df_SMA[ 0 : len( df_SMA)-retro_days]
sma200 = df_SMA.Close.rolling( window = 200).mean()[ -1:][0]
sma50 = df_SMA.Close.rolling( window = 50).mean()[ -1:][0]
sma20 = df_SMA.Close.rolling( window = 20).mean()[ -1:][0]
sma10 = df_SMA.Close.rolling( window = 10).mean()[ -1:][0]
return sma200, sma50, sma20, sma10
该函数的调用如下:
SMA200, SMA50, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 20)
SMA200, SMA50, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 10)
SMA200Tm5, SMA50Tm5, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 5)
SMA200Tm3, SMA50Tm3, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 3)
SMA200Tm1, SMA50Tm1, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 1)
SMA200, SMA50, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 0)
解决方案
def get_SMA(df, periods):
'''
step 1) compute the cumulative sum of the dataframe.
step 2) compute the differences of the cumulative sum
step 3) skip the of the first period
'''
return df.cumsum(axis=0).diff(periods=periods, axis=0).loc[periods:, :] / periods;
def get_SMA_Stats( df_SMA, retro_days):
if retro_days > 0:
df_SMA = df_SMA[ 0 : len( df_SMA)-retro_days]
sma200 = get_SMA(df_SMA, 200)
sma50 = get_SMA(df_SMA, 50)
sma20 = get_SMA(df_SMA, 20)
sma10 = get_SMA(df_SMA, 10)
return sma200, sma50, sma20, sma10
在一项使用具有一百万行和 10 列的数据框的测试中,该函数get_SMA_stats
在这里花费了 0.3 秒。
推荐阅读
- javascript - datalist selected value is "null" in the sheet
- python - 更新实际图像后 Django Imagekit 不生成缩略图
- postgresql - 在 PostgreSQL 中从 JSON 迁移到 JSONB 是否安全
- kotlin - 如何将kotlin中的密封类转换为java
- swagger-2.0 - 从 openapi 生成的模型可以有自定义和多个路径吗?
- python - 完成屏幕测量后生成新屏幕,无需重启树莓派
- pdf2htmlex - 转换过程中的 pdf2htmlEX 错误 - CMap 无效并因字体而被删除
- html - 我自己的网站需要多长时间才能完全更新并显示我所做的新更改?
- python - 我的条目的 stringvar 无法正常工作
- java - 在SD卡中写入文件时权限被拒绝