Как экстраполировать данные временных рядов, используя экспоненциальную функцию? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть фрейм данных с днями и значениями, как показано ниже, и я хочу экстраполировать эти данные примерно до 5000 дней вперед, используя экспоненциальную функцию, но я думаю, что я не делаю это правильно с тем, как я выполняю экстраполяцию дней, так как яЯ просто добавляю 100-дневный интервал, а он не в форме временного ряда.Должен ли я указать фактическую дату в столбце Дни и как это можно сделать?

Days    Col1    Col2
105 1.042990717 0.977126509
131 1.032115123 0.965084949
155 1.027434996 0.959954413
181 1.021729519 0.955389315
209 1.015965345 0.951295069
236 1.009429161 0.943803697
258 1.004876875 0.940235463
285 1.000358928 0.931895737
315 0.995125739 0.926641403
363 0.990417213 0.920608379
387 0.986946909 0.915730933

код, который я использовал до сих пор, выглядит следующим образом:

#add days
df = df.reindex(df.index.tolist()+list(range(387,6000,100)))

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

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

def func(x, a, b):
    return a*np.exp(-b*x)

# Curve fit each column
for col in df.columns:
    # Get x & y
    x = df.index.astype(float).values
    y = df[col].values


    if np.isnan(y).any():
        x = df[col].dropna()
        x = x.index.astype(float).values
        y = df[col].dropna()
        y = y.values

        params = curve_fit(func,x, y, init)
        # Store optimized parameters
        col_params[col] = params[0]
    else:
        # Curve fit column and get curve parameters
        params = curve_fit(func, x, y, init)
        # Store optimized parameters
        col_params[col] = params[0]
        print(col_params[col])

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

    plt.plot(x1,y,func(x, *col_params[col]),'g--')

# Display result
print ('Extrapolated data:')
print (df)

Данные экстраполируют, но я не думаю, что я делаю правильно, особенно в том, как я обращаюсь с днямистолбцы.

...