如何在时间序列中新增列计算当日/昨日价格的自然对数?
解决方案
要计算当日Promedio与昨日Promedio比值的自然对数,核心是拿到前一天的Promedio值和当日做比较,你之前的代码没做移位操作,所以达不到效果。直接用pandas的shift()函数就能搞定,这是时间序列处理移位的标准方法:
方法一:直接计算比值再取对数
import numpy as np import pandas as pd # 核心代码:用shift(1)获取前一行(昨日)的Promedio值 Accion1['Rentabilidad'] = np.log(Accion1['Promedio'] / Accion1['Promedio'].shift(1))
方法二:对数相减(结果和方法一完全一致)
根据对数运算法则,ln(a/b) = ln(a) - ln(b),也可以这么写:
Accion1['Rentabilidad'] = np.log(Accion1['Promedio']) - np.log(Accion1['Promedio'].shift(1))
处理缺失值
因为第一行没有前一天的数据,计算后会得到NaN,如果需要去掉这一行可以用:
Accion1 = Accion1.dropna(subset=['Rentabilidad'])
或者用特定值填充(比如0):
Accion1['Rentabilidad'] = Accion1['Rentabilidad'].fillna(0)
为什么你之前的方法不行?
- 你写的
np.log(Accion1['Promedio'])只是对当日价格单独取对数,没有和昨日价格做比值计算; - 用
iloc[0]/iloc[1]是固定取第一行和第二行的比值,不是逐行对应“当日/昨日”的关系,完全不符合时间序列的逐行移位需求。
内容的提问来源于stack exchange,提问作者jomjac
相关产品推荐
相关产品推荐

