向量化 for 循环并返回 x 天的最高价和最低价

2024-05-12

Overview

对于数据帧的每一行,我想计算 x 天的最高价和最低价。

x 天的高点高于前 x 天。 x 天的低点低于前 x 天。

for 循环在此有更详细的解释post https://stackoverflow.com/questions/70138987/pandas-calculate-x-day-high-value

Update:

下面@mozway 的回答在大约 20 秒内完成,数据集包含 18k 行。这可以通过 numpy 和广播等来改进吗?

Example

2020-03-20有一个x_day_low的价值1因为它低于前一天。

2020-03-27 has an x_day_high的价值8因为它高于前 8 天。

请参阅下面的所需输出和测试代码,其中使用 for 循环计算findHighLow功能。我将如何矢量化findHighLow因为实际的数据框有点大。

测试数据

def genMockDataFrame(days,startPrice,colName,startDate,seed=None): 
   
    periods = days*24
    np.random.seed(seed)
    steps = np.random.normal(loc=0, scale=0.0018, size=periods)
    steps[0]=0
    P = startPrice+np.cumsum(steps)
    P = [round(i,4) for i in P]

    fxDF = pd.DataFrame({ 
        'ticker':np.repeat( [colName], periods ),
        'date':np.tile( pd.date_range(startDate, periods=periods, freq='H'), 1 ),
        'price':(P)})
    fxDF.index = pd.to_datetime(fxDF.date)
    fxDF = fxDF.price.resample('D').ohlc()
    fxDF.columns = [i.title() for i in fxDF.columns]
    return fxDF

#rows set to 15 for minimal example but actual dataframe contains around 18000 rows.
number_of_rows = 15    

df = genMockDataFrame(number_of_rows,1.1904,'tttmmm','19/3/2020',seed=157)

def findHighLow (df):

    df['x_day_high'] = 0
    df['x_day_low'] = 0

    for n in reversed(range(len(df['High']))):
        for i in reversed(range(n)):
                if df['High'][n] > df['High'][i]:
                    df['x_day_high'][n] = n - i
                else: break

    for n in reversed(range(len(df['Low']))):
        for i in reversed(range(n)):
                if df['Low'][n] < df['Low'][i]:
                    df['x_day_low'][n] = n - i
                else: break
    return df

df = findHighLow (df)

所需的输出应与此匹配:

df[["High","Low","x_day_high","x_day_low"]]

             High   Low x_day_high  x_day_low
date                
2020-03-19  1.1937  1.1832  0       0
2020-03-20  1.1879  1.1769  0       1
2020-03-21  1.1767  1.1662  0       2
2020-03-22  1.1721  1.1611  0       3
2020-03-23  1.1819  1.1690  2       0
2020-03-24  1.1928  1.1807  4       0
2020-03-25  1.1939  1.1864  6       0
2020-03-26  1.2141  1.1964  7       0
2020-03-27  1.2144  1.2039  8       0
2020-03-28  1.2099  1.2018  0       1
2020-03-29  1.2033  1.1853  0       4
2020-03-30  1.1887  1.1806  0       6
2020-03-31  1.1972  1.1873  1       0 
2020-04-01  1.1997  1.1914  2       0
2020-04-02  1.1924  1.1781  0       9

这里有两个解决方案。两者都会产生所需的输出,如问题中所发布的。

第一个解决方案使用 Numba,在我的机器上 0.5 秒内完成 20k 行。如果您可以使用 Numba,那么这就是您的最佳选择。第二个解决方案仅使用 Pandas/Numpy,并在 1.5 秒内完成 20k 行。

Numba

@numba.njit
def count_smaller(arr):
    current = arr[-1]
    count = 0
    
    for i in range(arr.shape[0]-2, -1, -1):
        if arr[i] > current:
            break
        
        count += 1
        
    return count


@numba.njit
def count_greater(arr):
    current = arr[-1]
    count = 0
    
    for i in range(arr.shape[0]-2, -1, -1):
        if arr[i] < current:
            break
        
        count += 1
        
    return count

df["x_day_high"] = df.High.expanding().apply(count_smaller, engine='numba', raw=True)
df["x_day_low"] = df.Low.expanding().apply(count_greater, engine='numba', raw=True)

熊猫/Numpy

def count_consecutive_true(bool_arr):
    return bool_arr[::-1].cumprod().sum()

def count_smaller(arr):
    return count_consecutive_true(arr <= arr[-1]) - 1

def count_greater(arr):
    return count_consecutive_true(arr >= arr[-1]) - 1

df["x_day_high"] = df.High.expanding().apply(count_smaller, raw=True)
df["x_day_low"] = df.Low.expanding().apply(count_greater, raw=True)

最后一个解决方案与 mozway 的类似。然而它运行得更快,因为它不需要执行连接并尽可能多地使用 numpy。它看起来也任意遥远。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向量化 for 循环并返回 x 天的最高价和最低价 的相关文章

随机推荐

  • 使用 std::min_element() 时保存函数计算

    假设给你一个 2D 点向量 并期望找到最少的点欧几里得范数 http en wikipedia org wiki Norm 28mathematics 29 Euclidean norm 点提供为std vector
  • 对 Python 中的嵌套字典进行排序

    我有以下字典 var a Black grams 1906 price 2 05 Blue grams 9526 price 22 88 Gold grams 194 price 8 24 Magenta grams 6035 price
  • MS Access:在列中搜索星号/星号

    我正在寻找一种方法来搜索包含字符串数据类型的列 问题是星号或星号是保留符号 以下查询无法正常工作 select from users where instr pattern 如何编写 Access 查询来搜索列中的星号 您可以使用方括号在
  • 向控制器发送参数

    我懂了
  • Tkinter:无法识别图像文件中的数据[重复]

    这个问题在这里已经有答案了 我有以下问题 我使用外部应用程序生成 GIF 文件 对我来说 GIF 看起来不错 我可以毫无问题地打开它们 然而 使用 photo PhotoImage file screenshot file self pre
  • 在 jelly 脚本中使用 JavaScript

    我正在尝试在 Jenkins 中使用用 JavaScript 编写的脚本 我认为最简单的方法是在 jelly 脚本中调用它们 例如 我有文件 myCustom js alert Hello World function myFunction
  • 在 C++/CLI 中创建时初始化静态字典

    今天我看到创建静态字典并初始化它的 C 代码 public static readonly Dictionary
  • gradle.properties 文件放在哪里

    我正在关注Artifactory1 分钟设置 http www jfrog com video artifactory 1 min setup 我在本地主机上启动并运行了 Artifactory 现在我正在尝试将其与 Intellij Gr
  • 如何根据原始元素将向量中的元素替换为另一个元素[重复]

    这个问题在这里已经有答案了 请考虑以下程序 这是一个最小化的示例 所以不要纠结于我在这里尝试做的事情可以通过以下方式更好地实现 HashMap
  • JavaFX - Outlook 附件 - DnD

    您好 我需要一个 DnD 解决方案来将 Outlook 邮件附件拖到堆栈窗格中 JavaFX Outlook 2010 stackpaneDragAndDropZone setOnDragOver DragEvent event gt Dr
  • 如果存在从 S 到 T 的恒等转换,那么 S 和 T 一定是同一类型吗?

    在 6 1 6 中 C 语言规范中有 隐式引用转换为 从任何引用类型到引用类型 T 如果它具有到引用类型 T0 的隐式标识或引用转换 并且 T0 具有到 T 的标识转换 他们为什么不直接说 从任何引用类型到引用类型 T 如果它具有到 T 的
  • 使用 Spring 验证框架验证请求标头

    是否可以将 Spring 验证框架与 Spring MVC 结合使用来验证 HTTP 请求标头的存在和值 要检查presence请求标头的 您不需要验证框架 请求标头参数默认是强制的 如果请求中缺少强制标头 Spring MVC 会自动响应
  • 可以写入 csv 文件但不能追加

    string pathDesktop Environment GetFolderPath Environment SpecialFolder Desktop string filePath pathDesktop mycsvfile csv
  • 如何编写长时间运行的活动来调用 WF 4.0 中的 Web 服务

    我创建了一个执行 Web 请求并将结果存储到数据库中的活动 我发现对于这些长时间运行的活动 我应该编写一些不同的代码 以便工作流引擎线程不会被阻塞 public sealed class WebSaveActivity NativeActi
  • 使用 LIKE 和撇号的 Mysql 查询问题

    所以我有一个有趣的问题 我从未遇到过 并且似乎找不到太多有关纠正该问题的信息 我有一个庞大的数据库 里面有大量的数据 相当于 10 年的数据 并试图对其进行搜索 现在搜索功能运行良好 但最近有人让我注意到一个 错误 如果你愿意的话 我尝试对
  • Android SSL 无对等证书

    我有一个例外 没有同行证书 当我询问谷歌时 我得到了解决方案 我信任所有证书 但这个问题的答案是 它是不安全的 所以我给班级打电话 HostnameVerifier hostnameVerifier org apache http conn
  • Java:获取当前正在执行的Method对应的对象

    将当前正在执行的方法作为 Method 对象获取的最优雅的方法是什么 我的第一个明显的方法是在辅助类中使用静态方法 该方法将加载当前线程堆栈 获取正确的堆栈跟踪元素 并根据其信息构造 Method 元素 有没有更优雅的方法来实现这一目标 这
  • mlflow 如何使用自定义转换器保存 sklearn 管道?

    我正在尝试使用 mlflow 保存 sklearn 机器学习模型 这是一个包含我定义的自定义转换器的管道 并将其加载到另一个项目中 我的自定义转换器继承自 BaseEstimator 和 TransformerMixin 假设我有 2 个项
  • 读取文件并获取 key=value 而不使用 java.util.Properties

    我正在构建一个 RMI 游戏 客户端将加载一个包含一些键和值的文件 这些键和值将用于多个不同的对象 它是一个保存游戏文件 但我不能为此使用 java util Properties 它符合规范 我必须读取整个文件并忽略注释行和与某些类不相关
  • 向量化 for 循环并返回 x 天的最高价和最低价

    Overview 对于数据帧的每一行 我想计算 x 天的最高价和最低价 x 天的高点高于前 x 天 x 天的低点低于前 x 天 for 循环在此有更详细的解释post https stackoverflow com questions 70