多周期持久化、向量化、时间序列python

2024-04-23

我有一个包含每日值的 DataFrame,并且我正在使用各种方法来预测未来两周的值。

作为一个基础的、天真的预测,我只想简单地说今天的价值是未来两周的最佳预测,例如:

  • 的值01-Jan-2012 is 100,那么我想要预测02-Jan-2012 to 15-Jan-2022 to be 100
  • 的值02-Jan-2012 is 110,那么我想要预测03-Jan-2012 to 16-Jan-2022 to be 110
  • etc

然后可以将该方法与其他预测进行比较,看看它们是否比简单的方法更有价值。

要回测这个模型我该怎么做?我在 DataFrame 中有几年的数据,我想做如下的事情。在线阅读,我只能找到 1 天的持久性帮助,只需使用类似的东西df.shift(1)完成工作。

Pseudocode:
get the first row from the DataFrame
extract the date from the index
extract the value from the column
propogate forward this value for the next fourteen days
save these forecast dates and forecast values

get the second row from the DataFrame
extract the date from the index
extract the value from the column
propogate forward this value for the next fourteen days
save these forecast dates and forecast values

REPEAT...

但是,我读到建议不要迭代行,最好使用 pandas 之类的东西apply对数据进行“矢量化”,但我不知道如何做到这一点。我正在考虑编写一个函数来预测接下来的 14 天,然后使用apply方法来调用此函数,但不确定如何执行或这是否是最好的方法。

我还读到 numpy 对于此类问题非常有用,但我还是不太熟悉。

我已经建立了一个 sqlite 数据库,这样我就可以在其中存储预测(如果有帮助的话)。


一般原则

这是我的尝试。 我使用的函数几乎可以做到这一点:np.lib.stride_tricks.sliding_window。 除了它显示前向值外,当您想要做的是后向值时(在 t 时,您希望将 t-1 处的值视为“预测 J+1”,将 t-2 处的值视为“预测 J+2”,等等。更一般地说,您需要最后 14 个值来构建预测)。 但这很容易解决:只需在开头添加一些虚拟 NaN 即可。因此,第一行中的“预测 J+1”为 NaN (您无法使用昨天的值来预测第一行的值,因为您没有昨天的任何值)

结果与您迄今为止得到的其他两个答案之一非常相似。相同的 2D 数据框。使用不同的格式(一种是使用日期和预测作为 2 个索引)和填充(一种是用今天的值填充未知值)

但时间安排并非如此。

Code

import pandas as pd
import numpy as np
import datetime

# Data generation
N=1000
dt=datetime.timedelta(days=1)
dates=[datetime.date(2012,1,1)+k*dt for k in range(N)]
temps=np.random.normal(100,15,(N,))
df = pd.DataFrame({'time':dates, 'temp':temps})

# slideWindowMethod
def mslide():
    T=np.concatenate(([np.nan]*14, df['temp'].values))
    TwithShift=np.lib.stride_tricks.sliding_window_view(T, 15)
    return pd.concat([df, pd.DataFrame(TwithShift[:,:-1], columns=[f'Pred_J+{i}' for i in range(14,0,-1)])], axis=1)

dfWithPred=mslide()

(使用 arg less 函数只是因为它更容易使用 timeit。但是当然,df 和 14 应该是参数)

解释

主要思想在于这个sliding_window_view功能。

M=np.arange(10)
np.lib.stride_tricks.sliding_window_view(M, 4)

array([[0, 1, 2, 3],
       [1, 2, 3, 4],
       [2, 3, 4, 5],
       [3, 4, 5, 6],
       [4, 5, 6, 7],
       [5, 6, 7, 8],
       [6, 7, 8, 9]])

请注意,它在以 6 开头的行处停止,因为我们没有其他行的未来值。没问题,稍后再看。除此之外,第一列是原始数组。

它的优点之一(尽管我们在这里不利用它,因为我们将在最后构建一个数组)是它只是一个视图。这里没有建立新的阵列。所以,即使数组 M 中有 1 亿个数字,你仍然可以得到sliding_window_view(M,1000)包含 M 从 0 到 1000 的所有“移位”的数组,无需为 1000 亿个数字分配内存。 使用历史数据执行矢量化操作非常方便。

因为这里它显示未来值,而不是过去值(这就是您想要的:过去值,因为说“J+1 行的预测是今天的值”与说“今天的预测是 J-1 处的值”相同) ”,只是 J) 的含义不同,您可以在移位之前轻松地用 NaN 填充数组。

T=np.arange(10)
TwithNa=np.concatenate(([np.nan]*3, T))
np.lib.stride_tricks.sliding_window_view(TwithNa, 4)

array([[nan, nan, nan,  0.],
       [nan, nan,  0.,  1.],
       [nan,  0.,  1.,  2.],
       [ 0.,  1.,  2.,  3.],
       [ 1.,  2.,  3.,  4.],
       [ 2.,  3.,  4.,  5.],
       [ 3.,  4.,  5.,  6.],
       [ 4.,  5.,  6.,  7.],
       [ 5.,  6.,  7.,  8.],
       [ 6.,  7.,  8.,  9.]])

相同的数组,但第一列之前有 3 个 NaN。因此我们有 10 行。通过这种移位,最后一列与原始数组相同。之前的列是前一个、前一个前一个等值。

休息只是用它填充数据框的问题。

Timings

但当然,它真正的魅力在于时机。这是我的 timeit 结果与我的方法,以及您到目前为止获得的其他两种方法

Method Time μs
Naive for 1022001.3829995878
Apply/join 158593.13219989417
ffill 67126.1526333789
Sliding window 343.24235070089344

你看,这不仅仅是一个优化。它改变了游戏规则!

请注意,一般来说 apply 并不比使用简单的 for 循环访问数据帧好多少.iloc。有时甚至更慢。大多数时候都是非常令人失望的。在这种情况下,情况还不错。 ×6的时间增益,往往远小于此。然而,与您没有的 ×3000 相比,这没什么可比的。所以当你说

但是,我读到建议不要迭代行,并且它 最好使用 pandas 之类的东西来“矢量化”数据 但我不知道该怎么做。

我显然同意第一部分。但我会放apply与迭代行位于同一架子上。大多数时候都是一样的。尽量避免它总是更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多周期持久化、向量化、时间序列python 的相关文章

  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐