【问题标题】:Can I apply a function that uses 'shift' on a grouped data frame, and return a simple data frame from pandas?我可以在分组数据帧上应用一个使用“shift”的函数,并从熊猫返回一个简单的数据帧吗?
【发布时间】:2014-05-30 19:16:04
【问题描述】:

我希望主题行相对清晰。我正在使用 python/pandas,并且正在处理股票的每日定价数据。我有一个包含 4000 多个符号数据的大型 csv 文件,其中包含大约 100 天的数据。所以有很多重复的日期和符号值,但符号/日期组合是唯一的。对于多个滞后(班次)日期,我正在尝试获取每个代码/日期组合的百分比变化。在一个符号的数据集上,这就像

(dataframe.Close - dataframe.Close.shift(1)) / dataframe.shift(1).

这是初始数据的示例:

TradeDate    Symbol    Close
1/1/2014     A         10.00
1/2/2014     A         11.00
1/3/2014     A         10.50
1/1/2014     B         2.00
1/2/2014     B         2.10
1/3/2014     B         2.05

我想要得到的输出是:

TradeDate    Symbol    Perf1    Perf2
1/1/2014     A         NA       NA
1/2/2014     A         0.10     NA
1/3/2014     A         -0.045   0.05
1/1/2014     B         NA       NA
1/2/2014     B         0.05     NA
1/3/2014     B         -0.024   0.025

我是 pandas 的新手,我一直在网上搜索类似的示例或更一般的处理方法来在 pandas 中的组上应用矢量化函数。我运气不太好;我尝试了更传统的方法,循环遍历一个独特的代码列表,单独计算性能百分比,将它们组合成一个数据框,然后将其附加到一个“主”数据框。它有效,但需要 20 多分钟(而且非常笨拙)。我确信有更好的方法。但我还不知道如何询问具体的功能细节。

有人可以帮忙吗?谢谢...

【问题讨论】:

    标签: python pandas quantitative-finance


    【解决方案1】:

    我认为你可以使用groupby 和pct_change(不要怪我的名字..)。

    首先,让我们确保一切都是实时的并对其进行排序:

    >>> df["TradeDate"] = pd.to_datetime(df["TradeDate"])
    >>> df = df.sort(["Symbol", "TradeDate"])
    >>> df
       TradeDate Symbol  Close
    0 2014-01-01      A  10.00
    1 2014-01-02      A  11.00
    2 2014-01-03      A  10.50
    3 2014-01-01      B   2.00
    4 2014-01-02      B   2.10
    5 2014-01-03      B   2.05
    

    然后做工作:

    >>> df.groupby("Symbol")["Close"].pct_change()
    0         NaN
    1    0.100000
    2   -0.045455
    3         NaN
    4    0.050000
    5   -0.023810
    dtype: float64
    >>> df["Perf1"] = df.groupby("Symbol")["Close"].pct_change()
    >>> df["Perf2"] = df.groupby("Symbol")["Close"].pct_change(2)
    >>> df
       TradeDate Symbol  Close     Perf1  Perf2
    0 2014-01-01      A  10.00       NaN    NaN
    1 2014-01-02      A  11.00  0.100000    NaN
    2 2014-01-03      A  10.50 -0.045455  0.050
    3 2014-01-01      B   2.00       NaN    NaN
    4 2014-01-02      B   2.10  0.050000    NaN
    5 2014-01-03      B   2.05 -0.023810  0.025
    

    进行一次分组可能会更干净,例如

    grouped = df.groupby("Symbol")["Close"]
    for i in range(1,5):
        df["Perf{}".format(i)] = grouped.pct_change(i)
    

    什么的。

    【讨论】:

    • 太棒了。以高调结束我的一周的方式。我有一些阅读要做。
    猜你喜欢
    • 2021-12-02
    • 2018-08-18
    • 1970-01-01
    • 2021-04-26
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多