我希望使用scipy替换少量的NULL数据,而不必将它们与不切实际的线性线连接起来(数据是可视化的)。我已经看过一些文档和示例,但很难将我看到的内容与我的上下文中的用法联系起来。
例如,如下所示;
我有一个方法可以找到之前的最后一个值以及这组NULL条目之后的第一个值。
我如何使用这些值并返回三个插值的对象来写入我的数据集?
编辑:
我正在尝试从数据创建两个numpy数组,这两个数组包含两个包含一系列NULL值的实数值。我从我编写的SQL服务器类中获取数据作为列表。我想这样做;
time = connection.getColumnData('DateTimeStamp', table, extreme_values['start_time'] + '.000', extreme_values['end_time'] + '.000')
val = connection.getColumnData(column, table, extreme_values['start_time'] + '.000', extreme_values['end_time'] + '.000')
time = [str(d) for d in time]
#val = [float(d) for d in val]
val_num = np.asarray(val, dtype=float)
time_num = np.asarray(time, dtype='datetime64')
not_nan = ~np.isnan(val_num, dtype=bool)
但它在运行时在线上断开;
filled_data = np.interp(time_num, time_num[not_nan], val_num[not_nan])
在每个val_num中举行;
array([ 5.625 , nan, nan, nan, 5.4375])
在time_num;
array(['2012-04-05T07:30:00+0000', '2012-04-05T08:00:00+0000',
'2012-04-05T08:30:00+0000', '2012-04-05T09:00:00+0000',
'2012-04-05T09:30:00+0000'], dtype='datetime64[s]')
在not_non;
array([ True, False, False, False, True], dtype=bool)
答案 0 :(得分:1)
假设您的数据包含两个numpy数组(称为data
和timestamp
),并且您希望根据NaN
数组填充data
数组中的not_nan = ~numpy.isnan(data)
filled_data = numpy.interp(timestamp, timestamp[not_nan], data[not_nan])
值时间戳,您可以使用numpy.interp
:
getColumnData
编辑:将数据放入numpy数组实际上是一个棘手的部分。我猜你的None
来电的结果大部分是数字的,NULL
的{{1}}值为In [3]: np.array([4,3,None,4,2,1])
Out[3]: array([4, 3, None, 4, 2, 1], dtype=object)
In [4]: np.isnan(_)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-4328b1685393> in <module>()
----> 1 np.isnan(_)
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
。让我们看看在这种情况下会发生什么:
None
numpy.isnan
的存在意味着numpy不知道这是一个数字数组,这就是In [7]: np.array([4,3,None,4,2,1], dtype=float)
Out[7]: array([ 4., 3., nan, 4., 2., 1.])
In [8]: np.isnan(_)
Out[8]: array([False, False, True, False, False, False], dtype=bool)
调用失败的原因。我们可以通过告诉numpy我们确实想要一个数字数组来解决这个问题:
{{1}}