Pandas интерполяция с использованием пользовательской функции - PullRequest
1 голос
/ 04 мая 2020

У меня есть фрейм данных (df), и я хочу интерполировать / уменьшать данные ежедневно по группам. Я знаю, как это сделать, используя pandas с 'интерполяцией', но тип интерполяции ограничен scipy.interpolate.interp1d , но я хочу использовать сглаживатель Уиттекера. Есть ли способ получить что-то подобное, чтобы я мог

df.groupby(['ID']).apply(lambda x: x.resample('1D').first().interpolate(method = my-custom-function-Whittaker_smoother))



df= pd.DataFrame({"ID":[1, 2 , 3 , 4, 1, 2 , 3 , 4, 1, 2 , 3 , 4], 
                        "date":['2015-04-09', '2015-04-09', '2015-04-09', '2015-04-09', '2015-06-03', '2015-06-03', '2015-06-03', '2015-06-03', '2015-06-08', '2015-06-08', '2015-06-08', '2015-06-08'], 
                        "V_1n":[0.2, 0.5, 0.8, 0.4, 0.9, 0.5, 3.0, 5.0, 0.0, 5.0, 0.0, 0.4]})
df['date'] = pd.to_datetime(df['date'], format="%Y-%m-%d") 
df.set_index('date', inplace= True)
df_interpolation = df.groupby(['ID']).apply(lambda x: x.resample('1D').first().interpolate())

У меня есть готовая функция:

import scipy as sp
import scipy.sparse
import scipy.linalg
from scipy.sparse.linalg import cg

def Whittaker_smoother(y, lmda):
  m = len(y)
  E = sp.sparse.identity(m)
  d1 = -1 * np.ones((m),dtype='d')
  d2 = 3 * np.ones((m),dtype='d')
  d3 = -3 * np.ones((m),dtype='d')
  d4 = np.ones((m),dtype='d')
  D = sp.sparse.diags([d1,d2,d3,d4],[0,1,2,3], shape=(m-3, m), format="csr")
  z = sp.sparse.linalg.cg(E + lmda * (D.transpose()).dot(D), y)

  return z[0]

взято отсюда: https://gist.github.com/zmeri/3c43d3b98a00c02f81c2ab1aaacc3a49

...