Pandas:时间序列中按分组创建以100为基期的索引值
Pandas 计算股价基准指数实现方案
方案1:固定取2021-01-01价格为基准(最稳妥,不受数据排序影响)
直接提取指定基准日的股价生成映射关系,逐行计算指数值:
# 提取2021-01-01的所有股票基准价,生成{股票代码:基准价}的映射字典 base_price_map = data[data['Date'] == '2021-01-01'].set_index('Share')['Share_price'].to_dict() # 映射每行对应的基准价,计算指数值 data['price_index'] = data['Share_price'] / data['Share'].map(base_price_map) * 100
方案2:按分组取最早日期价格为基准(适配基准日不固定的场景)
如果你的基准规则是每个股票自身的最早交易日为基期,可以先排序再分组计算:
# 先按股票代码、日期升序排序,保证每个分组下最早的日期排在第一位 data = data.sort_values(by=['Share', 'Date']).reset_index(drop=True) # 按股票分组取每组第一个价格作为基准,计算指数 data['price_index'] = data['Share_price'] / data.groupby('Share')['Share_price'].transform('first') * 100
结果验证
以你提供的样例数据为例,计算后得到的price_index结果如下:
| Date | Share | Share_price | price_index |
|---|---|---|---|
| 2021-01-01 00:00:00 | nflx | 534 | 100.00 |
| 2021-01-01 00:00:00 | aapl | 126 | 100.00 |
| 2021-01-01 00:00:00 | amzn | 3270 | 100.00 |
| 2021-02-01 00:00:00 | nflx | 590 | ~110.49 |
| 2021-02-01 00:00:00 | aapl | 172 | ~136.51 |
| 2021-02-01 00:00:00 | amzn | 3059 | ~93.55 |
| 2021-03-01 00:00:00 | nflx | 552 | ~103.37 |
| 2021-03-01 00:00:00 | aapl | 160 | ~126.98 |
| 2021-03-01 00:00:00 | amzn | 3462 | ~105.87 |
注意:如果存在股票未在2021-01-01上市的情况,对应行的
price_index会返回NaN,可根据需求过滤处理。
内容的提问来源于stack exchange,提问作者Ballongknutte
相关产品推荐
相关产品推荐

