时间:2025-12-28 17:31
人气:
作者:admin
很多刚入行的小伙伴问我:“我想预测下个月公司的销售额,或者预测一下明天的股价,该学什么?”
我的回答通常只有六个字:时间序列分析。
如果在数据分析的世界里有一种魔法能让你“预知未来”,那一定就是它。
别被名词吓到了。简单来说,时间序列(Time Series)就是按时间顺序排列的一组数据。
比如:
这些数据都有一个共同点:有一个时间轴,且数据随着时间变化。
我们做时间序列分析的核心目的,就是要从过去的“历史数据”中找出规律,然后把这个规律延长到“未来”,这就是预测。
初学者最容易犯的错误是直接把数据丢进模型里跑。
作为一名老手,我要告诉你:看到数据,先拆解。
通常,任何一个随时间变化的数据(比如一家奶茶店的日销量),都可以被拆分为四个部分。
这是数据在长时间内的主要运动方向。
数据受季节、节假日等固定周期影响而出现的波动。
这是一些周期较长、不固定的波动,通常和宏观经济有关。
这是随机的、不可控的波动。
(重点):
在实际的时间序列预测中,我们主要抓 “长期趋势” 和 “季节变动”。抓住了这两条大鱼,预测的准确度通常能达到80%以上。
至于循环变动和不规则变动,因为占比小且太复杂,我们往往选择战略性忽略。
光说不练假把式。下面我们用Python代码模拟一组奶茶店的销售数据,并演示如何把这四个成分“拆”出来。
首先,构造“虚假”的奶茶店数据。
# === 第一步:构造数据 ===
# 假设我们有过去3年(36个月)的月度销售数据
dates = pd.date_range(start='2021-01-01', periods=36, freq='ME')
# 1. 制造【长期趋势】:每个月销量基础增加 10 杯
trend = np.linspace(100, 460, 36)
# 2. 制造【季节变动】:模拟每年夏天高、冬天低 (用正弦波模拟)
# 这里的逻辑是制造一个周期性的波浪
seasonality = 50 * np.sin(np.linspace(0, 3 * 2 * np.pi, 36))
# 3. 制造【不规则变动/噪音】:随机波动
noise = np.random.normal(0, 20, 36)
# 4. 合成总销量
total_sales = trend + seasonality + noise
# 创建 DataFrame
df = pd.DataFrame({'Date': dates, 'Sales': total_sales})
df.set_index('Date', inplace=True)

然后,使用 statsmodels 库进行分解,它能帮我们一键拆解数据。
from statsmodels.tsa.seasonal import seasonal_decompose
# === 第二步:数据分解 ===
# model='additive' 表示加法模型(销量 = 趋势 + 季节 + 噪音)
# 如果波动幅度随着趋势变大而变大,通常用乘法模型 (multiplicative)
decomposition = seasonal_decompose(df['Sales'], model='additive')
# === 第三步:绘图展示 ===
fig = decomposition.plot()
fig.set_size_inches(12, 10) # 设置画布大小
plt.show()

从上面四个子图可以看出:
学会了上面的代码,你已经入门了。但作为过来人,我想告诉你,工具和算法虽然层出不穷,但分析思路才是万变不离其宗的。
首先,关注数据的平稳性,这是时间序列分析的门槛。
简单说,大部分复杂的统计模型(如ARIMA)都假设数据的性质(均值、方差)不随时间变化。
然而现实数据(如股价、销量)往往是不平稳的(有上涨趋势),因此如果你发现数据一直在涨,可以试着做差分(用今天的数减去昨天的数)。
差分后的数据往往就平稳了,更容易放入模型去训练。
其次,结合业务场景,不要死记硬背模型,还要看场景。
比如:
时间序列分析并没有想象中那么神秘。它的本质就是:承认历史会重演,但也接纳未来的不确定性。
对于刚入行的朋友,我的建议是:
Python代码跑一遍,尝试修改一下数据,看看结果有什么变化。未来的分析方法虽然会越来越多,AI也会越来越强,但这种 “透过现象(原始数据)看本质(趋势与规律)” 的分析思维,将是我们职业生涯中永恒不变的宝贵财富。
下一篇:Python uv 简明教程