Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAX方法:将时间序列切割成子序列,然后计算距离(Python)_Python_Time Series_Outliers_Anomaly Detection - Fatal编程技术网

SAX方法:将时间序列切割成子序列,然后计算距离(Python)

SAX方法:将时间序列切割成子序列,然后计算距离(Python),python,time-series,outliers,anomaly-detection,Python,Time Series,Outliers,Anomaly Detection,我正在尝试应用SAX(符号聚合近似)方法来检测我的时间序列数据上的异常值。基本上,我需要将整个序列切割成等长的子序列,然后计算它们之间的距离。然后,top-K子系列被标记为异常 尝试了几个软件包: pyts-首先不确定如何剪切该系列 是相关的-python中有更好的解决方案吗 tslearn.metrics.dtw\u path\u from\u metric-看起来它在计算两个系列之间的距离,但我缺少了第一个“切割”部分 此外,我还在想矩阵是否可行(每个子系列都是行和列,然后在诊断中列出距离

我正在尝试应用SAX(符号聚合近似)方法来检测我的时间序列数据上的异常值。基本上,我需要将整个序列切割成等长的子序列,然后计算它们之间的距离。然后,top-K子系列被标记为异常

尝试了几个软件包:

  • pyts
    -首先不确定如何剪切该系列
  • 是相关的-python中有更好的解决方案吗
  • tslearn.metrics.dtw\u path\u from\u metric
    -看起来它在计算两个系列之间的距离,但我缺少了第一个“切割”部分
  • 此外,我还在想矩阵是否可行(每个子系列都是行和列,然后在诊断中列出距离)
结果是1)每周减少系列;2) 计算各子系列之间的距离;3) 用前k名最长距离的进行排列。我知道这可能有很多问题要问,但任何建议都将不胜感激

import datetime
import pandas as pd
import bumpy as np

rng = np.random.RandomState(0)
base = datetime.datetime.today()
dates = pd.date_range(start='1/1/2020', end='6/1/2020', freq='D')
df = pd.DataFrame(dates, columns=['date'])
df['sales'] = np.random.randint(0, 100, size=(len(dates)))
答案1)按周削减该系列

虽然您可能只需要使用
df.groupby(pd.Grouper(key='date',freq='W'))就可以了。
也许更有用的方法是使用week\u number和week\u date属性填充到dataframe

week = 1
weekly_data = []
week_data = []
for data in df.groupby(pd.Grouper(key='date', freq='W')):
    week_date = data[0]
    week_dates = list(data[1]['date'])
    week_sales = list(data[1]['sales'])
    week_data_list = list(zip(week_dates, week_sales))
    for i in week_data_list:
        week_data.append([week, week_date, i[0], i[1]])
    weekly_data.append(week_data)
    week += 1
df = pd.DataFrame(week_data, columns=['week_number', 'week_date', 'date', 'sales'])
df
这将生成以下形状的数据帧:

    week_number week_date   date    sales
0   1   2020-01-05  2020-01-01  57
1   1   2020-01-05  2020-01-02  64
2   1   2020-01-05  2020-01-03  51
3   1   2020-01-05  2020-01-04  77
4   1   2020-01-05  2020-01-05  69
... ... ... ... ...
148 22  2020-05-31  2020-05-28  34
149 22  2020-05-31  2020-05-29  51
150 22  2020-05-31  2020-05-30  66
151 22  2020-05-31  2020-05-31  77
152 23  2020-06-07  2020-06-01  31
153 rows × 4 columns
您可以简单地选择或迭代所需的维度,例如:

df.loc[weeks_df['week_number'] == 1]

    week_number week_date   date    sales
0   1   2020-01-05  2020-01-01  57
1   1   2020-01-05  2020-01-02  64
2   1   2020-01-05  2020-01-03  51
3   1   2020-01-05  2020-01-04  77
4   1   2020-01-05  2020-01-05  69
请注意,这不会为您提供每周长度相等的子系列,因为您的数据示例不允许这样做,第一周只有5个值,第23周只有1个值

祝你2)和3)好运