使用numpy进行拉格朗日插值时的运行时警告

1 投票
1 回答
839 浏览
提问于 2025-04-18 15:28

我正在尝试在时间序列上实现拉格朗日插值。我的输入数据格式如下,包含两列:日期时间和股票值。

'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

1 个回答

1

你的日期转换结果中的 x 值很大。把这些大值放进一个(拉格朗日)多项式里,然后再进行插值计算,可能会导致数值不稳定的情况发生(因为对于大的 x 值,要得到相对较小的 y 值,你需要用到很小的系数)。

另外,关于 scipy.interpolate.lagrange 的文档也提醒说,这个实现方法在数值上是不稳定的。

所以,最好把你的数据归一化到一些合理的数字。你可以减去一个特定的日期;默认情况下使用的是1970年,也就是Unix时间的起点,这显然不是个好选择。对于你的例子日期,可以选择比如2012年3月1日,或者用一个中间值去除(1332000000可能是个不错的选择),这样可以让你的所有值都接近1。

撰写回答