我正在尝试在时间序列上实现拉格朗日插值。我的输入采用以下格式,其中包含两列datetime和stock value
'3/8/2012 16:00:00 32.21'
'3/9/2012 16:00:00 32.16'
'3/12/2012 16:00:00 32.2'
'3/13/2012 16:00:00 Missing_1'
'3/14/2012 16:00:00 32.88'
'3/15/2012 16:00:00 32.94'
'3/16/2012 16:00:00 32.95'
'3/19/2012 16:00:00 32.61'
'3/20/2012 16:00:00 32.15'
'3/21/2012 16:00:00 Missing_2'
'3/22/2012 16:00:00 32.09'
'3/23/2012 16:00:00 32.11'
'3/26/2012 16:00:00 Missing_3'
在某些输入案例中,缺少股票价值,我试图使用scipy.interpolate预测这些缺失值
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
for k in a: # a is input list
x,y = k.split("\t")
if is_number(y):
x = datetime.datetime.strptime(x,"%m/%d/%Y %H:%M:%S")
x = time.mktime(x.timetuple())
y = float(y)
x_axis.append(x)
y_axis.append(y)
else:
x = datetime.datetime.strptime(x,"%m/%d/%Y %H:%M:%S")
x = time.mktime(x.timetuple())
unknown_x.append(x)
x = np.array(x_axis)
y = np.array(y_axis)
unknown = np.array(unknown_x)
y_interp=scipy.interpolate.lagrange(x, y)
for k in unknown:
print y_interp(k)
但我得到运行时警告,
/var/ml/python/local/lib/python2.7/site-packages/numpy/lib/polynomial.py:728: RuntimeWarning: invalid value encountered in add
val = NX.concatenate((zr, a1)) + a2
/var/ml/python/local/lib/python2.7/site-packages/numpy/lib/polynomial.py:725: RuntimeWarning: invalid value encountered in add
val = a1 + a2
答案 0 :(得分:1)
您日期转换后的x
会产生较大的值。输入(拉格朗日)多项式中的那些然后尝试进行插值可能会导致数值不稳定的计算(因为,对于大x
来获得相对较小的y
,您需要小系数)。
此外,scipy.interpolate.lagrange的文档警告说实施在数值上不稳定。
始终将您的数据规范化为合理的数字。你可以减去某个日期;默认使用1970,unix零时,这显然是一个糟糕的选择。根据您的示例日期,选择例如2012年3月1日的第一个),或者在中间的某个位置除以一个值(1332000000可能是一个很好的值),以使你的所有值都在1左右。