pd.Series интерполирует & np.polyfit не дает те же результаты - почему? - PullRequest
0 голосов
/ 23 мая 2019

Уважаемое сообщество 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, но мне все еще неясно, что на самом деле рассчитывается.

Больше всего мне хотелось бы знать, какой из двух методов является правильным для использования!

Большое спасибо заранее, Анаис

...