1

我有一个包含雅虎金融股票的数据框面板。我想在面板内按日期重新索引股票:

更具体地说:我的意思是简单地说是从 2013 年第一季度开始获得差异,例如从季度末的股票报价“AA”。


AA['Close']['March28,2013'] - AA['Open']['January2,2013']的预期结果
是 8.52(3 月收盘价)- 8.99(1 月收盘价)= -0.47(区别)。

我想对从 2010 年第一季度到 2013 年第三季度的单日数据中的所有季度执行此操作,以获得差异。也就是将指数从每日改为季度。最好的方法是什么?

谢谢大家。

4

1 回答 1

1

您应该发布您希望解决方案的样子,以便我知道我正在回答正确的问题。我认为我解释你的问题的方式没有意义。编辑您的问题以澄清,我将相应地编辑我的答案。

当您使用时间序列数据时,有一些特殊resampling的方法在这种情况下很方便。从概念上讲,它们类似于groupby操作。

首先,获取数据:

pan = DataReader(['AAPL', 'GM'], data_source='yahoo')

为了演示,只关注 AAPL。

df = pan.xs('AAPL', axis='minor')

In [24]: df.head()
Out[24]: 
              Open    High     Low   Close    Volume  Adj Close
Date                                                           
2010-01-04  213.43  214.50  212.38  214.01  17633200     209.51
2010-01-05  214.60  215.59  213.25  214.38  21496600     209.87
2010-01-06  214.38  215.23  210.75  210.97  19720000     206.53
2010-01-07  211.75  212.00  209.05  210.58  17040400     206.15
2010-01-08  210.30  212.00  209.06  211.98  15986100     207.52

现在使用该resample方法来获得您正在寻找的频率:我将每季度进行一次演示,但您可以替换适当的代码。我们将BQS用于 *B*usiness *Q*uarterly *S*tart of Quarter。为了汇总,我们取总和。

In [33]: df.resample('BQS', how='sum').head()
Out[33]: 
                Open      High       Low     Close      Volume  Adj Close
Date                                                                     
2010-01-01  12866.86  12989.62  12720.40  12862.16  1360687400   12591.73
2010-04-01  16083.11  16255.98  15791.50  16048.55  1682179900   15711.11
2010-07-01  16630.16  16801.60  16437.74  16633.93  1325312300   16284.18
2010-10-01  19929.19  20069.74  19775.96  19935.66  1025567800   19516.49
2011-01-03  21413.54  21584.60  21219.88  21432.36  1122998000   20981.76

好的,所以现在我们想要Open今天减去Close昨天的总变化。或(today / yesterday) - 1百分比变化。为此,请使用shift将所有数据向下移动一行的方法。

In [34]: df.resample('BQS', how='sum')['Open'] - df.resample('BQS', how='sum').shift()['Close']
Out[34]: 
Date
2010-01-01         NaN
2010-04-01     3220.95
2010-07-01      581.61
2010-10-01     3295.26
2011-01-03     1477.88
2011-04-01     -119.37
2011-07-01     3058.69
2011-10-03      338.77
2012-01-02     6487.65
2012-04-02     5479.15
2012-07-02     3698.52
2012-10-01    -4367.70
2013-01-01    -7767.81
2013-04-01     -355.53
2013-07-01   -19491.64
Freq: BQS-JAN, dtype: float64

您可以编写一个函数并将apply其写入从 Yahoo 获得的面板中的每个 DataFrame。

于 2013-07-27T14:36:23.687 回答