思路:
- 取最近兩個周期的數據分別做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天
