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

如何在Julia中对月度气温时间序列去季节化、去趋势并计算异常值?

Julia 时间序列去季节化、去趋势与异常值计算方案

核心工具包与操作方法

1. 基础组合工具实现

  • 去趋势:通过线性回归拟合趋势项,再从原序列中剥离趋势:
    using StatsBase, TimeSeries, GLM
    
    # 假设ts是你的月度气温TimeArray对象
    dates = timestamp(ts)
    x = collect(1:length(dates))
    # 拟合线性趋势模型
    model = lm(@formula(value ~ x), DataFrame(x=x, value=values(ts)))
    trend = predict(model, DataFrame(x=x))
    # 得到去趋势序列
    detrended_ts = values(ts) .- trend
    
  • 去季节化:针对月度数据,计算各月份的平均波动,再从去趋势序列中减去对应月份的均值:
    # 提取每个数据点的月份
    months = Dates.month.(dates)
    # 计算1-12月的平均季节波动
    seasonal_offsets = [mean(detrended_ts[months .== m]) for m in 1:12]
    # 得到去季节化+去趋势的序列
    deseasonalized_detrended_ts = detrended_ts .- [seasonal_offsets[m] for m in months]
    

2. 专业时间序列包 TSA.jl

该包提供了开箱即用的时间序列分解功能,适合快速处理:

using TSA

# 对时间序列进行加法模型分解(气温数据更适合加法模型)
decomp_result = decompose(ts, model=:additive)
# 分解后直接获取残差项(已去除趋势和季节成分)
cleaned_ts = decomp_result.residual

3. 异常值计算

基于处理后的残差序列,常用两种异常值判定方式:

  • 标准差法:将超出均值±3倍标准差的点视为异常值
    res_mean = mean(cleaned_ts)
    res_std = std(cleaned_ts)
    outliers = cleaned_ts[(cleaned_ts .> res_mean + 3res_std) .| (cleaned_ts .< res_mean - 3res_std)]
    
  • 四分位距法:将低于Q1-1.5IQR或高于Q3+1.5IQR的点视为异常值
    q1, q3 = quantile(cleaned_ts, [0.25, 0.75])
    iqr = q3 - q1
    outliers = cleaned_ts[(cleaned_ts .< q1 - 1.5iqr) .| (cleaned_ts .> q3 + 1.5iqr)]
    

注意事项

  • 气温数据的季节波动幅度通常不随均值变化,优先选择加法模型;若处理的是营收等数据,可切换为乘法模型(设置model=:multiplicative)。
  • 若序列存在缺失值,可先用TimeSeries.interpolate方法填充后再处理。

内容的提问来源于stack exchange,提问作者vcv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:07:19