Вы можете распаковать запись следующим образом:
def sample_df(forecast):
samples = forecast.samples
ns, h = samples.shape
dates = pd.date_range(forecast.start_date, freq=forecast.freq, periods=h)
return pd.DataFrame(samples.T, index=dates)
Это просто захват различных свойств из SampleForecast
.
Это начинается с прогноза samples
, ndarray
со строкой для выборки и столбцом для периода времени. Число столбцов дает горизонт прогнозирования h
, который со свойствами start_date
и freq
можно присвоить pd.date_range для построения прогноза dates
.
А затем samples
транспонируются, давая строку за период времени и столбец для каждой выборки. Это может быть проиндексировано с восстановленным dates
, и вы все настроены на один образец.
sample_df(test_entry)
# 0
# 2019-01-04 04:00:00 0.748107
# 2019-01-04 05:00:00 1.620660
# 2019-01-04 06:00:00 -0.648520
# 2019-01-04 07:00:00 0.277669
# 2019-01-04 08:00:00 -1.010820
# ...
Чтобы обработать все ваши результаты, вы можете запустить этот метод независимо для каждого DataFrame
и поместить все они вместе с pd.concat .
parts = [sample_df(entry).assign(entry=i)
for i, entry in enumerate(forecast_it)]
pd.concat(parts)
# 0 entry
# 2019-01-04 04:00:00 0.748107 0
# 2019-01-04 05:00:00 1.620660 0
# 2019-01-04 06:00:00 -0.648520 0
# 2019-01-04 07:00:00 0.277669 0
# 2019-01-04 08:00:00 -1.010820 0
# ... ... ...
# 2019-01-04 23:00:00 0.999718 9
# 2019-01-05 00:00:00 0.027250 9
# 2019-01-05 01:00:00 2.030961 9
# 2019-01-05 02:00:00 -1.414711 9
# 2019-01-05 03:00:00 0.737124 9
Это также помечает каждый DataFrame
знаком entry
, чтобы отметить, из какого результата прогноза он получен.
Вы также можете использовать pd.DataFrame.melt для преобразования из одного столбца для образца в длинную форму со столбцом для идентификации образца. Некоторые переименования в конце могут сделать все довольно красиво для последующего анализа.
long_form = pd.concat(parts).reset_index().melt(['index', 'entry'])
long_form.rename(columns={
'index': 'ts',
'variable': 'sample',
'value': 'forecast',
})
# ts entry sample value
# 0 2019-01-04 04:00:00 0 0 0.748107
# 1 2019-01-04 05:00:00 0 0 1.620660
# 2 2019-01-04 06:00:00 0 0 -0.648520
# 3 2019-01-04 07:00:00 0 0 0.277669
# 4 2019-01-04 08:00:00 0 0 -1.010820
# .. ... ... ... ...
# 235 2019-01-04 23:00:00 9 0 0.999718
# 236 2019-01-05 00:00:00 9 0 0.027250
# 237 2019-01-05 01:00:00 9 0 2.030961
# 238 2019-01-05 02:00:00 9 0 -1.414711
# 239 2019-01-05 03:00:00 9 0 0.737124
Примечание: Этот код должен работать для любого количества образцов, давая столбец для каждого (или строки в длинной форме). Но результаты здесь имеют только один образец. Что дает?
Я прочитал соответствующий код, и базовый класс PresentablePredictor сгенерирует только один образец, независимо от того, что вы запрашиваете у make_evaluation_predictions
. Параметр просто никогда не передается. Этот базовый класс используется для методологий не-глюонного прогнозирования, поэтому я предполагаю, что они просто ожидают, что они не будут случайными и пригодны только для генерации одного примера. Или это ошибка.