You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:09:03