想象你是一名裁缝,手里拿到一件穿了一周、布满褶皱的旧衬衫:整体斜向拉扯出的大褶子、衣柜折叠留下的规则折痕、还有因为汗渍和磨损变得厚薄不一的布料。你要在这件衬衫上绣出精美的图案(训练AI模型),可拿着皱巴巴的面料直接下针,结果必然歪歪扭扭。时间序列预处理就是把这件“时序衬衫”熨平的过程——差分像熨斗,一推一拉把整体趋势的大褶子压平;季节差分则沿着固定的折痕线精准压制,把周期性起伏熨成一片平整;Box-Cox变换好比调节蒸汽,专门对付“有的地方厚、有的地方薄”的方差问题。等布面光滑如新,ARIMA这类模型才能看清面料下隐藏的精巧纹理。这篇文章会带你亲手熨烫一件时序衬衫,搞明白熨几次、怎么熨、用什么蒸汽档位,以及熨完之后如何把预测值还原成能直接交付的“成品衬衫”。
平稳化是时序预测的“布料质检关”,掌握差分与Box-Cox,你才能让ARIMA模型看清真正的规律,这是时间序列工程师的基本功。
可视化演示
通过差分、季节差分和Box-Cox变换三个视角,展示将非平稳时间序列转化为平稳序列的核心方法与参数选择。
本节配有交互动效(进入视口后自动加载,约 3KB)。
平稳性概念
拿到一块准备刺绣的布料,裁缝会先用手摸一遍:厚薄是否均匀?拉伸是否走形?如果布料左厚右薄、纹理忽疏忽密,再精美的绣花也会被扭曲。时间序列的“平稳性”就是这块布的质检标准——不平稳的序列,均值、方差、相关性都像劣质布料一样处处跑偏。任何一段裁剪下来都无法代表整体,模型学到的规律自然不可靠。
在时间序列分析中,我们通常关注“弱平稳”,它不要求序列完全没有波动,而是要求统计性质稳定:无论选取哪一段时间窗口,序列的平均高度一致,波动幅度一致,相隔 k 个时刻的两个观测之间的相关性只由 k 决定。这就像一块织法均匀的布料,任意剪一块,手感都差不多。
假设观测序列为 X_t,弱平稳的三个条件可以写成:
平稳序列就像一块标准布料,裁剪出任何一段都能代表整体。ARIMA 这类模型之所以要求数据先平稳化,是因为只有面对“规则面料”,模型才能把从过去学到的规律安全地推广到未来。
- 均值恒定无论 t 取哪一刻,期望都是同一个常数 μ,就像布面任何点位的厚度一致。
- 方差稳定波动幅度不随时间改变,布面的纹理疏密处处相同。
- 自协方差只依赖滞后Cov(X_t, X_{t-k}) = γ_k 表示相隔 k 个时刻的相关强度恒定,只受距离影响,不受起点影响。
一阶差分
熨斗从衬衫的左肩推向右下摆,一次加压,把整件衣服因穿着而“整体斜向拉扯”出来的大褶皱压平。这直观的一推,对应时间序列中的“一阶差分”。它是最简单、最常用的平整手段,专门对付那些带着明显上升或下降趋势的序列。
如果销售数据从第一天的一百元缓慢爬升到第一万天的一千万元,相邻两天相减,得到的几乎就是“每天的增长量”。把这么多增长量拼成一个新序列,原来的陡坡就不见了,剩下的是围绕某条水平线的起伏。这个“相邻相减”的运算,就是差分。
一阶差分的数学表达非常简洁:
一次熨烫之后,衬衫的整体“走向”被重置。差分后的序列均值被拉回零附近,原先的大趋势不再干扰视线,接下来就可以仔细查看布料上还剩下哪些更精细的褶皱——比如周期性的季节折痕。
- 当前观测值x_t 表示今天(时刻 t)观测到的数据,比如今天的销售额。
- 昨日观测值x_{t-1} 是上一个时刻的数据,即昨天的销售额。
- 相减得增量用今天的值减去昨天的值,如果序列有线性趋势,这一减就把趋势项消掉了。
季节差分
衬衫除了全身的大褶皱,还有在衣柜里叠放一整年留下的、排列整齐的“规则折痕”——每年夏天冷饮销量激增,每年冬天羽绒服销量上行,这种以 12 个月为周期的重复波动,就是时间序列的季节成分。普通熨斗横着推,很难处理这种和季节位置绑定的折痕,得沿着折痕的母版精准压。
如果只做一阶差分,相邻两天相减,并不会消除“每年 6 月都激增”这种同季效应。要处理周期为 S 的季节性,应当把当前时刻的值,减去上一个周期同一位置的值。对月度数据 S=12,对周数据 S=7,对小时数据可能是 S=24。
季节差分的表达式是:
沿着折痕的母版精准熨烫,规则的季节起伏就被压回原样。实际业务中,普通差分和季节差分常常组合使用:先一阶差分去掉趋势,再季节差分去掉周期,两道工序后,布面还剩最后一点顽固的厚薄不均。
- 季节周期确定S 是季节的长度,月度数据取 12,代表一年一个轮回。
- 同季历史值x_{t-S} 是上一个周期同一时刻的观测,比如去年同月的销量。
- 同季相减当前值减去同季值,把“每年这个季节都高/低”的固定折痕剥离开。
差分阶数
有些衬衫叠了三层,一熨斗下去只解决了最外面一层,里面还有两道褶。要不要再熨第二斗?答案不是“越多越好”,而是“看剩下的褶皱还有几层”。差分阶数 d 就是熨烫的次数,它决定了我们要做几次差分才能让序列平稳。
怎么判断还需要继续熨?最常用的工具是 ADF 检验,它本质上是检验序列里是否还藏着“单位根”——如果有单位根,说明布料还不够平,需要再差分;如果没有,就停手。除此之外,ACF 拖尾的速度和信息准则(AIC/BIC)也会帮忙判断。三者结合,就能较可靠地确定 d。
ADF 检验的核心回归方程是:
熨烫次数宁少勿多,每次差分都会损失一个观测值,也会对噪声做一次放大。聪明的方法是:先试一斗,检验一次;不合格再补一斗,直到 ADF 检验放行。
- 构造回归式把 Δx_t 对 x_{t-1} 以及若干滞后差分项回归,γ 是 x_{t-1} 的系数。
- 原假设H0: γ=0,表示序列存在单位根,仍然不平稳。
- 拒绝则停手如果检验统计量小于临界值,拒绝原假设,说明这一阶差分已经足够。
Box-Cox原理
有的衬衫穿久了会出现“厚薄不均”:肩膀处补丁叠补丁厚得硬挺,下摆却被洗得薄如蝉翼。在时间序列里,这种“厚度不均”就是方差随均值增大而增大的现象——销售额越高,波动也越大。熨斗只能压平形状,无法改变布料本身的质感,这时需要上蒸汽。
Box-Cox 变换就是一个“蒸汽熨烫”装置:它用一整套幂函数,把数据映射到一个新的标度上,使得原本被拉伸得过宽的厚区域收缩,薄区域适度舒展,最终让整个序列的方差趋于一致。它不改变数据之间的顺序,但改变了它们之间的“距离感”。
Box-Cox 变换的数学形式是一族幂变换:
蒸汽熨烫让厚处收缩、薄处舒展,变换后的序列方差变得相对稳定,分布也更接近对称。箱线图上那些拖得老长的尾巴被收拢,后续的 ARIMA 建模就有了均匀的“布面质地”。
- 取幂对原始值 x_t 做 λ 次幂运算,λ 控制蒸汽强度。
- 标准化分子减 1 是为了让 λ 趋近 0 时公式平滑过渡到对数。
- 除以 λ整体除以 λ,让变换后的尺度随 λ 连续变化。
- 对数极限λ=0 时直接取自然对数,这是最常用的“温和档位”。
Lambda选择
蒸汽熨斗的档位不能凭感觉瞎拧:档位太低,厚薄不均依旧;档位太高,布料被蒸汽打湿变形。Box-Cox 变换的 λ 就是这样一档蒸汽强度,需要靠数据自己说话。最经典的做法是最大似然估计——把每个候选 λ 都试一遍,看哪个档位让变换后的序列“最规整”。
具体做法是:在 λ 的候选区间内网格搜索,对每个 λ 计算变换后序列的方差,再结合一个雅可比校正项,构成对数似然值。似然值越高,说明这个 λ 越能解释数据的分布形态。把每个 λ 对应的似然值连成一条曲线,峰顶就是最优档位。
对数似然函数的形式为:
找到似然曲线的峰顶后,通常会看峰顶是否接近某个“整数档位”。如果最优 λ≈0,直接用对数变换;如果最优 λ≈0.5,用平方根变换。用整数值代替小数 λ,既能保留绝大部分效果,也让后续的解释和还原更简单。
- 变换序列对当前 λ 计算 y_t^(λ),这是候选档位下的烫后布面。
- 方差惩罚项变换后方差越小,这一项越大,说明布面越均匀。
- 雅可比校正乘以 (λ-1)Σln x_t,补偿因幂缩放引入的尺度偏差。
过度差分
熨斗在同一处反复压上十几遍,布料先是出现奇怪的镜面反光,接着起毛、变薄、破出小洞,还添了新的机器压痕。过度差分就是这样的“熨烫过度”:原本已经平稳的序列,再强行多差一次,非但不会让布面更平,反而把微小的噪声放大成明显的锯齿。
为什么过度差分有害?想象一段本来就是白噪声的平稳序列——它已经是一块刚熨好的布。如果你非要在上面再熨一斗,相邻两点的差值会叠加两个独立噪声,方差直接翻倍。原本平滑的布面被自己制造的新褶皱覆盖,模型会把噪声当成信号去拟合。
假设原始噪声是白噪声 u_t,对它做一次差分,方差会扩大:
过度差分还会破坏序列的可逆性,让本来可以还原的信息丢失,MA 结构也发生扭曲。所以每次差分前都要问自己:这斗熨下去,是去掉了真褶皱,还是制造了假折痕?ADF 检验说“停”的时候,就该放下熨斗。
- 白噪声u_t 是均值为 0、方差为 σ² 的独立同分布序列。
- 差分噪声Δu_t = u_t - u_{t-1},两个独立噪声相减。
- 方差累加独立变量的方差相加,结果变成 2σ²,明显大于原来的 σ²。
预测还原
熨平的衬衫最终要穿出门,没有人会穿着皱巴巴的布出门,但也没人会穿一块平整的“布片”出门——还原预测,就是把熨烫过程中“藏起来”的形状记忆找回来。在平稳化后的序列上做预测,得到的数字是“熨平后的尺度”,必须还原到原始量纲才能向业务方汇报。
还原要按预处理的相反方向走:如果预处理顺序是“一阶差分 → 季节差分 → Box-Cox”,还原时就依次执行“逆 Box-Cox → 逆季节差分 → 逆一阶差分”。逆差分本质上是累加求和:一阶差分的逆运算是从初始值开始,把每一步的差分值逐项加起来;季节差分的逆运算则要借助初始一个周期的值,按周期逐项回填。
还原的关键公式如下:
还原后的预测值带着和原始历史数据相同的量纲,可能是元、千瓦时、件数,直接放进报表就能让业务方看懂。记住,熨平是为了看清纹理,但最终能穿上身的,一定是还原回原本版型的那一件。
- 逆差分累加预测 h 步的未来值,就是从当前值出发,把每一步的差分预测值累加起来。
- 逆 Box-Cox把变换后的 y_t 还原成原始尺度的 x_t,公式是 Box-Cox 的逆运算。
AI 应用场景
电商销量预测
阶段:数据准备 / 特征工程
解决的问题:电商日销量既有逐年爬升的长期趋势,又有“双十一”这类周期性峰值,且销售额越大波动越剧烈。直接用原始销量训练 ARIMA,模型会把趋势和季节当噪声,预测严重失真。先做一阶差分去趋势,再做 S=7 的季节差分去周周期,最后用 Box-Cox 稳定方差,才能让 ARIMA 专注于真实需求信号。
具体案例:某生鲜电商的每日订单量序列,预处理后 ADF 检验 p 值从 0.7 降到 0.01,ARIMA 预测的 MAPE 从 28% 降到 12%,节假日峰值也能提前捕捉。
电力负荷预测
阶段:特征工程 / 模型输入
解决的问题:电网负荷有严格的日周期(白天高、夜晚低)和季节周期(夏冬高、春秋低),峰谷差异巨大,方差不稳。用 S=24 的季节差分消除日周期,辅以 Box-Cox 压缩极端峰值,再对平稳残差建模,预测曲线才能贴合真实的负荷波动。
具体案例:某区域电网的 15 分钟粒度负荷数据,预处理后 LSTM 与 ARIMA 的混合模型在夏季高温日的峰值预测误差下降了 35%,调度中心可以更从容地安排发电计划。
金融波动率预估
阶段:数据预处理 / 风险建模
解决的问题:金融资产收益率的方差随时间剧烈变化,牛市的剧烈波动和震荡市的平静交织,直接用 GARCH 或 ARIMA 拟合容易放大极值。Box-Cox 变换能显著压缩大波动,让方差走向平稳,差分则移除微弱的漂移趋势。
具体案例:某基金的日净值对数收益序列,应用 Box-Cox(λ≈0.3)后残差标准差下降 18%,基于平稳化数据的 VaR 估计在回测中少了一天误报警,风控团队对极端行情的判断更稳健。
Python 演示
# -*- coding: utf-8 -*-# 差分与Box-Cox: 把非平稳序列平稳化并还原预测import numpy as np def gen_signal(n=240, seed=42): """生成带趋势+季节+时变方差的非平稳序列""" rng = np.random.default_rng(seed) t = np.arange(n) trend = 0.08 * t season = 6 * np.sin(2 * np.pi * t / 12) noise = rng.normal(0, 1, n) * (1 + t / 60) return trend + season + noise def diff_1(x): """一阶差分""" return x[1:] - x[:-1] def diff_seasonal(x, s=12): """季节差分""" return x[s:] - x[:-s] def inv_diff_1(d, x0): """从一阶差分还原原始序列""" x = np.empty(len(d) + 1) x[0] = x0 x[1:] = x0 + np.cumsum(d) return x def inv_diff_seasonal(d, init, s=12): """从季节差分还原, init为前s个初始值""" n = len(d) + s x = np.empty(n) x[:s] = init for i in range(s, n): x[i] = x[i - s] + d[i - s] return x def boxcox(y, lam): """Box-Cox变换""" if abs(lam) < 1e-8: return np.log(y) return (np.power(y, lam) - 1) / lam def inv_boxcox(y, lam): """逆Box-Cox变换""" if abs(lam) < 1e-8: return np.exp(y) return np.power(lam * y + 1, 1.0 / lam) def boxcox_ll(y, lam): """Box-Cox对数似然, 数值上平移为正""" s = y - y.min() + 1.0 yt = boxcox(s, lam) mu = yt.mean() n = len(yt) var = np.mean((yt - mu) ** 2) return -0.5 * n * np.log(var) + (lam - 1) * np.sum(np.log(s)) def find_lambda(y): """网格搜索最优lambda""" best = 0.0 best_ll = -np.inf for lam in np.arange(0.0, 1.01, 0.01): ll = boxcox_ll(y, lam) if ll > best_ll: best_ll, best = ll, lam return best def acf1(x): """一阶自相关系数, 观察相关性衰减""" n = len(x) xc = x - x.mean() c0 = np.sum(xc ** 2) c1 = np.sum(xc[:-1] * xc[1:]) return c1 / c0 def main(): raw = gen_signal() d1 = diff_1(raw) d1s = diff_seasonal(d1, 12) shift = d1s.min() - 1.0 s = d1s - shift # 平移为正, 满足Box-Cox前提 lam = find_lambda(s) y = boxcox(s, lam) print("best lambda = %.2f" % lam) print("raw: mean %.2f var %.2f acf1 %.2f" % (raw.mean(), raw.var(), acf1(raw))) print("final: mean %.2f var %.2f acf1 %.2f" % (y.mean(), y.var(), acf1(y))) # 还原验证: 应能无损恢复原始序列 d1s_back = inv_boxcox(y, lam) + shift d1_back = inv_diff_seasonal(d1s_back, d1[:12], 12) raw_back = inv_diff_1(d1_back, raw[0]) print("还原误差: %.2e" % np.max(np.abs(raw_back - raw))) # 还原预测示例: 平稳域朴素一步预测 y_next = y[-1] d1s_next = inv_boxcox(y_next, lam) + shift d1_next = d1[-1] + d1s_next raw_next = raw[-1] + d1_next print("下一时点预测(原始尺度): %.2f" % raw_next) if __name__ == "__main__": main()
raw = gen_signal()制造一件“脏衬衫”:趋势 + 季节 + 时变噪声。d1 = diff_1(raw)第一步熨烫:相邻相减,去掉整体向上爬的趋势。d1s = diff_seasonal(d1, 12)第二斗:同月相减,去掉 12 个月周期的折痕。lam = find_lambda(s)用最大似然网格搜索选出“最优蒸汽档位” λ。y = boxcox(s, lam)用选好的 λ 把数据厚度(方差)统一。print("final: ...")对比平稳化前后均值、方差和 ACF1,直观验证效果。raw_back = inv_diff_1(d1_back, raw[0])逆差分回来,检查还原是否无损。raw_next = raw[-1] + d1_next在平稳域做朴素预测后再还原,得到原始量纲的预测值。
常见误区
误区我总担心差分不够,所以把 d 从 1 做到 8,看到 ADF 检验 p 值终于小于 0.05,就觉得万事大吉,数据一定是越差分越平稳。
正解这不是“熨得越多越好”,而是“熨到刚平就停手”。每多一次差分,都在放大噪声——方差会被叠加扩大,序列的可逆性也会被破坏。好比同一块布反复熨几十遍,最后不再起皱是因为布料已经发硬起毛,而非真正平整。判断标准应该是:从低阶开始逐次检验,一旦 ADF 通过就停止,不是为了 p 值好看而无限加阶。
为何常见:因为新手容易把“检验显著”当作唯一目标,忽略了差分会破坏信息结构这一副作用,也更难意识到一个事实:每次差分都会损失观测值,过度差分让样本量进一步缩小。
误区我拿着一段有负值的时间序列直接调用 Box-Cox,程序报错后我以为是库的 bug,于是手动把所有负数取绝对值再变换。
正解Box-Cox 要求数据为正,是因为幂运算(尤其是开方和对数)对非正数没有定义。正确的做法是先给序列加一个正常数平移,让最小值变为 1 左右的正常数,记录下这个偏移量,在还原时再减回去。盲目取绝对值会把负号的真实信息丢掉,相当于把衣服左右两片缝反了。
为何常见:因为负值在金融收益、温度偏差等序列里很常见,新手看到“稳定方差”这个目标就忽略了对数变换的定义域,误以为取绝对值是无害的预处理。
误区我画了一条序列的折线图,肉眼看着它围绕零波动,挺“平稳”的,就没有做 ADF 检验,直接拿去做 ARIMA。
正解眼睛会骗人。一条缓慢漂移的序列在短窗口内可能看起来像平稳,但它的均值其实在缓慢滑动;反过来,方差忽大忽小的序列在局部也可能“看起来稳定”。ADF 检验、ACF 的拖尾速度和信息准则才是客观的尺子。布料是厚是薄,不能只靠瞄一眼,得用卡尺量。
为何常见:因为视觉判断是最省力的直觉路径,尤其当序列波动较乱时,人脑会自动脑补出“稳定”的规律,忽略了统计检验能发现的细微不平稳。
误区我在平稳化后的序列上训练模型,得到未来 30 天的预测值,想都没想就直接写进周报,说销售额下月会在多少到多少之间。
正解平稳域的数字和原始量纲不是一回事。你必须在预测完成后,按预处理的相反顺序做还原:先逆 Box-Cox,再逆季节差分,最后逆一阶差分,才能得到百万、千万量级的真实销售额。忘了还原的预测值,就像把熨平后的布片直接当衬衫发给客户。
为何常见:因为预处理时很容易把数据“转来转去”,却忘记给每一步都准备对应的逆向函数,等预测完成时,只记得模型输出的是数字,忘了这个数字的坐标系早已被多次变换。
误区我觉得 Box-Cox 这么厉害,干脆跳过差分,只对原始序列做一次变换,应该就能让数据平稳了吧?
正解Box-Cox 只负责稳定方差,它管不了趋势和季节性的“形状”。一个带明显上升趋势的序列,无论怎么取对数,趋势依旧在;一个季节性很强的序列,λ 也消不掉周期折痕。差分管形状(趋势和周期),Box-Cox 管厚度(方差),两者是分工合作的关系,不是替代关系。
为何常见:因为新手把 Box-Cox 当成一个全能的“数据整形器”,没有理解它只是幂变换族,只能标度数据幅度,而无法改变数据的位置和周期结构。
面试题
Q1. 一阶差分的主要作用是?
- A.去掉线性趋势← 正确答案
- B.去掉季节周期
- C.稳定整体方差
- D.增加样本容量
答案:A。一阶差分把相邻两点相减,线性趋势项在减法中被消掉了,因此它的直接作用是去掉线性趋势。季节周期需要季节差分处理,方差稳定靠 Box-Cox,样本量则只会减少不会增加。
Q2. 季节差分中,x_t 应当减去?
- A.x_{t-1}
- B.x_{t+1}
- C.x_{t-S}← 正确答案
- D.x_{t+S}
答案:C。季节差分的核心是与“上一个周期同一位置”的值相减,对月度周期 S=12 就是减去 x_{t-12}。选项 A 是一阶差分,选项 B 和 D 用了未来值,不符合差分的方向性。
Q3. Box-Cox变换中 λ=0 对应的是?
- A.平方根变换
- B.对数变换← 正确答案
- C.指数变换
- D.恒等变换
答案:B。Box-Cox 在 λ=0 时退化为自然对数变换,这是由公式在 λ→0 时的极限决定的。λ=0.5 接近平方根,λ=1 是恒等变换,指数变换不属于 Box-Cox 家族。
Q4. 弱平稳序列必须满足?
- A.均值恒定不变← 正确答案
- B.方差恒定不变← 正确答案
- C.协方差只看滞后← 正确答案
- D.数据必须为正整数
答案:ABC。弱平稳要求均值恒定、方差恒定、自协方差只依赖于时间间隔,这三条保证了序列的统计结构随时间稳定。数据是否为正整数不是平稳性的必要条件,Box-Cox 才要求数据为正。
Q5. 过度差分的直接后果是?
- A.方差膨胀变大← 正确答案
- B.样本量无限增加
- C.模型速度变快
- D.预测精度提高
答案:A。过度差分会把白噪声也差分一次,独立噪声的方差相加,导致方差膨胀。样本量只会减少,模型速度不会变快,预测精度通常下降而非提高,因此答案只有 A。
Q6. 确定差分阶数常用的工具是?
- A.ADF单位根检验← 正确答案
- B.自相关ACF拖尾← 正确答案
- C.信息准则判断← 正确答案
- D.直接肉眼观察
答案:ABC。ADF 检验提供统计显著性判断,ACF 拖尾速度说明序列是否还有长期记忆,AIC/BIC 等信息准则从模型复杂度角度兜底。肉眼观察主观性强,不能作为判断差分阶数的可靠工具。
Q7. 做Box-Cox变换的前提是?
- A.数据必须为正← 正确答案
- B.数据必须为负
- C.数据必须为整数
- D.数据必须是复数
答案:A。Box-Cox 包含对数和幂运算,负数和零不在定义域内。实际工作中若数据有负值,会先整体平移成正数并记录偏移量,但“平移后为正”仍然以原始数据为正数作为前提条件。
Q8. 平稳化后的预测还原需要?
- A.逆Box-Cox变换← 正确答案
- B.逆差分累加还原← 正确答案
- C.逆季节差分还原← 正确答案
- D.直接丢弃噪声项
答案:ABC。还原要按预处理的相反顺序进行:逆 Box-Cox 把变换域拉回季节差分后的尺度,逆季节差分按周期回填,逆一阶差分逐项累加。丢弃噪声项会丢掉还原必需的信息,导致预测无法回到原始量纲。
Q9. ARIMA(p,d,q)中的 d 表示?
- A.差分运算阶数← 正确答案
- B.自回归项个数
- C.滑动平均项个数
- D.季节周期长度
答案:A。在 ARIMA(p,d,q) 中,p 是自回归阶数,q 是滑动平均阶数,d 是使序列平稳所需的差分阶数,对应文章里的“熨烫次数”。
Q10. Box-Cox能稳定方差的原因?
- A.幂变换改变数据尺度← 正确答案
- B.对数让乘法变加法← 正确答案
- C.压缩大值放大差值← 正确答案
- D.自动删除全部离群点
答案:ABC。幂变换将不同数量级的数据重新标度,对数变换把乘法关系变成加法关系,从而压缩大值、拉伸小值,让方差趋于一致。Box-Cox 不会删除任何数据点,它只是重新映射数值,离群点需要单独处理。