首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于条件访问Panda的DataFrame列以获得结果

基于条件访问Panda的DataFrame列以获得结果
EN

Stack Overflow用户
提问于 2021-06-09 06:26:17
回答 1查看 83关注 0票数 0

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

DataFrame

代码语言:javascript
复制
+------------+--------------+------------+--------------+
|    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)数组,该数组需要放置在Date 10th Jan上的列10th Jan中。

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

在预测12th Jan时也要遵循类似的过程。

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

代码语言:javascript
复制
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与上面所示的相同。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-09 07:31:19

首先,让我们使用日期来索引数据,而不是索引。

代码语言:javascript
复制
df = df.set_index('date')

现在每4天计算一次。

代码语言:javascript
复制
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填充pred,用单词val填充actual value,然后从该循环中打印model_input,下面是我得到的信息:

代码语言:javascript
复制
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在哪里

代码语言:javascript
复制
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个条目。我不认为你能做比循环更聪明的事情,因为你是在计算下一个迭代的输入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67898669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档