2015-09-17 11 views
6

Interpolation ist einfach in Pandas mit df.interpolate() gibt es eine Methode in Pandas, die mit der gleichen Eleganz etwas wie extrapolieren. Ich weiß, dass meine Extrapolation an ein Polynom zweiten Grades angepasst ist.Pandas Extrapolation von Polynom

+0

Sie müssen möglicherweise 'scipy.interpolate.UnivariateSpline' verwenden, die eine' ext' Option hat. – askewchan

+0

Related: [Werte in Pandas DataFrame extrapolieren] (https://stackoverflow.com/questions/22491628/extrapolate-values-in-pandas-dataframe), aber ein einfacher Fall, der durch eine andere Methode gelöst werden konnte. – askewchan

+0

Es gibt jetzt eine Antwort (http://stackoverflow.com/a/35959909/2087463) auf diese Frage mit Einzelheiten zur Polynom-Extrapolation. – tmthydvnprt

Antwort

1

"Mit der gleichen Eleganz" ist eine etwas hohe Ordnung, aber das kann getan werden. Soweit mir bekannt ist, müssen Sie die extrapolierten Werte manuell berechnen. Es ist sehr unwahrscheinlich, dass diese Werte sehr aussagekräftig sind, es sei denn, die Daten, auf denen Sie arbeiten, entsprechen tatsächlich einem Gesetz der Form des Interpolanten.

Zum Beispiel, da Sie ein Polynom zweiten Grades fit angefordert:

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

Jetzt p (t) ist der Wert des Best-Fit-Polynom zum Zeitpunkt t.

0

Extrapolation

dieses answer für Sie, wie die Werte der einzelnen Spalten eines DataFrame mit einem 3rd order polynomialextrapolate. A different order (e.g. 2nd order) polynomial kann leicht durch Änderung func() verwendet werden.

Snippet vom 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])