Уважаемое сообщество Stackoverflow,
Я хочу интерполировать имеющиеся у меня данные по временному ряду. У меня есть следующие данные:
90 0
270 22.5
450 294
630 786
810 833.5
990 473.5
1170 60.375
1350 0
Первый столбец - минуты (или ось X), а второй столбец - мои данные (ось Y).
Я хотел бы использовать полиномиальную функцию для интерполяции данных и поиска значений, соответствующих следующей оси x:
[60, 120, 180, 240, 300, 360, 420, 480, 540, 600, 660, 720, 780, 840, 900, 960, 1020, 1080, 1140, 1200, 1260, 1320, 1380, 1440]
. На самом деле это часы, которые я пересчитал в минуты: мои исходные данные содержат данные в 1 ч 30 (90), 4 ч 30 (270) и т. Д., И я хотел бы интерполировать данные и получить в качестве выходных данных 1 ч, 2 ч и т. Д. Для весь день.
Я изначально использовал pandas.Series.interpolate
(метод1). Я сравнил различные порядки полиномов, чтобы найти, какой из них подходит лучше всего. При всех заказах все полиномы проходят мимо моих точек данных. Кажется, порядок 2 полиномов хорошо совпадает, как и все остальные, см. Рисунок.
Затем я бы переиндексировал мою серию, которая имеет хорошую точность index_1H, чтобы получить мои данные.
Однако я только что сравнил свои данные с Excel, и в Excel очевидно, что порядок 2 и 3 полиномов даже не проходит мимо моего набора данных.
Затем я использовал np.polyfit
(method2), и он дает результаты, аналогичные Excel.
импорт панд в виде pd
импортировать numpy как np
# FIRST METHOD WITH pandas.Series.interpolate
indexx = [90, 270, 450, 630, 810, 990, 1170, 1350]
dataa = [0, 22.5, 294, 786, 833.5, 473.5, 60.375, 0]
s = pd.Series(dataa,index=indexx)
index_30min = [60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360, 390, 420, 450, 480, 510, 540, 570, 600, 630, 660, 690, 720, 750, 780, 810, 840, 870, 900, 930, 960, 990, 1020, 1050, 1080, 1110, 1140, 1170, 1200, 1230, 1260, 1290, 1320, 1350, 1380, 1410, 1440]
index_1H = [60, 120, 180, 240, 300, 360, 420, 480, 540, 600, 660, 720, 780, 840, 900, 960, 1020, 1080, 1140, 1200, 1260, 1320, 1380, 1440]
s_1H = s.reindex(index_1H)
s_30min = s.reindex(index_30min)
s2 = s_30min.interpolate(method='polynomial', order=2)
s3 = s_30min.interpolate(method='cubic')
s4 = s_30min.interpolate(method='quadratic')
s5 = s_30min.interpolate(method='polynomial', order=5)
s7 = s_30min.interpolate(method='polynomial', order=7)
polynome = pd.concat([s2, s3, s4, s5, s7], axis=1)
polynome.columns = ["s2", "s3", "s4", "s5", "s7"]
polynome = polynome.assign(init=s)
polynome.plot()
# SECOND METHOD WITH NUMPY POLYFIT
x = np.array([90, 270, 450, 630, 810, 990, 1170, 1350])
y = np.array([0, 22.5, 294, 786, 833.5, 473.5, 60.375, 0])
z = np.polyfit(x, y, 5) # 5 is the order here
p = np.poly1d(z)
Результаты:
Для метода1 я получаю следующий рисунок: все подходит для полинома
Для method2, с порядком 7, если я строю p (450), я получаю 294.0000000001205
При заказе 2, если я строю график p (450), я получаю 479.1227678571424. Эти значения соответствуют значениям, которые я нашел в Excel. Цифра в Excel здесь: полиномы порядка 2 и 3 вообще не подходят
Я хотел бы понять, что именно делает функция numpy.polyfit и что делает pandas.Series.interpolate. Последний относится к scipy.interpolate.interp1d, но мне все еще неясно, что на самом деле рассчитывается.
Больше всего мне хотелось бы знать, какой из двух методов является правильным для использования!
Большое спасибо заранее,
Анаис