Python 访问熊猫&x27;s基于条件的数据帧列以导出结果

Python 访问熊猫&x27;s基于条件的数据帧列以导出结果,python,pandas,dataframe,numpy,conditional-statements,Python,Pandas,Dataframe,Numpy,Conditional Statements,我想传递我的预测模型值,这些值将根据条件从Pandas数据框中提取,模型的结果将放置在Pandas数据框中 数据帧 +------------+--------------+------------+--------------+ | Date | Actual Value | Prediction | Model Values | +------------+--------------+------------+--------------+ | 02/01/2021 |

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

数据帧

+------------+--------------+------------+--------------+
|    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 |            |              |
+------------+--------------+------------+--------------+
实际值
是特定日期的实际值。
Prediction
是该日期的预测值。(需要填充)
模型值
需要传递给模型以获得结果的值。(棘手的部分)

该模型取过去7天的值,并给出第二天的输出。因此,做出预测的最短日期是1月9日。 要对1月9日的df['Actual Value']进行预测,iloc[:7,]将被传递到将输出numpy(1*1)数组的模型。然后将该值放置在列
预测中
。(即0.03)

我被卡住的部分

我想使用1月9日的预测值和过去的6个值来预测1月10日的预测值。这意味着
df['Actual Value'].iloc[1:7,:]
+
df['Prediction'].iloc[7,:]

我想访问这些值并将其传递给模型,模型将给出一个结果numpy(1*1)数组,该数组需要在
日期
1月10日
放置在列

现在我们有了1月10日的数值
我们可以基于类似的逻辑使用
df['Actual value'].iloc[2:7,:]
+
df['prediction'].iloc[7:9,:]
。将这些值传递给模型并获得1月11日的结果

预测
1月12日
应遵循类似流程

但是对于
1月13日
,我们将在过去7天内使用
实际值
,以获得
预测
。这部分已经完成了。每4天后,在09、13和17日,总会有一个值。执行此操作的代码如下所示:

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)
look\u back=7
向前看=1
n_天_pred=4
pred=0
预测=[]

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

df=df.set\u索引(“日期”)
现在计算您每4天的计算

n_天_pred=4
回头看
对于df.index中的模型开始日期[回顾::n天之前]:
对于pd.date范围内的predict_date(模型开始日期,周期=n天,频率=D)):
模型输入=pd.concat([
#模型开始日期之前的所有实际值
df.loc[预测日期-pd.Timedelta(天=回顾):模型开始日期-pd.Timedelta(天=1),“实际值”],
#自模型开始日期起的所有预测
df.loc[模型开始日期:预测日期-pd.Timedelta(天数=1),“预测”],
])
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_范围('2021-01-02','2021-01-20',freq='D'))

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

我不确定我是否理解正确,1)你的输入来自
预测,除非它不可用,然后你使用
实际值
,2)你需要最后7天进行预测。这是对的还是我遗漏了什么?@Cimbali第2点是正确的。第1点)每4天后仅使用
实际值
,因此对于
9、13和17
而言,仅使用
实际值
进行预测(已完成且已在
df
中),以填充
第10
的预测,由于模型要求至少7个值,因此将使用第9个
预测
和第3个到第8个
的实际值。类似地,将使用
第9和第10个
第11个
预测
以及
实际值
第4到第8个
来填充预测。因此,在某个点(我猜是第9+7天,所以从第16个开始?)只会使用
预测值,正确吗?@Cimbali将使用第13、14和15日的第16次
预测
,以及第9、10、11和12日的
实际值
。我们的想法是对未来4天进行预测。所以如果我在13号,我需要预测13号,14号,15号和16号。我将使用第6-12天的
实际值来预测第13天。为了预测第14天,我将使用第7-12天的实际值和第13天的预测值。类似地,为了预测第15天,我将使用第8-12次
实际值以及第13次和第14次
预测值。@Cimbali没有任何情况下仅使用
预测值来进行第二天预测。因为预计最多只有4天。所以在第四天,你仍然会有4个实际+3个预测值(总数:7)来预测第四天。答案是正确的。但是我对第
df.loc[predict_date]=model.predict(..model_input…)
行感到困惑,我们是否应该指定列名来替换值?我认为应该是
df.loc[predict_date,'Prediction']=model.predict(…model_input…)