我有一个包含雅虎金融股的DataFrames小组。 我想在Panel中按日期重新索引股票:
更具体一点: 用简单的话来说,我的意思是从2013年第一季度开始就获得与季度末的股票报价'AA'。
预期结果:
AA ['关闭'] ['March28,2013'] - AA ['开放'] ['2013年1月2日']
是8.52(3月收盘价) - 8.99(1月收盘价)= -0.47(差价)。
我希望在2010年第一季度到2013年第三季度的单日数据中为所有季度做到这一点,以获得差异。那就是将指数从每日变为季度。 最好的方法是什么?
谢谢大家。
答案 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
。