【问题标题】:python pandas dataframe, operations on valuespython pandas数据框,对值的操作
【发布时间】:2014-10-23 00:32:59
【问题描述】:

我试图了解 Pandas DataFrames 如何向下复制信息,然后重置直到下一个变量发生变化...具体如下,一旦我的 Signal 或 Signal_Diff 从 1 切换到 0,如何使 Share_Amt_To_Buy 重置为 0?

在 Share_Amt_To_Buy 上使用 .cumsum() 最终会降低价值并积累,这并不是我想要做的。

我的目标是,当 Signal 从 0 变为 1 时,会计算并复制 Share_Amt_To_Buy,直到 Signal 切换回 0。然后如果 Signal 再次变为 1,我希望根据该时间点重新计算 Share_Amt_To_Buy。

希望这是有道理的 - 请告诉我。

Signal  Signal_Diff  Share_Amt_To_Buy (Correctly)  Share_Amt_To_Buy (Currently)
0       0            0                             0
0       0            0                             0
0       0            0                             0
1       1            100                           100
1       0            100                           100
1       0            100                           100
0       -1           0                             100
0       0            0                             100
1       1            180                           280
1       0            180                           280

如您所见,我的信号从 0 到 1 交替变化,这意味着以下内容: 0 = 没有交易(或头寸) 1 = 交易(持仓)

Signal_Diff 计算如下

portfolio['Signal_Diff'] = portfolio['Signal'].diff().fillna(0.0)

“Share_Amt_To_Buy”列是在信号从 0 变为 1 时计算的。我以以下为例进行计算

initial_cap = 100000.0
portfolio['close'] = my stock's closing prices as a float
portfolio['Share_Amt'] = np.where(variables['Signal']== 1.0, np.round(initial_cap / portfolio['close'] *     0.25 * portfolio['Signal']), 0.0).cumsum()

portfolio['Share_Amt_To_Buy'] = (portfolio['Share_Amt']*portfolio['Signal'])

【问题讨论】:

    标签: python pandas dataframe finance stock


    【解决方案1】:

    据我了解,熊猫没有内置公式模块。您可以对列、单元格、数组执行公式并从中生成不同的数组或值(df[column].count() 就是一个例子),并且可以做很多类似的工作,但是没有动态更新数组的方法本身基于数组中的另一个值(如 Excel 公式)。

    您总是可以反复执行该过程并说:

    >>> for index in df.index:
    >>>     if df['Signal_Diff'] == 0:
    >>>         df.loc[index, 'Signal_Diff'] = some_value
    >>>     elif df['Signal_Diff'] == 1:
    >>>         df.loc[index, 'Signal_Diff'] = some_other_value
    

    或者您可以通过地图工具创建自定义函数: https://stackoverflow.com/a/19226745/4131059

    编辑:

    另一种解决方案是在旧数组中查询所有值为 1 的索引,并在对数组进行一些更改时查询新数组:

    >>> df_old_list = df[df.Signal_Diff == 1].index.tolist()
    >>> ...
    >>> df_new_list = df[df.Signal_Diff == 1].index.tolist()
    >>>
    >>> for x in df_old_list:
    >>>     if x in df_new_list:
    >>>         df_new_list.remove(x)
    

    然后仅针对 df_new_list 中的索引重新计算。

    【讨论】:

    • 我喜欢你的 for 循环的第一个选项......为了确保我理解,你正在使用 for 循环来检查我的信号系列并填写在我的 share_amt 系列中计算的值,以创建第三个系列,这是逐行迭代的?
    • 是的,我正在使用 for 循环查看哪些值已更改,然后使用它重新计算 share_amt 系列。由于迭代并重新计算每个索引的每个值将花费很长时间,因此快速迭代列表然后仅检查已更改的索引会更快。
    • 例如,检查一列的所有值以查看它们是否等于某个值对于 10,000 列数据帧需要大约 1.8 到 18.8 毫秒(所以 2 倍,上限是如果所有true,如果全部为 false,则值较低),然后删除值需要 2.35 ms-664 ms(如果全部为 false,则较低),重新计算需要 100 μs,而重新定义每个值每个索引需要 ~120 μs,所以你'假设小于 ~2/3 的值变化,则速度更快(如果值没有变化,则约 5 毫秒,如果全部变化则为 1.6 秒,而检查所有内容则为 1 秒)。
    猜你喜欢
    • 2022-11-24
    • 2018-09-11
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2017-05-23
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多