#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)