2012-12-26 60 views
4

我知道有可能通过periods的论点进行抵消,但是如何实现在一个月内(例如交易日)传回的每日价格数据的归还?如何获取DataFrame.pct_change来计算每日价格数据的月度变化?

实例数据是:

In [1]: df.AAPL 
2009-01-02 16:00:00 90.36 
2009-01-05 16:00:00 94.18 
2009-01-06 16:00:00 92.62 
2009-01-07 16:00:00 90.62 
2009-01-08 16:00:00 92.30 
2009-01-09 16:00:00 90.19 
2009-01-12 16:00:00 88.28 
2009-01-13 16:00:00 87.34 
2009-01-14 16:00:00 84.97 
2009-01-15 16:00:00 83.02 
2009-01-16 16:00:00 81.98 
2009-01-20 16:00:00 77.87 
2009-01-21 16:00:00 82.48 
2009-01-22 16:00:00 87.98 
2009-01-23 16:00:00 87.98 
... 
2009-12-10 16:00:00 195.59 
2009-12-11 16:00:00 193.84 
2009-12-14 16:00:00 196.14 
2009-12-15 16:00:00 193.34 
2009-12-16 16:00:00 194.20 
2009-12-17 16:00:00 191.04 
2009-12-18 16:00:00 194.59 
2009-12-21 16:00:00 197.38 
2009-12-22 16:00:00 199.50 
2009-12-23 16:00:00 201.24 
2009-12-24 16:00:00 208.15 
2009-12-28 16:00:00 210.71 
2009-12-29 16:00:00 208.21 
2009-12-30 16:00:00 210.74 
2009-12-31 16:00:00 209.83 
Name: AAPL, Length: 252 

正如你所看到的,仅仅通过30抵消不会产生正确的结果,因为在时间戳数据差距,不是每个月都是30天,等我知道必须有一个简单的方法来使用熊猫来做到这一点。

+0

的差别是由于不同的频率:'BM'是业务月份,而“M”是月份(请参阅[docs](http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases))。 – bmu

回答

10

您可以将数据重新抽样为营业月份。如果你不希望的平均价格(这是在resample默认的),你可以使用关键字参数how使用自定义的重采样方法:

In [31]: from pandas.io import data as web 

# read some example data, note that this is not exactly your data! 
In [32]: s = web.get_data_yahoo('AAPL', start='2009-01-02', 
...        end='2009-12-31')['Adj Close'] 

# resample to business month and return the last value in the period 
In [34]: monthly = s.resample('BM', how=lambda x: x[-1]) 

In [35]: monthly 
Out[35]: 
Date 
2009-01-30  89.34 
2009-02-27  88.52 
2009-03-31 104.19 
... 
2009-10-30 186.84 
2009-11-30 198.15 
2009-12-31 208.88 
Freq: BM 

In [36]: monthly.pct_change() 
Out[36]: 
Date 
2009-01-30   NaN 
2009-02-27 -0.009178 
2009-03-31 0.177022 
... 
2009-10-30 0.016982 
2009-11-30 0.060533 
2009-12-31 0.054151 
Freq: BM 
+0

请注意,您也可以使用'asfreq('M',fill_method ='ffill')'。需要谨慎处理日间数据 –

+0

@WesMcKinney不知道哪种方法是首选的:通常我会使用'resample'。使用'asfreq'有什么优势? (当使用'asfreq'时,关键字似乎是'method'(而不是0.10中的'fill_method') – bmu

+0

请参阅问题中的**更新** – Dallas

相关问题