您应该发布您希望解决方案的样子,以便我知道我正在回答正确的问题。我认为我解释你的问题的方式没有意义。编辑您的问题以澄清,我将相应地编辑我的答案。
当您使用时间序列数据时,有一些特殊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。