如何用Python方案量化不同二进制时间序列的事件发生频率差异
二进制时间序列事件频率差异量化方案
以下提供3种鲁棒性强、可直接用Python实现的方案,适配非严格周期、存在噪声的复杂二进制时间序列场景:
前置准备(样本数据生成)
修正原代码的语法问题与缺失依赖,可直接运行生成样本序列:
import numpy as np import pandas as pd import datetime as dt # 生成样本二进制序列 x1=np.linspace(1, 1,num=60) for n in range (1,60): if n % 2 == 0: x1[n*2-3:n*2]=0 x2=np.linspace(1, 1,num=60) for n in range (0,60): if n % 3 == 0: x2[n+1:n+3]=0 x3=np.linspace(1, 1,num=60) for n in range (0,60): if n % 2 == 0: x3[n+1:n+2]=0 df=pd.DataFrame([x1,x2,x3]).T df.columns = ['序列1', '序列2', '序列3'] df['date'] = pd.date_range(start=dt.datetime(2018, 1, 1), periods=df.shape[0], freq='D')

方案1:功率谱密度估计(基于傅里叶变换,抗噪性最优)
用Welch法估计功率谱,避免直接FFT的频谱泄露问题,峰值对应的频率就是事件发生的核心频率,峰值越高说明周期性越强,即使存在偶发事件缺失、干扰噪声也能稳定检测。
from scipy import signal import matplotlib.pyplot as plt fs = 1 # 采样频率为1/天 for col in ['序列1', '序列2', '序列3']: f, Pxx = signal.welch(df[col].values, fs, nperseg=30) # 提取主频率 main_freq = f[np.argmax(Pxx)] print(f"{col} 核心事件频率:{main_freq:.4f} /天,平均间隔:{1/main_freq:.2f} 天") plt.plot(f, Pxx, label=col) plt.xlabel('频率(次/天)') plt.ylabel('功率谱密度') plt.legend() plt.show()
方案2:事件间隔统计检验(适配非严格周期序列)
先提取所有事件发生的间隔,拟合间隔分布后用KS检验量化两组序列的差异显著性,适合事件间隔存在随机波动的非理想周期序列。
from scipy.stats import kstest def get_intervals(seq): # 提取所有1的位置,计算间隔 event_pos = np.where(seq==1)[0] return np.diff(event_pos) # 计算各序列的间隔 int1 = get_intervals(df['序列1'].values) int2 = get_intervals(df['序列2'].values) int3 = get_intervals(df['序列3'].values) # 统计检验两组差异 stat, p_val = kstest(int1, int2) print(f"序列1和序列2间隔分布差异KS检验p值:{p_val:.6f},p<0.05说明差异显著") # 输出间隔统计量 print(f"序列1平均间隔:{int1.mean():.2f}天,序列2:{int2.mean():.2f}天,序列3:{int3.mean():.2f}天")
方案3:滑动窗口事件发生率(适配非平稳序列)
如果序列频率随时间变化,可以用滑动窗口统计单位时间内的事件数,对比不同序列的频率变化趋势。
# 7天滑动窗口统计事件发生率 window_size = 7 for col in ['序列1', '序列2', '序列3']: df[f'{col}_rate'] = df[col].rolling(window_size).sum() / window_size print(f"{col} 全局平均事件发生率:{df[col].mean():.4f}/天")
内容的提问来源于stack exchange,提问作者Seji
相关产品推荐
相关产品推荐

