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