使用不同的索引来改变期末

时间:2013-07-27 13:43:26

标签: python-3.x pandas panel

我有一个包含雅虎金融股的DataFrames小组。 我想在Panel中按日期重新索引股票:

更具体一点: 用简单的话来说,我的意思是从2013年第一季度开始就获得与季度末的股票报价'AA'。

预期结果:
AA ['关闭'] ['March28,2013'] - AA ['开放'] ['2013年1月2日']
是8.52(3月收盘价) - 8.99(1月收盘价)= -0.47(差价)。

我希望在2010年第一季度到2013年第三季度的单日数据中为所有季度做到这一点,以获得差异。那就是将指数从每日变为季度。 最好的方法是什么?

谢谢大家。

1 个答案:

答案 0 :(得分: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方法来达到您正在寻找的频率:我将每季度进行一次演示,但您可以替换相应的code。我们将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

您可以在从Yahoo获得的面板中为每个DataFrame编写一个函数apply