在 Python 中检测两个数据数组的模式

2023-12-02

我正在尝试从中检测模式开盘-高位-低位-收盘 (OHLC)数据,所以这就是我所做的:

  1. 查找数据集上的局部最小值和最大值
  2. 通过将局部最小值和最大值数组转换为数字数组来标准化我的数据,其中每个数字都是与前一点的变化。

到目前为止,一切正常,但我陷入了以下部分。 我定义了一个数据数组,它是pattern,当 绘制在图表上时将具有一定的形状。我现在尝试在其他数据集上查找与我指定的模式类似的形状。

这是我指定的模式:

Pattern = [7.602339181286544, 3.5054347826086927, -5.198214754528746, 4.7078371642204315, -2.9357312880190425, 2.098092643051778, -0.5337603416066172]

这是一个示例数据集:

SampleTarget = [-2.2538552787663173, -3.00364077669902, 2.533625273694082, -2.2574740695546116, 3.027465667915112, 6.4222962738564, -2.647309991460278, 7.602339181286544, 3.5054347826086927, -5.198214754528746, 4.7078371642204315, -2.9357312880190425, 2.098092643051778, -0.5337603416066172, 4.212503353903944, -2.600411946446969, 8.511763150938416, -3.775883069427527, 1.8227848101265856, 3.6300348085529524, -1.4635316698656395, 5.527148770392016, -1.476695892939546, 12.248243559718961, -4.443980805341117, 1.9213973799126631, -9.061696658097686, 5.347467608951697, -2.8622540250447197, 2.6012891344383067]

我正在寻找一种方法来检测何时在某个点上SampleTarget,发现一系列类似于Pattern.

例如,在这种情况下,我需要以某种方式检测到有一部分SampleTarget其中值类似于Pattern,因为它与我从中提取的数据集相同Pattern.

我尝试过的:

我被建议使用numpy.correlate, python-dtw(动态时间扭曲),或stumpy但我遇到的问题是缺乏关于这个特定问题的实际例子。


这是一个技巧:

import numpy as np
pat = np.array(Pattern)
data = np.array(SampleTarget)
n = len(data)
m = len(pat)
k = data.strides[0] # typically 8 for float64

# data2d is a view to the original data,
# with data_2d[:-m, 6] == data_2d[1:1-m, 5] == ... == data_2d[6:, 0]
data_2d = np.lib.stride_tricks.as_strided(data, shape=(n-m+1, m), strides=(k, k))

# So you can check for matches on data[i, :] for all i
print(np.all(np.isclose(data_2d, pat), axis=1))

Output:

array([False, False, False, False, False, False, False,  True, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False])

您可以使用np.where or np.argwhere获取匹配的索引。您可以调整atol and rtol的参数np.isclose设置近似匹配的阈值。

澄清:如果您执行以下操作as_strided欺骗data=np.arange(30), then data2d将:

array([[ 0,  1,  2,  3,  4,  5,  6],
       [ 1,  2,  3,  4,  5,  6,  7],
       [ 2,  3,  4,  5,  6,  7,  8],
       ...
       [21, 22, 23, 24, 25, 26, 27],
       [22, 23, 24, 25, 26, 27, 28],
       [23, 24, 25, 26, 27, 28, 29]])

编辑:这是使用滑动窗口创建相同数据的视图的有效方法,而不需要额外的内存。 numpy 数组查找a[i, j]找到内存地址为start_address + a.strides[0]*i + a.strides[1]*j;通过设定步幅(8, 8),其中 8 是浮点值的大小,您可以实现滑动窗口效果。由于不同的数组元素引用相同的内存,因此最好将以此方式构造的数组视为只读。

编辑:如果您想获得比赛质量的“分数”指标,您可以这样做:

>>> np.linalg.norm(data_2d - pat, axis=1) 

array([17.5, 17.4, 13.3, 20.5, 12.9, 14.9, 19.7,  0. , 17.4, 13.8, 16.9,
       13.7, 19. , 10.3, 18.3, 15.2, 10.9, 22.3, 13. , 21.8, 15.2, 24.5,
       14.9, 20.7])
# (numbers rounded to reduce clutter)

接近于零意味着更好的匹配。这里,norm取差异向量的长度d=data-pat, i.e., sqrt(d[0]**2 + ... + d[m-1]**2).

编辑:如果您对具有相同形状但缩放到更大或更小的值的图案感兴趣,您可以执行以下操作:

# New dataset with two occurrences of the pattern: one scaled by a factor 1.1,
# one scaled 0.5 with a bit of noise added
data_mod = data*1.1
np.random.seed(1)
data_mod[16:16+m] = pat*0.5 + np.random.uniform(-0.5, 0.5, size=m)
data_2d_mod = np.lib.stride_tricks.as_strided(
    data_mod, shape=(n-m+1, m), strides=(k, k))

# pat_inv: pseudoinverse of pat vector
pat_inv = 1/(pat @ pat) * pat 

# cofs: fit coefficients, shape (n1,)
cofs = data_2d_mod @ pat_inv # fit coefficients, shape (n1,)

# sum of squared residuals, shape (n1,) - zero means perfect fit
ssqr = ((data_2d_mod - cofs.reshape(-1, 1) * pat)**2).sum(axis=1)

print(f'cofs:\n{np.around(cofs, 2)}')
print(f'ssqr:\n{np.around(ssqr, 1)}')

Result:

cofs:
[-0.38 -0.14  0.4  -0.54  0.59  0.36 -0.48  1.1  -0.33  0.12 -0.06  0.18
 -0.21  0.23  0.22 -0.33  0.52 -0.2   0.22 -0.35  0.6  -0.91  0.92  0.01]
ssqr:
[ 81.6 161.8 147.4 155.1 167.3 196.1 138.6   0.   97.8 103.5  85.9  59.3
  57.1  54.9  58.3  29.2   0.7 198.7 217.4 201.9 266.3 235.1 242.8 361.9]

你看到了cofs[7] == 1.1,这意味着该模式必须在相应的数据窗口上按因子 1.1 缩放才能获得最佳拟合。合身度非常完美,这一点你可以看到ssqr[7] == 0。它还找到了另一个,cofs[16] == 0.52(接近预期 0.5 值)和ssqr[16] == 0.7.

其他例子:cofs[21]==-0.91 and ssqr[12]==235.1。这意味着data_mod[12:19]有点类似于该模式,但相反(正负交换)。这取决于您想如何处理数据;您很可能想看看cofs0.5 到 2 范围内的值:您的搜索模式允许在数据中出现 2 倍以上或更少的情况。这应该与足够小的ssqr values.

您可以在图中看到三个潜在的匹配项:

data with pattern matches

如果你使用ssqr作为分数指标,请注意输入中的一系列零将导致cofs=0 and ssqr=0.

考虑使用np.sqrt(ssqr/m)/np.abs(cofs)作为一个指标,有两个原因。 (1) 根据相对误差进行匹配,结果为NaN零输入情况下的值。 (2)更加直观;如果该值为 0.5,则表示数据点偏离模式值约 0.5。以下是该指标的值,使用相同的示例数据:

[ 9.1  35.3  11.6  8.8   8.3  14.8   9.4   0.  11.4  33.3 55.9  16.4
 13.9  12.1  12.9  6.2   0.6  27.2  25.4 15.2  10.4  6.4   6.4 482.5]

对于比赛data_mod[21:28],差异度量为 6.4,大致对应于图中所示的差异。

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

在 Python 中检测两个数据数组的模式 的相关文章

  • 使用 Flask 从 Jinja 模板中的 settings.py 文件获取变量

    假设我有 settings py 文件 其中包含一堆常量 将来可能会更多 如何访问 Jinja 模板中的这些变量 Flask 会自动将您的应用程序的配置包含在标准上下文 http flask pocoo org docs templatin
  • 检查字符串是否以 XXXX 开头

    我想知道如何在Python中检查字符串是否以 hello 开头 在 Bash 中我通常这样做 if string hello then do something here fi 我如何在Python中实现同样的效果 aString hell
  • 如果新文件不存在则写入新文件,如果存在则追加到文件

    我有一个程序可以写入用户的highscore到一个文本文件 该文件由用户选择时命名playername 如果具有该特定用户名的文件已经存在 那么程序应该附加到该文件 以便您可以看到多个highscore 如果具有该用户名的文件不存在 例如
  • django/whitenoise 存储后端导致错误

    我在调试关闭时在 heroku 上运行 django 应用程序时遇到了 500 错误 使用 rollbar 了解发生错误的原因后 它报告了以下内容 ValueError The file media img 1 jpg could not
  • Plotly - 不同颜色的表面

    我正在尝试在 Plotly for Python 中绘制多个曲面 每个曲面具有不同的颜色 具体来说 表面显示了在相空间中不同点采取行动的预测奖励函数 由于我在每个点都有多个可能的操作 因此每个点都是不同的表面 我想对每个表面进行独特的着色
  • PySerial 和多个 Python 安装出现问题

    我的 Windows 7 计算机上有 Python 2 4 4 和 3 1 3 我想使用 PySerial 听说是内置的 所以我尝试了一下import serial在两个版本中 两者都造成了Import Error 然后我从以下位置下载了w
  • 检查对象是否是字符串列表的列表?

    是什么elegant检查对象是否是字符串列表列表的方法 没有嵌套循环 也许这里必须是构造结构化迭代的常规方法 UPD 像这样的东西 l a b c d 1 3 e 2 f def recurse iterable levels result
  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • 类型错误:无法连接“str”和“instance”对象(python urllib)

    写一个python程序 我在使用时遇到了这个错误urllib urlopen功能 Traceback most recent call last File ChurchScraper py line 58 in
  • SQLAlchemy 如何使用“完全模块限定路径”?

    我正在为一个使用 sqlalchemy 的项目做出贡献 该项目有一个 model py 文件 其中定义了所有类 例如Foobar BASE 现在 我已经创建了another模块 mymodel py 我需要扩展其中一些类 例如 在 mymo
  • Django 自定义查询集过滤器

    在 Django 中 是否有一种标准方法可以为查询集编写复杂的自定义过滤器 就像我能写的一样 MyClass objects all filter field val 我想做这样的事情 MyClass objects all filter
  • VS Code Pylance 不突出显示变量和模块

    我正在使用带有 Python 和 Pylance 扩展的 VS Code 我遇到的问题是 Pylance 扩展没有对模块和数据框等内容进行语法突出显示 我希望顶部的模块为绿色 df 变量为蓝色 我正在使用默认的深色 颜色主题 这是我的 VS
  • SQL查询中的Python列表作为参数[重复]

    这个问题在这里已经有答案了 我有一个 Python 列表 比如说 l 1 5 8 我想编写一个 SQL 查询来获取列表中所有元素的数据 例如 select name from students where id IN THE LIST l
  • Anaconda (Python) - Windows 10 上的 Cmder 集成

    我在 Windows 10 64 位上通过 Anaconda 让 Cmder 使用 Python 时遇到了一些麻烦 我让 Anaconda 工作得很好 测试过用 matplotlib 绘制一些东西 它与 Anaconda Prompt 一起
  • 如何下载和使用对象检测数据集(例如 coco 或 pascal)

    我对物体检测领域非常陌生 我想知道是否有人可以帮助我下载和使用对象检测数据集 例如 coco 或 pascal 当我下载数据集后访问他们的网站时 我觉得我不知道应该如何处理它们 我知道这个问题很愚蠢 但是开始的提示可能非常有用 谢谢 我正在
  • 将glade接口放入python中

    我在 Glade 中制作了一个 gui 我想将其放入 python 程序中 我正在调整我在网上找到的教程中的说明 以将其加载到我的林间空地文件中 http www pygtk org articles pygtk glade gui Cre
  • 纯Python库读写jpeg格式

    伙计们 我正在寻找 jpeg 写入 阅读会很好 但不是必需的 库的纯 python 实现 我只在以下位置创建了 TonyJPEG 库端口 http mail python org pipermail image sig 2004 Novem
  • 使用 PyCharm 分析 Django

    即使在开发环境中 我的应用程序也相当慢 所以我想找出是什么导致它变慢 以便我可以尝试修复它 我了解调试工具栏 根据它的报告 数据库查询和下载的源都不是问题 所以它一定是业务逻辑 但是 我无法使用 Django 服务器运行 PyCharm 分
  • Mac 上的 PythonXY?

    如何在 Mac OS X Lion 上安装 Python 我开始了 它应该能够通过 macports 但无论如何我找不到 mac ports 网站上所述的端口 pythonXY 我对 MAC 和 pythonXY 都不太了解 但在 pyth
  • pylint:忽略 rcfile 中的多个

    在我的 django 项目中 我使用的是外部编写的应用程序 但编写得很糟糕 现在我想从我的 pylint 报告中忽略这个应用程序 但是我无法让 pylint 忽略它 Pylint 已经忽略了南方的迁移 如下所示 MASTER ignore

随机推荐

  • Linux 排序命令的异常行为

    在 Linux shell 上的结果echo e arrays2 2 narrays 2 narrays3 2 sort is arrays 2 arrays2 2 arrays3 2 和结果echo e arrays2 28 narray
  • 如何为“两个”单词编写别名[重复]

    这个问题在这里已经有答案了 别名的标准用法是为扩展命令编写快捷方式 例如 alias ls ls color 我想知道是否可以在左侧添加 参数 以便以相反的方式工作 使用上面的例子 我有兴趣知道是否alias ls color ls 是可能
  • 在Android中使用aChartEngine组合两个条形图和两个折线图

    下面的代码组合了两个条形图和两个折线图 public class GraphCombination private Context context private String weekDays new String Sunday Mond
  • 在 Django 模型中设置主键起始值

    我正在准备一个模型如下 class SomeModel models Model id models BigIntegerField primary key True null False unique True 但我的主键必须是有效的 9
  • C# 已建立的连接被主机中的软件中止

    这些错误在我的游戏服务器上变得越来越频繁 它们导致服务器不断关闭并重新启动 System Net Sockets SocketException 0x80004005 An established connection was aborte
  • 对 STL 字符串使用 fread/fwrite。这是对的吗?

    我有一个包含字符串的结构 像这样的东西 struct Chunk int a string b int c 因此 我想我无法使用 fread 和 fwrite 函数从文件中写入和读取此结构 因为字符串可能保留不同的内存容量 但这样的代码可以
  • 编辑音频/重新录制文件的一部分

    我希望用户能够在应用程序中录制音频 然后能够选择文件的一部分并重新录制 例如 也许他们最初录制 现在怎么样 棕色母牛 然后选择该结尾并重新录制 皱眉母猪 这将被合并到初始文件中 该文件将是 现在怎么样 皱眉母猪 这似乎比我想象的要困难得多
  • 应用程序网关 - 502 错误

    我已经按照 MS 文档设置了一个新的应用程序网关 我已经配置了后端池 它通过 FQDN 连接到应用程序服务 不知何故 每次浏览应用程序网关时 我都会立即收到 502 直接浏览网站没有任何问题 我已经解决了这个问题 这是解决方案 如果您的后端
  • 如何从 Java 读取 Oracle 数据库中的 CLOB 列

    我在数据库中有一个表 其中列的数据类型 STATUS 是 CLOB 我需要读取该 STATUS create table STATUS TABLE STATE ID number 20 0 STATUS clob 我正在尝试阅读如下 CLO
  • 在类层次结构中混合 Java 1.4 和 1.6 字节码

    先问问题 故事如下 在类层次结构中混合不同的字节码版本是否安全 有哪些风险 对于一种情况 C类扩展B B类扩展A类 A类实现接口I 我的问题将涉及以下示例场景 A 类编译为 Java 1 6 字节码 并具有 1 6 特性 如泛型等 继承人
  • 使用 Python + Selenium 选择 iframe

    所以 我对如何在 Selenium 中做到这一点感到非常困惑 并且在任何地方都找不到答案 所以我分享我的经验 我试图选择一个 iframe 但没有运气 或者无论如何都不能重复 HTML 是
  • 使用expressjs发布到远程URL

    我的 server js 中有这个 app post leadAPI ed function request response api post code here 在此发布请求中 我需要将请求正文中包含的数据发布到具有特定 URL 的外部
  • 在 Python 3 .4 中连接字符串和 int [重复]

    这个问题在这里已经有答案了 我是 Python 新手 所以我一直在进行自己的一组练习 以简单地开始记住基本函数和语法 我正在使用PyCharmIDE 和 Python 3 4 我在进行一些基本的字符串和整数连接练习时遇到了问题 下面的每个实
  • 动态创建/绘制图像以放入 Android 视图中

    我不确定我是否以 正确 的方式这样做 所以我也对其他选择持开放态度 这就是我想要实现的目标 我想要一个包含图表的视图 该图表应该由应用程序本身动态创建 图表应该是可缩放的 并且一开始可能会比屏幕大 800x600 左右 我打算从简单的开始
  • 如何在java中读取Doc或Docx文件? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想用java读取word文件 import org apache poi poifs
  • 现代 JVM 实现中,instanceof 是如何实现的?

    由于在其他线程中完成的基准测试 参见https stackoverflow com a 397617 1408611 结果表明 Java 6 中的 instanceof 实际上相当快 这是如何实现的 我知道 对于单继承 最快的想法是进行一些
  • 在 PyQt5 中停止工作线程中的无限循环最简单的方法

    我打算有一个 GUI 其中一个 后来是三个 线程以可调间隔 例如 10 秒 从不同源读取实时数据 并在主窗口中绘制这些数据 我正在使用 PyQt5 和 python 3 6 读取是在工作线程中无限循环中执行的 如下所示 class Read
  • 在 Objective-C 中使用内联汇编对变量进行 ROL / ROR

    我想对 Objective C 程序中的变量执行 ROR 和 ROL 操作 然而 我无法做到这一点 我不是装配专家 这是我到目前为止所做的 uint8 t v1 uint8 t v2 v2 is either 1 2 3 4 or 5 as
  • 更改用户控件的动画

    我有一个简单的自定义窗口 下面的 XAML 首次加载时 它将向 grdContainer Children 集合添加一个用户控件 用户选择 操作将导致其他用户控件添加 删除到子集合中 一次加载一个 我试图做的是在加载新控件时提供一个简单的动
  • 在 Python 中检测两个数据数组的模式

    我正在尝试从中检测模式开盘 高位 低位 收盘 OHLC 数据 所以这就是我所做的 查找数据集上的局部最小值和最大值 通过将局部最小值和最大值数组转换为数字数组来标准化我的数据 其中每个数字都是与前一点的变化 到目前为止 一切正常 但我陷入了