使用pandas

时间:2017-04-28 09:26:55

标签: python pandas

我有一个每日股票价格数据的熊猫数据框,这是日期时间标记的。想知道创建新列的最简单方法,这些列具有每周,每月或每年的价格数据增长率,但是在滚动的基础上。

请注意,我的每日价格数据仅包含价格变动的记录。即没有非交易日的记录。

例如,我想生成这样的东西:

|            | 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   |

1 个答案:

答案 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'))