У меня есть фрейм данных (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