2015-09-17 13 views
6

Interpolacja jest łatwa w pandach za pomocą df.interpolate() czy istnieje metoda w pandach, które z tą samą elegancją robią coś w stylu ekstrapolacji. Wiem, że moja ekstrapolacja jest dopasowana do wielomianu drugiego stopnia.ekstrapolacja pand z wielomianu

+0

Być może trzeba będzie użyć 'scipy.interpolate.UnivariateSpline' który posiada opcję' ext'. – askewchan

+0

Powiązane: [Wartości Extrapolate w Pandas DataFrame] (https://stakuprocessflow.com/questions/22491628/extrapolate-values-in-pandas-dataframe), ale prostszy przypadek, który mógł zostać rozwiązany inną metodą. – askewchan

+0

Istnieje teraz odpowiedź na to pytanie (http://stackoverflow.com/a/35959909/2087463) ze szczegółowymi informacjami na temat wielomianowej ekstrapolacji. – tmthydvnprt

Odpowiedz

1

"Z tą samą elegancją" jest dość wysokim zamówieniem, ale można to zrobić. O ile mi wiadomo, musisz wyliczyć ekstrapolowane wartości ręcznie. Zauważ, że jest bardzo mało prawdopodobne, że wartości te będą bardzo znaczące, chyba że dane, na których pracujesz, faktycznie są zgodne z prawem formy interpolantu.

Na przykład, ponieważ poprosił o drugi stopień wielomianu dopasowanie:

import numpy as np 
t = df["time"] 
dat = df["data"] 
p = np.poly1d(np.polyfit(t,data,2)) 

Teraz p (t) jest wartością najlepszego dopasowania wielomianu w czasie t.

0

Ekstrapolacja

Zobacz ten answer dla jak extrapolate wartości każdej kolumnie DataFrame z 3rd order polynomial. A different order (e.g. 2nd order) polynomial może być łatwo użyty przez zmianę func().

Fragment z answer

# Function to curve fit to the data 
def func(x, a, b, c, d): 
    return a * (x ** 3) + b * (x ** 2) + c * x + d 

# Initial parameter guess, just to kick off the optimization 
guess = (0.5, 0.5, 0.5, 0.5) 

# Create copy of data to remove NaNs for curve fitting 
fit_df = df.dropna() 

# Place to store function parameters for each column 
col_params = {} 

# Curve fit each column 
for col in fit_df.columns: 
    # Get x & y 
    x = fit_df.index.astype(float).values 
    y = fit_df[col].values 
    # Curve fit column and get curve parameters 
    params = curve_fit(func, x, y, guess) 
    # Store optimized parameters 
    col_params[col] = params[0] 

# Extrapolate each column 
for col in df.columns: 
    # Get the index values for NaNs in the column 
    x = df[pd.isnull(df[col])].index.astype(float).values 
    # Extrapolate those points with the fitted function 
    df[col][x] = func(x, *col_params[col])