介绍

在数据相关的职业生涯中遇到最痛苦的事情之一就是必须处理不同步的时间序列数据集。差异可能是由许多原因造成的——日光节约调整、不准确的SCADA信号和损坏的数据等等。在相同的数据集中,在不同的点上发现几个差异是很常见的,这需要分别识别和纠正每一个差异。而且当使用它时,可能会无意中抵消另一个同步部分。幸运的是,在新的“动态时间规整”技术的帮助下,我们能够对所有的非同步数据集应用一种适用于所有解决方案。

动态时间规整

简称DTW是一种计算两个数据序列之间的最佳匹配的技术。 换句话说,如果你正在寻找在任何给定时间从一个数据集到另一个数据集的最短路径。 这种方法的美妙之处在于它允许你根据需要对数据集应用尽可能多的校正,以确保每个点都尽可能同步。,甚至可以将其应用于不同长度的数据集。 DTW 的应用是无穷无尽的,可以将它用于时间和非时间数据,例如财务指标、股票市场指数、计算音频等。 唯一的警告是确保数据没有空值或缺失值,因为这可能会给 DTW 的工作带来麻烦。

用于寻找对应点之间最短路径的距离度量可以是 Scipy 的距离度量模块提供的任何度量。 虽然在大多数情况下,欧几里得距离可以解决问题,但是你可能希望与其他距离进行试验以获得良好的度量。

实现

为了实现我们自己的 DTW 版本,我们将使用 Python 中的 fastdtw 库。 这个包的新颖之处在于它简化了扭曲函数的复杂性,从而将复杂性从 O(n²) 降低到 O(n),这在运行时提供了明显的差异。

请继续启动 Anaconda 或您选择的任何 Python IDE 并安装 fastdtw,如下所示:

pip install fastdtw

随后,导入所有必需的包:

import numpy as np
import pandas as pd
import streamlit as st
import plotly.express as px
from sklearn.metrics import r2_score

在运行同步之前导入数据集并填写任何空值:

df = pd.read_csv('dataset.csv')
df['Power'] = pd.to_numeric(df['Power'],errors='coerce')
df['Voltage'] = pd.to_numeric(df['Voltage'],errors='coerce')
x = np.array(df['Power'].fillna(0))
y = np.array(df['Voltage'].fillna(0))

然后继续执行同步:

distance, path = fastdtw(x, y, dist=euclidean)

同步路径的结果将类似于以下内容:

path = [(0, 0), (0, 1), (0, 2), (1, 3), (2, 4),...]

参考数据集中的每个点都将与目标数据集中的一个或多个点进行匹配,即参考数据的第 0 行可以与目标数据的点 0、1 或 2 匹配。

现在有了扭曲的路径,可以继续创建具有同步结果的数据框,如下所示:

result = []
for i in range(0,len(path)):result.append([df['DateTime'].iloc[path[i][0]],df['Power'].iloc[path[i][0]],df['Voltage'].iloc[path[i][1]]])
df_sync = pd.DataFrame(data=result,columns=['DateTime','Power','Voltage']).dropna()
df_sync = df_sync.drop_duplicates(subset=['DateTime'])
df_sync = df_sync.sort_values(by='DateTime')
df_sync = df_sync.reset_index(drop=True)
df_sync.to_csv('C:/Users/.../synchronized_dataset.csv',index=False)

最后,您可以使用 Sklearn 的 r2_score 模块计算相关性分数,以比较同步前后的相关性或同步水平:

correlation = r2_score(df['Power'],df['Voltage'])

数据可视化

为了绘制和可视化您的同步数据,我们将使用 Plotly 和 Streamlit——我最喜欢的两个用于可视化数据并将其呈现为应用程序的库。

可以使用下面的函数来创建时间序列图表。 请确保时间戳采用正确的 dd-mm-yyyy hh:mm 格式,或者修改函数以适应你的数据。

def chart(df):df_columns = list(df)df['DateTime'] = pd.to_datetime(df['DateTime'],format='%d-%m-%y %H:%M')df['DateTime'] = df['DateTime'].dt.strftime(' %H:%M on %B %-d, %Y')df = df.sort_values(by='DateTime')fig = px.line(df, x="DateTime", y=df_columns,labels={"DateTime": "DateTime","value": "Value","variable": "Variables"},hover_data={"DateTime": "|%d-%m-%Y %H:%M"})fig.update_layout(font_family="IBM Plex Sans",font_color="black")fig.update_xaxes(rangeselector=dict(buttons=list([dict(count=12, label="12h", step="hour", stepmode="backward"),dict(count=1, label="1d", step="day", stepmode="backward"),dict(count=7, label="7d", step="day", stepmode="backward"),dict(step="all")])))st.write(fig)

要可视化和呈现图表,请通过在 Anaconda 提示符下键入以下命令来运行您的脚本:

cd C:/Users/.../local_directory
streamlit run synchronization.py

可以在同步之前和之后对数据进行可视化:

总结

动态时间规整可能是快速方便地同步时间序列数据的最有效的解决方案。 虽然它不是完美无缺的,确实存在边界条件匹配性差等缺点,但它是我接触过的最全面的解决方案。 并且它绝不限于线性数据,并且确实可以同步具有不同维度的非线性数据。

作者:M Khorasani

使用动态时间规整来同步时间序列数据相关推荐

  1. GEE:DTW(Dynamic Time Warping)动态时间规整,Sentinel-2 时间序列分类

    时间动态规整算法(Dynamic Time Warping,DTW)是一种常用到的时间序列分析方法,常用于时间序列分类.模式发现. 卫星影像时间序列分类的动态时间规整介绍:https://medium ...

  2. 动态时间规整_动态时间规整下时间序列子序列的搜索与挖掘

    一.DTW的背景 对于时间序列数据挖掘算法的相似性搜索来说最大的瓶颈就是所花费的时间,所以大多数关于时间序列数据挖掘的学术研究都在考虑数百万个时间序列对象时停滞不前,而许多工业和科学都在数十亿个等待探 ...

  3. ## 论文学习—用一个可接受的的剪枝策略来加速动态时间规整聚类的算法

    论文学习-用一个可接受的的剪枝策略来加速动态时间规整聚类的算法 "Accelerating Dynamic Time Warping Clustering with a Novel Admi ...

  4. 【时序】动态时间规整(DTW)算法原理及Python实现

    DTW 简介 DTW 定义 动态时间规整(Dynamic Time Warping,DTW)用于比较具有不同长度的两个阵列或时间序列之间的相似性或距离. 假设要计算两个等长数组的距离: a = [1, ...

  5. 语音信号处理之(一)动态时间规整(DTW)

    语音信号处理之(一)动态时间规整(DTW) zouxy09@qq.com http://blog.csdn.net/zouxy09 这学期有<语音信号处理>这门课,快考试了,所以也要了解了 ...

  6. 基于动态时间规整算法(DTW)的语音识别技术研究-含Matlab代码

    ⭕⭕ 目 录 ⭕⭕ ⏩ 一.引言 ⏩ 二.动态时间规整算法基本原理 ⏩ 三.语音识别实例分析 ⏩ 四.参考文献 ⏩ 五.Matlab代码获取 ⏩ 一.引言 在语音识别技术的发展过程中,动态时间规整算法 ...

  7. Python实现基于动态时间规整的股市交易策略测试

    Python实现基于动态时间规整的股市交易策略测试 一.策略简介 二.策略原理 三.代码实现 四.测试策略 五.完整代码 一.策略简介 该项目采用Python语言,利用动态时间规整算法对沪深300市场 ...

  8. 动态时间规整算法: 从DTW到FastDTW

    目录 动态时间规整算法: 从DTW到FastDTW 总结: 简介[^1] DTW[^1] FastDTW:使用多级粗化的方法[^1] 结果 动态时间规整算法: 从DTW到FastDTW 总结: Fas ...

  9. 动态时间规整算法——DTW

    没有做过机器学习的小伙伴们对这个算法应该不是特别的了解,因为机器学习经常会用到这个算法.再将这个算法之前,我们先看一下初中的知识点. 欧几里得距离 在讲解动态时间规整算法(Dynamic Time W ...

  10. 语音识别基础算法——动态时间规整算法

    本文首发于:算法社区 dspstack.com,转发请注明出处. 前言# 动态时间规整算法,Dynamic Time Wraping,缩写为DTW,是语音识别领域的一个基础算法. 算法的提出# DTW ...

最新文章

  1. 拯救顽疾大作战!IDC绘中国医疗AI生态图谱,英伟达献医疗影像新杀器
  2. python多线程gil_Python 多线程、多进程 (一)之 源码执行流程、GIL
  3. 培训补坑(day1:最短路two-sat)
  4. DataTable添加行的方法
  5. 你知道技术委员会吗?嗯,一个既重要却又鸡肋的神秘组织
  6. (24)Verilog HDL条件语句:case语句
  7. 【JUC】第一章 JUC概述、Lock 接口
  8. JAVA_MyEclipse常见配置NETGEAR路由器如何设置
  9. [Postman使用]请求与响应
  10. datatable中某一列最小值_操作dom获取datatable中的某一行的某一列的数据
  11. Ubuntu 16.04的k8s安装配置
  12. 1,python基础入门
  13. 数据分析03-(数值型描述统计及项目分析)
  14. 高通芯片联机读取修改串码 meid ESN wifi 蓝牙 sn等参数的操作解析{二}
  15. java+生成drl文件_java-如何在运行时使drools drl文件访问更新的jar
  16. python 正则表达式匹配
  17. MAC 配置php多版本 遇到的问题
  18. React深入学习与源码解析笔记
  19. 适应iphone5 屏幕拉长的办法
  20. 2020-09-14 作业的补充

热门文章

  1. android音频切换到蓝牙耳机,在Android上将音频路由到蓝牙耳机(非A2DP)
  2. win10配置JDK环境变量
  3. Money is not everthing
  4. 安卓开发环境使用 Lombok
  5. 【NetFlow】NetFlow V9协议详细分析
  6. qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in问题
  7. kali linux下的嗅探工具介绍
  8. FreeSwitch笔记
  9. 隐马尔科夫链HMM详解
  10. Python 库学习 —— Excel存储(xlwt、xlrd)