多周期持久化、向量化、时间序列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 的相关文章

  • 字符串的“相关矩阵”。名义数据的相似度

    这是我的数据框 df store 1 store 2 store 3 store 4 0 banana banana plum banana 1 orange tangerine pear orange 2 apple pear melon
  • winpdb 不适用于 python 3.3

    我无法让 rpdb2 与 python 3 3 一起运行 但根据多个来源 这应该是可能的 rpdb2 d myscript py A password should be set to secure debugger client serv
  • SQLAlchemy 闭包表关系定义

    我最近开始使用 SQL Alchemy 开展一个涉及攀岩区域和路线的项目 区域是分层的 因为单个区域可以包含多个区域 而多个区域又可以包含其他区域 路线直接与单个区域关联 但也与该区域的父区域关联 等等 为了实现这一点 我选择使用Bill
  • pandas 用 nan 值切割了一系列

    我想将 pandas cut 函数应用于包含 NaN 的序列 期望的行为是它对非 NaN 元素进行存储并为 NaN 元素返回 NaN import pandas as pd numbers with nan pd Series 3 1 2
  • Django:如何从管理界面调用管理自定义命令执行?

    参考 从代码执行管理命令 https stackoverflow com questions 907506 how can i call a custom django manage py command directly from a t
  • chrome_options.binary_location() TypeError: 'str' 对象不可调用

    我希望每个人都好 我是 python 新手 我尝试运行这段代码 但我不明白问题是什么以及如何解决这个问题 我的代码是 from selenium import webdriver from time import sleep url raw
  • 在heroku实例上安装PIL

    我创建了一个python flask托管在heroku上的应用程序 我很有趣PILpython 中的图像库 我无法安装PIL在heroku实例中 我尝试过以下几种方法 方法一 Added PIL 1 1 7 in requirements
  • Pytorch“展开”等价于 Tensorflow [重复]

    这个问题在这里已经有答案了 假设我有大小为 50 50 的灰度图像 在本例中批量大小为 2 并且我使用 Pytorch Unfold 函数 如下所示 import numpy as np from torch import nn from
  • Keras 中的 Tensorflow 自定义损失函数 - 张量循环

    我正在尝试在 Keras 中编写自定义损失函数 如下所示 Keras 中的自定义损失函数 https stackoverflow com questions 43818584 custom loss function in keras 我的
  • Pandas 无法读取使用 h5py 创建的 hdf5 文件

    当我尝试读取使用 h5py 创建的 HDF5 格式文件时 出现 pandas 错误 我想知道我是否只是做错了什么 import h5py import numpy as np import pandas as pd h5 file h5py
  • 如何开始使用“scipy”

    我之前安装过 Python 3 4 2 和 3 5 2 在这两种情况下 我都可以在 Idle 中涉足编写和测试代码 这给了我两个窗口 一个用于代码的 运行 窗口 一个用于交互和测试的 Shell 窗口 输出 抱歉 不确定术语是否正确 现在我
  • 使用多索引列对多列求和

    我有一个从数据透视表创建的数据框 看起来类似于 import pandas as pd d company1 False Negative April 2012 112 0 April 2013 370 0 April 2014 499 0
  • 在pycharm中使用多处理时如何调试

    我正在 pycharm 社区版中使用 anaconda2 调试多进程程序 它有几个后台工作进程 工作进程将检查输入队列以检索任务 而不会休眠 直到收到任务 事实上 我只对主要流程感兴趣 但是pycharm调试器总是单步进入子进程 看起来主进
  • Pytest 插件:覆盖 pytest_runtest_call 和朋友

    我正在为我的一个项目使用 pytest 开发一个测试套件 由于项目的性质 我需要创建一个 Pytest 插件来控制测试的运行方式 它们不是在本地运行 而是发送到不同的进程来运行 我知道关于xdist但我认为这并不能解决我的问题 我一直在通过
  • 单个函数的 Numpy 均值和方差?

    使用 Numpy Python 是否可以从单个函数调用返回均值 AND 方差 我知道我可以单独做它们 但是计算样本标准差需要平均值 因此 如果我使用单独的函数来获取均值和方差 则会增加不必要的开销 我尝试在这里查看 numpy 文档 htt
  • 当前异常上下文掩盖了先前的错误

    以下是我在 Doug Hellman 网站上名为 masking exceptions catch py 的文件中找到的示例 我暂时无法找到链接 throws 中引发的异常将被丢弃 而 cleanup 中引发的异常将被报告 道格在他的文章中
  • 如何按分层类别结构中的值对 pandas 中的数据框进行排序

    我有一个 pandas 数据框 pd DataFrame category Transport Transport Car Transport Train Household Household Utilities Household Ut
  • 在两列上使用 Rollapply

    我正在尝试做类似我要求的事情here https stackoverflow com questions 4472691 calculate returns over period of time不幸的是我无法解决这个问题 这是我的数据框
  • Python 装饰器只是语法糖? [复制]

    这个问题在这里已经有答案了 可能的重复 了解 Python 装饰器 https stackoverflow com questions 739654 understanding python decorators 我对使用 Python 装
  • 将 sudo 与 Python 脚本结合使用

    我正在尝试编写一个小脚本来在每次执行脚本时安装 VirtualBox 共享文件夹 我想用Python 来做这件事 因为我正在尝试学习它来编写脚本 问题是我需要特权才能启动挂载命令 我可以将脚本作为 sudo 运行 但我更喜欢它自己创建 su

随机推荐