Специфический метод интерполяции в Pandas / Scipy - PullRequest
0 голосов
/ 03 октября 2018

сначала создайте данные:

import pandas as pd
import numpy as np
%matplotlib inline
data = pd.DataFrame({'time':np.arange(10)})
data['sin_of_the_times']= np.sin(data.time)
newdata = pd.DataFrame({'time': np.linspace(0,10,15)})
newdata['sin_of_the_times'] = np.NAN
data['interpolated']=False
newdata['interpolated']= True
ultimatedata = pd.concat([data, newdata])
ultimatedata.sort_values('time', inplace=True)

Что дает вам это:

    time    sin_of_the_times    interpolated
0   0.000000    0.000000    False
0   0.000000    NaN         True
1   0.714286    NaN         True
1   1.000000    0.841471    False
2   1.428571    NaN         True
2   2.000000    0.909297    False
...

Без создания новой функции есть ли метод интерполяции, уже существующий вПитон, который примет:

  • первый NaN и скажет, что время = 0,0 равно 0% от времени = 0, а время = 1,0, следовательно, равно 0% пути между 0 и 0,8, поэтому будет0.0.
  • 2-й NaN будет 7/10-й (ish) путь от 0 до 1, поэтому 7/10-й путь от 0 до 0,841471, так что это будет .5890297
  • третий NaN4 / 10ths (ish) будет между 1 и 2, поэтому также 4 / 10ths между 0,841471 и 0,909297

Есть ли название для этого типа метода интерполяции?(в данном случае это upsample'ing) методы интерполяции, похоже, основаны только на одном столбце.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Сборка для скорости interp от numpy

np.interp(df['time'].values,
          df.dropna()['time'].values,
          df.dropna()['sin_of_the_times'].values)
Out[783]: 
array([0.        , 0.        , 0.60105095, 0.841471  , 0.87053926,
       0.909297  ])


#df['sin_of_the_times']= np.interp(df['time'].values,
#                           df.dropna()['time'].values,
#                            df.dropna()['sin_of_the_times'].values)
0 голосов
/ 03 октября 2018

Вы все еще хотите выполнить линейную интерполяцию;Вы просто хотите указать, что расстояние между точками зависит от time вместо того, чтобы предполагать, что они равномерно распределены.Поэтому сначала установите индекс на time, затем используйте interpolate

df = df.set_index('time')
df.sin_of_the_times.interpolate(method='index')

Вывод:

time
0.000000    0.000000
0.000000    0.000000
0.714286    0.601051
1.000000    0.841471
1.428571    0.870539
2.000000    0.909297
Name: sin_of_the_times, dtype: float64

Это то, с чего я начал: df

       time  sin_of_the_times
0  0.000000          0.000000
0  0.000000               NaN
1  0.714286               NaN
1  1.000000          0.841471
2  1.428571               NaN
2  2.000000          0.909297
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...