判断时序数据的周期性

思路:

- 取最近两个周期的数据分别做z-score标准化,然后对结果做差,最后在对结果求标准差。

- 比较标准差和1,小于1则是周期性数据。

原始数据

假设周期性是1天,有一条曲线,包含最近两天的时序数据。

import numpy as np
import pandas as pd
import matplotlib.ticker as mticker
from matplotlib import pyplot as plt

from datetime import datetime
def ts2date(ts):
        ts = int(ts)
        date_str = datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
        return date_str

# 原始数据 series
now = series[-1][0]
lst1 = [ item[1] for item in series if item[0]>now-86400*2 and item[0]<=now-86400 ]
lst2 = [ item[1] for item in series if item[0]>now-86400 ]
plt.figure(figsize=(16,6))
plt.title('raw timeseries')
plt.plot(x,lst1,label='yesterday')
plt.plot(x,lst2,label='today')
plt.grid(True, which='major', c='gray', ls='-', lw=1, alpha=0.2)
plt.legend()
# plt.gca().yaxis.set_major_formatter(mticker.FormatStrFormatter('%.2f mbps'))
plt.show()

z-score标准化

对原始数据做z-score标准化((X−μ)/δ),经过处理的数据符合标准正态分布,即均值为0,标准差为1。

差分然后求方差

diff = arr2-arr1
np.var(diff)     # 0.2019325098269433 < 1 所以是周期性曲线,周期性是1天

 

思考:如何计算出一条曲线的周期呢?

参见:计算时序数据的周期性 

posted @ 2021-03-01 20:23  lixin[at]hitwh  阅读(3184)  评论(0编辑  收藏  举报