如何添加带有预测的新列?

Posted

技术标签:

【中文标题】如何添加带有预测的新列?【英文标题】:How can I add a new column with forecasts? 【发布时间】:2020-03-17 08:41:51 【问题描述】:

我正在尝试使用 ARIMA-Model 进行预测。我的问题是,如何使用未来的新日期(基于未来的步骤)创建一个包含我的预测值的新列。这是我的代码:

import numpy as np
import pandas as pd
from pandas import datetime
import matplotlib.pylab as plt
%matplotlib inline
df = pd.read_csv("Desktop/Daten/probe.csv",sep=";")
df["Monthes"] = pd.to_datetime(dataset["Monthes"], infer_datetime_format=True)
indexedDf = df.set_index(["Monthes"])
from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(indexedDf, order =(1,1,2))
results_ARIMA = model.fit(disp=0)
n = 120 # 1 year Forecasting
result = results_ARIMA.forecast(steps=n)[0]

如何使用新的“n”个月将预测结果放入新标签中? ..

【问题讨论】:

你能显示数据框吗?你有预测的日期吗?您可以使用pd.date_range() 创建日期范围,将预测和生成的新日期连接起来,然后附加到原始数据框。 数据框如下所示: Monthes Sales 2017-01-01 01:15:00 4.615121 2017-02-01 02:30:00 4.499810 2017-03-01 15:30:00 3.583519 2017-04-01 01:15:00 4.553877 ...... ...... ........ 我已经得到了基于步骤数的预测结果,我想附加对合适日期的预测.. 感谢您的回复 它适用于这句话: t = pd.date_range(start=(df.Monthes[len(dataset)-1]) , period=n) 但如何将 t 和结果附加在一起?谢谢 使用 pd.concat() 组合它们,并确保两者的长度相同。 我已经添加了答案 【参考方案1】:

假设您想将此列添加到数据框 (df),您需要执行以下操作。

df['result`] = result

如果您想将此结果写入 Excel 电子表格,并将工作表重命名为结果日期,

N = [30, 60, 90, 120]
with pd.ExcelWriter('output.xlsx') as writer:
    # if you want to write multiple forecasts to 
    # the same file, but in different spreadsheets
    for n in N: 
        result = results_ARIMA.forecast(steps=n)[0]
        df['result'] = result
        df.to_excel(writer, sheet_name='Sheet_n='.format(n))

如果您想用明天的日期 (2019-11-22) 命名工作表,则只需更改 sheet_name='2019-11-22'

如何获取明天的日期?

import datetime
def tomorrow():
    return datetime.date.today() + datetime.timedelta(days=1)
print(tomorrow())

日期转字符串:

dates.apply(lambda x: x.strftime('%Y-%m-%d'))

我建议您查看the documentation 以更清楚地了解pandas.ExcelWriter

【讨论】:

“新标签页”是什么意思?您是否尝试将此结果写入 Excel 电子表格? 嗨@CyperherX。是的,我想写结果,但要使用合适的日期。例如,我想预测明天,所以结果必须是明天的日期。希望你能理解我的问题并感谢你的回复 @AhmedMadiouni 让我知道这是否是您要找的。​​span> 非常感谢!!我使用以下方法创建了一个新日期:t = pd.date_range(start=(df.Monthes[len(df)-1]) , period=n)。您知道如何将此日期与结果结合起来吗?获取包含日期和预测的数组? @AhmedMadiouni 请更新问题以反映这些详细信息。我已经包含了将日期转换为字符串所需的操作。但是,让我们在这里限制问题。如果您还有其他需要了解的内容来解决您的总体要求,请打开一个新问题/搜索一个已经回答了您的问题的问题。【参考方案2】:

你可以这样做:

假设您的数据框如下所示:

         date  spend
0  2019-11-10    800
1  2019-11-11    800
2  2019-11-12    300
3  2019-11-13    150
4  2019-11-14    300
5  2019-11-15    500
6  2019-11-16    800
7  2019-11-17    600
8  2019-11-18    400
n = 5
t = pd.date_range(start=(df.date[len(df)-1]) , periods=n)
# assume predictions
predictions = np.random.rand(5) * 1000
# array([619.34810384, 600.78387725, 242.4680893 , 920.58391429, 489.36016082])
new_df = pd.DataFrame([[x, y] for x,y in zip(t, predictions)], columns=["date", "spend"])
print(new_df)
        date      spend
0 2019-11-19  94.944353
1 2019-11-20  64.813264
2 2019-11-21  56.319640
3 2019-11-22  81.696114
4 2019-11-23  43.533978

现在你终于可以将它连接/附加到你的数据框了:

df = pd.concat([df, new_df]).reset_index(drop=True)

输出

         date  spend
0  2019-11-10    800
1  2019-11-11    800
2  2019-11-12    300
3  2019-11-13    150
4  2019-11-14    300
5  2019-11-15    500
6  2019-11-16    800
7  2019-11-17    600
8  2019-11-18    400
9  2019-11-19    94.944353
10 2019-11-20    64.813264
11 2019-11-21    56.319640
12 2019-11-22    81.696114
13 2019-11-23    43.533978

【讨论】:

以上是关于如何添加带有预测的新列?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用awk将带有标题的新列添加到csv

在 pyspark 中添加带有压缩列表的新列作为常量值

在 IMPALA/HIVE 中添加带有 SELECT 的新列后,旧表数据变为 NULL

如何在数据库中存在的自定义列之后添加新列[重复]

在配置单元中添加具有恒定值的新列

如何将 SELECT 的结果添加为现有表中的新列?