计算托管价值的最有效方法

2024-09-30 16:30:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我远不是熊猫专家。我是个普通的开发人员。你知道吗

我想计算一个管理价值。 我有一个df,是每天的市场价格(以日期为指数),dfTrend是0和1,指数相同。你知道吗

我想把这两个数据帧都发送到一个函数,得到一个管理值,也就是说当趋势为零时,我希望管理值保持不变,当趋势为1时,我希望值增加并跟随市场价格。你知道吗

例如:enter image description here

我的代码运行良好,但速度非常慢:

def getManagedValue(df, dfTrend):
    dfReturn = df.pct_change(1)
    dfManaged = df

    for col in df:
        for i in range(1, len(df[col])):
            dfManaged[col][0] = df[col][0]
            if dfTrend[col][i] == 1:
                dfManaged[col][i] = dfManaged[col][i-1] * (1 + dfReturn[col][i])
            else:
                dfManaged[col][i] = dfManaged[col][i-1]
    return dfManaged

有人知道我如何优化它,让它跑得更快吗?所有列的所有单元格的迭代肯定是这里的问题。你知道吗

我在考虑和cython合作,但我相信我不允许和cython一起使用熊猫,只有numpy的阵列。。。你知道吗

有人有什么建议吗?你知道吗

干杯, 朱利安


Tags: indffor市场开发人员价格col指数
3条回答

Pandas的速度和能力来自于对整个数组的操作,而不是对单个行和单元格进行迭代。如果我正确地遵循了原始示例中的逻辑,您可以使用np.where来更快地完成此操作:

dfManaged = np.where(dfTrend == 1, df.shift(1) * (1 + df.pct_change(1)), df.shift(1))
  • ^{} 允许您指定某些条件(在本例中,其中dfTrend == 1) 如果条件为真,则从一个数据帧赋值 (df.shift(1) * (1 + df.pct_change(1)))和另一个 条件为false(df.shift(1))。你知道吗
  • ^{}df中的所有值下移一行,如dfManaged[col][i-1] 但不需要迭代。你知道吗
  • 请注意,这会一次跨整个数据帧执行操作,而不是一次跨一行和一列。这应该会加快速度。你知道吗

从我收集的数据中,你可以用导数(df.pct_change(1))来重建你的曲线。当趋势为1时,您希望使用此导数,当趋势为0时,导数应为0。你知道吗

要有效地做到这一点有点棘手。一种尝试是(i)使用dfTrend修改导数,(ii)重新计算managed作为导数的累积和。您可能会遇到一些浮点错误,虽然我不确定。你知道吗

# step 1
deriv = 1 + df.pct_change(1)
deriv[dfTrend == 0] = 0 
# step 2
managed = np.cumsum(deriv)
# optional   remove potential floating point errors where possible
managed[dfTrend == 1] = df[dfTrend == 1]

谢谢你的回答。我终于自己找到了解决办法。你知道吗

数据帧为[2696行x305列], 用pandas数据帧(使用问题中的代码)处理它大约需要5分钟。你知道吗

我用了numpy数组,时间降到了2.30分钟。你知道吗

最后,我把所有的东西都用cythonized,降到了2.5秒,这绝对足够了。你知道吗

干杯, 朱利安

相关问题 更多 >