Я работаю на Python. У меня есть вектор значений в диапазоне, скажем, от 1 до 10. Я хочу добавить отсутствующие данные (ноль), значение линейно интерполировано

#python #missing-data #linear-interpolation

#питон #отсутствуют-данные #линейная интерполяция

Вопрос:

Я работаю на Python. У меня есть вектор значений в диапазоне, скажем, от 1 до 10. Я хочу добавить недостающие данные (нули), чтобы значение было линейно интерполировано:

 value = [2., 1., 0., 0., 0., 1., 1., 0., 0., 0.0001]  

Я хотел бы получить недостающие значения (нули) с помощью линейной интерполяции:

 value = [2., 1., 1., 1., 1., 1., 1., 0.666, 0.333, 0.0001]  

Комментарии:

1. Это разумно, и это не очень сложно. Вам просто нужна линейная интерполяция на основе соседних значений? Итак, вы на самом деле не хотите проводить «линию» из других точек? Что вы уже пробовали?

Ответ №1:

Я не должен этого делать, потому что мне кажется, что это может быть домашнее задание, но вот один из способов сделать это:

 value = [2., 1., 0., 0., 0., 1., 1., 0., 0., 0.0001]  #value = [2., 1., 1., 1., 1., 1., 1., 0.666, 0.333, 0.0001]  newdata = [] missing = 0 for v in value:  if v == 0.:  missing  = 1  else:  if missing:  lastgood = newdata[-1]  incr = (v - lastgood) / (missing   1)  for _ in range(missing):  lastgood  = incr  newdata.append( lastgood )  missing = 0  newdata.append( v ) print(newdata)  

Выход:

 [2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.6667000000000001, 0.3334000000000001, 0.0001]  

Это не выполняется, если набор данных начинается или заканчивается на 0.

Ответ №2:

Вы можете использовать pandas.Series.interpolate метод:

 import pandas as pd import numpy as np interpolated_values = pd.Series(value).replace(0,np.nan).interpolate()  

Ответ №3:

Вы можете использовать интерполяцию scipy

 import numpy as np from scipy.interpolate import interp1d  value = [2., 1., 0., 0., 0., 1., 1., 0., 0., 0.0001]  x = np.linspace(1, len(value), num=len(value)) x1 = [x[i] for i, _ in enumerate(value) if value[i] != 0] y1 = [v for v in value if v != 0] f = interp1d(x1, y1)  y = f(x)