我有一个每日股票价格数据的熊猫数据框,这是日期时间标记的。想知道创建新列的最简单方法,这些列具有每周,每月或每年的价格数据增长率,但是在滚动的基础上。
请注意,我的每日价格数据仅包含价格变动的记录。即没有非交易日的记录。
例如,我想生成这样的东西:
| | daily | weekly | monthly |
|------------|-------|--------|---------|
| 1/01/2000 | 2.00 | NaN | NaN |
| 3/01/2000 | 4.05 | NaN | NaN |
| 4/01/2000 | 2.10 | NaN | NaN |
| 5/01/2000 | 2.15 | NaN | NaN |
| 6/01/2000 | 3.20 | NaN | NaN |
| 7/01/2000 | 3.25 | 0.625 | NaN |
| 10/01/2000 | 3.30 | -0.185 | NaN |
| 11/01/2000 | 3.35 | 0.595 | NaN |
| 12/01/2000 | 3.40 | 0.581 | NaN |
| 13/01/2000 | 4.45 | 0.391 | NaN |
| 14/01/2000 | 2.50 | -0.231 | NaN |
| 17/01/2000 | 3.55 | 0.076 | NaN |
| 18/01/2000 | 4.60 | 0.373 | NaN |
| 19/01/2000 | 2.65 | -0.221 | NaN |
| 20/01/2000 | 4.70 | 0.056 | NaN |
| 21/01/2000 | 3.75 | 0.500 | NaN |
| 24/01/2000 | 2.80 | -0.211 | NaN |
| 25/01/2000 | 3.85 | -0.163 | NaN |
| 26/01/2000 | 3.90 | 0.472 | NaN |
| 27/01/2000 | 2.95 | -0.372 | NaN |
| 28/01/2000 | 3.00 | -0.200 | NaN |
| 31/01/2000 | 4.05 | 0.446 | NaN |
| 1/02/2000 | 3.10 | -0.195 | 0.550 |
| 2/02/2000 | 3.15 | -0.192 | 0.575 |
| 3/02/2000 | 5.20 | 0.763 | 0.284 |
| 4/02/2000 | 4.25 | 0.417 | 1.024 |
| 7/02/2000 | 5.30 | 0.309 | 0.631 |
| 8/02/2000 | 4.35 | 0.403 | 0.338 |
答案 0 :(得分:2)
每周的计算很容易,似乎你可以将它延迟五天:
shifted = data['daily'].shift(5)
data['weekly'] = (data['daily'] - shifted) / shifted
每月更难,因为看起来像是在某个日期缺少您希望采用之前的可用日期(即在2000年2月2日您比较为1/1/2000,因为没有2/1 / 2000)。或者至少我认为这是你想要的结果。为此,您需要先使用" pad"使用data_range()
和reindex()
填写缺少的日期。填写方法以获取前一天的价值。
data.index = pd.to_datetime(data.index, dayfirst=True)
lag_data = data.reindex(pd.date_range(data.index.min(), data.index.max()), method='pad')
lag_data.index = lag_data.index + pd.DateOffset(31)
monthly = (data['daily'] - lag_data['daily']) / lag_data['daily']
data.join(monthly.rename('monthly'))