Python 使用熊猫的每日价格数据(带有日期戳)计算每周/每月的滚动变化
我有一个每日股票价格数据的数据框架,它有时间戳。想知道最简单的方法来创建新的列,这些列包含此价格数据的每周、每月或年度增长率,但以滚动为基础 请注意,我的每日价格数据仅包括价格发生变化的记录。i、 e.非交易日无记录 例如,我想生成如下内容:Python 使用熊猫的每日价格数据(带有日期戳)计算每周/每月的滚动变化,python,pandas,Python,Pandas,我有一个每日股票价格数据的数据框架,它有时间戳。想知道最简单的方法来创建新的列,这些列包含此价格数据的每周、每月或年度增长率,但以滚动为基础 请注意,我的每日价格数据仅包括价格发生变化的记录。i、 e.非交易日无记录 例如,我想生成如下内容: | | daily | weekly | monthly | |------------|-------|--------|---------| | 1/01/2000 | 2.00 | NaN | NaN | |
| | 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 |
每周的计算很简单,看起来你可以延迟五天:
shifted = data['daily'].shift(5)
data['weekly'] = (data['daily'] - shifted) / shifted
每月比较困难,因为它似乎是缺少日期的地方,您希望采用上一个可用日期(即2000年2月2日,您将其与2000年1月1日进行比较,因为没有2000年2月1日)。或者至少我认为从结果来看,这就是你想要的。为此,您需要首先使用data\u range()
和reindex()
使用“pad”填充方法填充缺失的日期,以获取前一天的值
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'))
太好了,非常感谢。也很容易适应年利率。