2015-07-13 3 views
4

Мне нужна помощь от вас, ребята. Я действительно хочу предсказать следующие значения переменной Y (c_start), когда X (день) представляет время. Как вы можете видеть на картинке, у меня есть значения для атрибута «c_start», и я хотел бы предсказать следующие значения «c_start» в течение следующих 7 дней (например). Может кто-нибудь мне помочь?Прогнозирование временными рядами в python

Thx guys! My dataframe

Plot

+0

Пожалуйста, разместите исходные данные, скопируйте свои усилия и желаемый результат, а не изображение. – EdChum

+0

Вы можете видеть исходные входные данные в первом файле – issouluch

+0

@issouluch необходим необработанный файл данных csv. Вы можете загрузить его либо с помощью sharebox или google-драйвера Dropbox. –

ответ

9

Для изучения модели ARMA в образце группы:

import pandas as pd 
from pandas.tseries.offsets import * 
import numpy as np 
import matplotlib.pyplot as plt 
import statsmodels.api as sm 

csv_file = '/home/Jian/Downloads/analyse vtr.csv' 
df = pd.read_csv(csv_file, index_col=[0], sep='\t') 
grouped = df.groupby('adserver_id') 
group = list(grouped)[0][1] 

ts_data = pd.TimeSeries(group.c_start.values, index=pd.to_datetime(group.day)) 
# positive-valued process, looks non-stationary 
# simple way is to do a log transform 
fig, axes = plt.subplots(figsize=(10,8), nrows=3) 
ts_data.plot(ax=axes[0]) 

ts_log_data = np.log(ts_data) 
ts_log_data.plot(ax=axes[1], style='b-', label='actual') 

# in-sample fit 
# =================================== 
model = sm.tsa.ARMA(ts_log_data, order=(1,1)).fit() 
print(model.params) 

y_pred = model.predict(ts_log_data.index[0].isoformat(), ts_log_data.index[-1].isoformat()) 
y_pred.plot(ax=axes[1], style='r--', label='in-sample fit') 

y_resid = model.resid 
y_resid.plot(ax=axes[2]) 

# out-sample predict 
# =================================== 
start_date = ts_log_data.index[-1] + Day(1) 
end_date = ts_log_data.index[-1] + Day(7) 

y_forecast = model.predict(start_date.isoformat(), end_date.isoformat()) 

print(y_forecast) 


2015-07-11 7.5526 
2015-07-12 7.4584 
2015-07-13 7.3830 
2015-07-14 7.3224 
2015-07-15 7.2739 
2015-07-16 7.2349 
2015-07-17 7.2037 
Freq: D, dtype: float64 


# NOTE: this step introduces bias, it is used here just for simplicity 
# E[exp(x)] != exp[E[x]] 
print(np.exp(y_forecast)) 

2015-07-11 1905.6328 
2015-07-12 1734.4442 
2015-07-13 1608.3362 
2015-07-14 1513.8595 
2015-07-15 1442.1183 
2015-07-16 1387.0486 
2015-07-17 1344.4080 
Freq: D, dtype: float64 

enter image description here

Для запуска модели ARMA для каждой подгруппы (на самом деле времени):

import pandas as pd 
from pandas.tseries.offsets import * 
import numpy as np 
import matplotlib.pyplot as plt 
import statsmodels.api as sm 

csv_file = '/home/Jian/Downloads/analyse vtr.csv' 
df = pd.read_csv(csv_file, index_col=[0], sep='\t') 
grouped = df.groupby('adserver_id') 


def forecast_func(group): 
    ts_log_data = np.log(pd.TimeSeries(group.c_start.values, index=pd.to_datetime(group.day))) 
    # for some group, it raise convergence issue 
    try: 
     model = sm.tsa.ARMA(ts_log_data, order=(1,1)).fit() 
     start_date = ts_log_data.index[-1] + Day(1) 
     end_date = ts_log_data.index[-1] + Day(7) 
     y_forecast = model.predict(start_date.isoformat(), end_date.isoformat()) 
     return pd.Series(np.exp(y_forecast).values, np.arange(1, 8)) 
    except Exception: 
     pass 


result = df.groupby('adserver_id').apply(forecast_func) 

Альтернативные модели: для быстрого вычисления рассмотрим экспоненциальное сглаживание; Кроме того, я вижу, что данные выглядят как положительно оцененный процесс с изменяющимся во времени распределением Possion, могут рассматривать модель состояния пространства с использованием модуля pymc.

+0

Большое спасибо за вашу помощь @JianxunLi. Кажется, что он работает очень хорошо. Хорошего дня :) – issouluch

+0

@issouluch Приветствуем вас. Рад, что это помогло. –

+0

Конечно, это помогло! Знаете ли вы, что «порядок» (sm.tsa.ARMA (ts_log_data, order = (1,1))) означает в этом методе ARMA и как я могу его изменить, чтобы иметь другие результаты? – issouluch