построение двух функций interp1d со вторичной осью y - PullRequest
0 голосов
/ 06 июня 2018

У меня есть две функции interp1d, использующие сплайн-интерполяцию, и я хотел бы добавить вторичную ось на графике.

f1 = interp1d(a, b, kind='cubic')
f2 = interp1d(x, y, kind='cubic')

time = pd.to_datetime(a)
t = pd.to_datetime(x)

plt.plot(time,f1(time),color='green')
plt.plot(t,f2(t),color='red')

Вывод: График Interp1d

Вотпеременная для x, y

x
array([1.5224544e+18, 1.5145920e+18, 1.5067296e+18, 1.4988672e+18,
   1.4910048e+18, 1.4831424e+18, 1.4746752e+18, 1.4668128e+18,
   1.4589504e+18, 1.4510880e+18, 1.4432256e+18, 1.4353632e+18,
   1.4275008e+18, 1.4196384e+18, 1.4117760e+18, 1.4039136e+18,
   1.3960512e+18, 1.3881888e+18, 1.3803264e+18, 1.3724640e+18,
   1.3646016e+18, 1.3567392e+18, 1.3488768e+18, 1.3410144e+18,
   1.3331520e+18, 1.3252896e+18, 1.3168224e+18, 1.3089600e+18,
   1.3010976e+18, 1.2932352e+18, 1.2853728e+18, 1.2775104e+18,
   1.2696480e+18, 1.2617856e+18, 1.2539232e+18, 1.2224736e+18,
   1.1910240e+18])

y
date
2018-03-31    0.208044
2017-12-30    0.202789
2017-09-30    0.201890
2017-07-01    0.200773
2017-04-01    0.200018
2016-12-31    0.201298
2016-09-24    0.207214
2016-06-25    0.212382
2016-03-26    0.218203
2015-12-26    0.223881
2015-09-26    0.224409
2015-06-27    0.222381
2015-03-28    0.221986
2014-12-27    0.219190
2014-09-27    0.212183
2014-06-28    0.213164
2014-03-29    0.210773
2013-12-28    0.208846
2013-09-28    0.211710
2013-06-29    0.218486
2013-03-30    0.230000
2012-12-29    0.249656
2012-09-29    0.264155
2012-06-30    0.266402
2012-03-31    0.268421
2011-12-31    0.255537
2011-09-24    0.236561
2011-06-25    0.232660
2011-03-26    0.221534
2010-12-25    0.215534
2010-09-25    0.213045
2010-06-26    0.211977
2010-03-27    0.208876
2009-12-26    0.197382
2009-09-26    0.186750
2008-09-27    0.151902
2007-09-29    0.125185
Name: value, dtype: float64

Здесь приведены переменные для a, b

a
array([1.5281568e+18, 1.4619744e+18, 1.4330304e+18, 1.3725504e+18,
       1.3489632e+18, 1.3093920e+18, 1.2988512e+18, 1.2832128e+18,
       1.2725856e+18, 1.2306816e+18, 1.2042432e+18, 1.1990592e+18,
       1.1726208e+18, 1.1648448e+18, 1.1516256e+18, 1.1386656e+18,
       1.1095488e+18, 1.0490688e+18])

b
2018-06-05    193.310000
2016-04-30     90.014780
2015-05-31    123.342948
2013-06-30     51.462246
2012-09-30     85.115356
2011-06-30     42.645786
2011-02-28     44.874186
2010-08-31     30.885067
2010-04-30     33.170639
2008-12-31     10.843441
2008-02-29     15.883386
2007-12-31     25.165422
2007-02-28     10.749426
2006-11-30     11.645106
2006-06-30      7.275968
2006-01-31      9.593301
2005-02-28      5.699318
2003-03-31      0.898221
Name: value, dtype: float64

Кроме того, мне было бы интересно узнать, есть ли способ измерения корреляции между двумя interp1dфункции.

Может ли кто-нибудь предложить какие-либо рекомендации?

Заранее спасибо.


Итак, я попытался воспроизвести ваши коды путем повторной выборки и интерполяции, используя следующиекод.

f1_lin = interp1d(a, b, kind='linear')
f1_cub = interp1d(a, b, kind='cubic')
f1_near = interp1d(a, b, kind='nearest')

t=np.linspace(min(a),max(a))
plt.figure()
plt.plot(a,b, 'o', label = 'original data')
plt.plot(t,f1_lin(t), '.',label = 'resampled via linear interpolation')
plt.plot(t, f1_cub(t), '1', label='resampled via cubic spline interpolation')
plt.plot(t, f1_near(t), '_', label='resampled via nearest value interpolation')

plt.legend()

Что дает мне те же результаты, что и вы.Если я сделаю то же самое для

f1_lin1 = interp1d(x, y, kind='linear')

t1=np.linspace(min(x),max(x))
plt.figure()
plt.plot(x,y, 'o', label = 'original data')
plt.plot(t1,f1_lin1(t1), '.',label = 'resampled via linear interpolation')

plt.legend()

, я получу следующий вывод: f1_lin1

Но как я смогу использовать эти функции для дальнейшего стимулирования статистической оценкизаданные значения f1_lin (t) и f1_lin1 (t1) не соответствуют совпадающим временным рамкам.

1 Ответ

0 голосов
/ 07 июня 2018

Прежде чем вы захотите рассчитать корреляцию, вы, возможно, захотите поближе познакомиться с тем, что означает интерполяция и повторная выборка.

Если вы хотите пересчитать данные, вам, очевидно, придется создать новую точки данных между вашими оригинальными образцами.Теперь, это должно быть сделано осторожно, в отношении характеристики источника данных, иначе вы будете вводить слишком большие ошибки, и ваши результаты будут отображать не свойства ваших данных, а только свойства модели, которую вы использовали для поиска интерполированных выборок.для ваших данных.

Вкратце: передискретизация требует сначала интерполяции, и интерполяция может выполняться различными способами, например, линейной, кубической сплайной или интерполяцией ближайшего значения, и это лишь некоторые из них.

Однако, какую модель лучше всего подходит для ваших данных, вам решать, так как изменение типа окажет огромное влияние на то, где будут найдены значения пересчитанных данных - посмотрите на это:

enter image description here

создан с помощью:

t = np.linspace(min(a), max(a))
plt.figure()
plt.plot(a, b, 'o', label='original data')
plt.plot(t, f1_lin(t), '.', label='resampled via linear interpolation')
plt.plot(t, f1_cub(t), '1', label='resampled via cubic spline interpolation')
plt.plot(t, f1_near(t), '_', label='resampled via nearest value interpolation')
plt.legend()

Я думаю, что линейная интерполяция самоочевидна.Интерполяция кубического сплайна вычисляет кубические сплайны между каждой последующей парой точек данных с плавным переходом от одного к другому.Ближайшее значение, ну, просто копирует ближайший исходный образец данных.
Но дело здесь в том, что различия настолько велики, что вы можете себе представить, что выбор функции интерполяции сильно повлияет на результат вашей корреляции вследующий шаг.

...