python - 根据条件访问 Panda 的 DataFrame 列以得出结果
问题描述
我想传递我的预测模型值,这些值将根据条件从 Pandas DataFrame 中提取,并且模型的结果将放置在 Pandas DataFrame 中。
数据框
+------------+--------------+------------+--------------+
| 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) 数组。然后将该值放在 column 中Prediction
。(即 0.03)
我被卡住的部分
我想使用预测值9th Jan
和过去 6 个值来预测10th Jan
. 这意味着df['Actual Value'].iloc[1:7,:]
+ df['Prediction'].iloc[7,:]
。
我想访问这些值并将其传递给模型,这将给出一个需要放置在列中的结果 numpy (1*1)Prediction
数组Date
10th Jan
。
现在我们有了价值,我们可以根据类似的逻辑使用+10th Jan
进行预测。将这些值传递给模型并获得.11th Jan
df['Actual Value'].iloc[2:7,:]
df['Prediction'].iloc[7:9,:]
11th Jan
预测要遵循类似的过程12th Jan
。
但是因为13th Jan
我们将使用Actual Value
最后 7 天来获得Prediction
. 这部分已经完成。每 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)
df
上面的代码与上面显示的相同。
我被困在如何访问列中的值Actual Value
并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 .... )
如果我prediction
只填充单词pred
并且actual value
只填充单词val
然后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 个条目。我认为你不能比循环更聪明,因为你正在计算下一次迭代的输入。
推荐阅读
- linux - 使用 bash 脚本查找 linux 用户
- ios - (iOS) Obj-c .cer 从字符串存储到 SecCertificateRef
- javascript - 在 Datadog 中,是否有一个 JavaScript 库可以让您获取现有的度量数据?
- javascript - Mongoose group by(发送到客户端后无法设置标头)
- node.js - 无法读取未定义 express js 的属性“已安装”
- git - git push 到远程分支 bitbucket 管道
- python - 使用来自单独的部分 MultiIndex 的条目从 pandas DataFrame 中选择行的子集
- python - 如何检查列是否有数字(包括科学数字),如果有则保留,否则将其设为空白 - Python Pandas
- flutter - 我怎样才能为这个登录屏幕制作脚手架?
- css - 如何设置 div 的样式以获取它包含的最长行的宽度?