我可以应用一个使用' shift'在分组数据框架上,从熊猫返回一个简单的数据框?

时间:2014-05-30 19:16:04

标签: python pandas quantitative-finance

我希望主题相对清晰。我正在使用python / pandas,而且我正在使用股票的每日定价数据。我有一个大型csv文件,其中包含4000多个符号的数据,大约100天#39;数据。因此,有许多重复的日期和符号值,但符号/日期组合是唯一的。对于多个滞后(轮班)日期,我试图在每个股票代码/日期组合上获得百分比变化。在一个符号的数据集上,这将像

一样简单
(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

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

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

1 个答案:

答案 0 :(得分:2)

我认为你可以使用groupbypct_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)

或其他什么。