根据条件访问熊猫的数据帧列以得出结果



我想传递我的预测模型值,这些值将根据条件从Pandas DataFrame中提取,模型的结果将放在Pandas Data Frame中。

数据帧

+------------+--------------+------------+--------------+
|    Date    | Actual Value | Prediction | Model Values |
+------------+--------------+------------+--------------+
| 02/01/2021 |         0.02 |            |              |
| 03/01/2021 |         0.06 |            |              |
| 04/01/2021 |         0.02 |            |              |
| 05/01/2021 |         0.04 |            |              |
| 06/01/2021 |         0.04 |            |              |
| 07/01/2021 |         0.08 |            |              |
| 08/01/2021 |         0.06 |            |              |
| 09/01/2021 |         0.02 |       0.03 |         0.03 |
| 10/01/2021 |         0.20 |            |              |
| 11/01/2021 |         0.02 |            |              |
| 12/01/2021 |         0.02 |            |              |
| 13/01/2021 |         0.09 |       0.06 |         0.06 |
| 14/01/2021 |         0.06 |            |              |
| 15/01/2021 |         0.04 |            |              |
| 16/01/2021 |         0.06 |            |              |
| 17/01/2021 |         0.03 |       0.04 |         0.04 |
| 18/01/2021 |         0.03 |            |              |
| 19/01/2021 |         0.06 |            |              |
| 20/01/2021 |         0.06 |            |              |
+------------+--------------+------------+--------------+

Actual Value是特定日期的实际值。Prediction是该日期的预测值。(需要填充(Model Values需要传递给模型以获得结果的值。(棘手的部分(

该模型获取过去7天的值,并给出第二天的输出。因此,能够进行预测的最小日期是9th Jan。为了对9th Jan进行预测,df['Actual Value'].iloc[:7,]将被传递给将输出numpy(1*1(数组的模型。然后将该值放置在列Prediction中。(即0.03(

我被卡住的部分

我想使用9th Jan上的预测值和过去的6个值来对10th Jan进行预测。即df['Actual Value'].iloc[1:7,:]+df['Prediction'].iloc[7,:]

我想访问这些值并将其传递给模型,模型将给出一个结果numpy(1*1(数组,该数组需要放置在Date10th Jan的列Prediction中。

既然我们有了10th Jan的值,我们就可以基于类似的逻辑使用df['Actual Value'].iloc[2:7,:]+df['Prediction'].iloc[7:9,:]来预测11th Jan。将这些值传递给模型并得到11th Jan的结果。

预测CCD_ 20应遵循类似的过程。

但对于13th Jan,我们将在最后7天使用Actual Value来获得Prediction。这部分已经完成。在第9天、第13天和第17天,每4天后总会有一个值。这样做的代码如下:

look_back = 7
look_forward = 1
n_days_pred = 4
pred = 0
predictions = []
while pred <= X_test.shape[0]:
predictions.append(model.predict(X_test[pred].reshape(1, look_back, look_forward)).flatten().tolist())
pred = pred + n_days_pred
predictions_flat = [item for sublist in predictions for item in sublist]
start_date = test_df.Date.min() + dt.timedelta(look_back)
predictions_df = pd.DataFrame(index=pd.date_range(start=start_date, periods=len(predictions), freq='4D'))
predictions_df['Prediction'] = predictions_flat
# Join predictions_df with df 
df = analysis_df.set_index('Date').join(predictions_df)

上面代码中的df与上面显示的相同。

我被困在如何访问列CCD_ 25&Prediction以获得第10、第11、第12、第14、第15、第16、第18、第19和第20的预测。

首先让我们使用日期为数据帧建立索引,而不是索引。

df = df.set_index('date')

现在计算您每4天的计算

n_days_pred = 4
look_back = 7
for model_start_date in df.index[look_back::n_days_pred]:
for predict_date in pd.date_range(model_start_date, periods=n_days_pred, freq='D'):

model_input = pd.concat([
# All actual values before model_start_date
df.loc[predict_date - pd.Timedelta(days=look_back):model_start_date - pd.Timedelta(days=1), 'actual value'],
# All predictions since model_start_date
df.loc[model_start_date:predict_date - pd.Timedelta(days=1), 'prediction'],
])
df.loc[predict_date, 'prediction'] = model.predict( .... model_input .... )

如果我用单词pred填充prediction,用单词val填充actual value,然后从该循环打印model_input,我得到的是:

2021-01-02    val
2021-01-03    val
2021-01-04    val
2021-01-05    val
2021-01-06    val
2021-01-07    val
2021-01-08    val
Freq: D, dtype: object
2021-01-03     val
2021-01-04     val
2021-01-05     val
2021-01-06     val
2021-01-07     val
2021-01-08     val
2021-01-09    pred
Freq: D, dtype: object
2021-01-04     val
2021-01-05     val
2021-01-06     val
2021-01-07     val
2021-01-08     val
2021-01-09    pred
2021-01-10    pred
Freq: D, dtype: object
2021-01-05     val
2021-01-06     val
2021-01-07     val
2021-01-08     val
2021-01-09    pred
2021-01-10    pred
2021-01-11    pred
Freq: D, dtype: object
2021-01-06    val
2021-01-07    val
2021-01-08    val
2021-01-09    val
2021-01-10    val
2021-01-11    val
2021-01-12    val
Freq: D, dtype: object
2021-01-07     val
2021-01-08     val
2021-01-09     val
2021-01-10     val
2021-01-11     val
2021-01-12     val
2021-01-13    pred
Freq: D, dtype: object
2021-01-08     val
2021-01-09     val
2021-01-10     val
2021-01-11     val
2021-01-12     val
2021-01-13    pred
2021-01-14    pred
Freq: D, dtype: object
2021-01-09     val
2021-01-10     val
2021-01-11     val
2021-01-12     val
2021-01-13    pred
2021-01-14    pred
2021-01-15    pred
Freq: D, dtype: object
2021-01-10    val
2021-01-11    val
2021-01-12    val
2021-01-13    val
2021-01-14    val
2021-01-15    val
2021-01-16    val
Freq: D, dtype: object
2021-01-11     val
2021-01-12     val
2021-01-13     val
2021-01-14     val
2021-01-15     val
2021-01-16     val
2021-01-17    pred
Freq: D, dtype: object
2021-01-12     val
2021-01-13     val
2021-01-14     val
2021-01-15     val
2021-01-16     val
2021-01-17    pred
2021-01-18    pred
Freq: D, dtype: object
2021-01-13     val
2021-01-14     val
2021-01-15     val
2021-01-16     val
2021-01-17    pred
2021-01-18    pred
2021-01-19    pred
Freq: D, dtype: object

其中df

df = pd.DataFrame({'prediction': 'pred', 'actual value': 'val'}, index=pd.date_range('2021-01-02', '2021-01-20', freq='D'))

正如您所看到的,它在0到3个最新的pred(索引中有日期(之间,然后在val之前,并且总是7个条目。我不认为你能做比循环更聪明的事情,因为你在计算下一次迭代的输入。

最新更新