Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -127,22 +127,27 @@ def run_full_analysis(progress=gr.Progress(track_tqdm=True)):
|
|
127 |
log_lines.append(f"⚠️ 序列可能是白噪声(p-value = {lb_p_value:.4f}),模型可能无效。")
|
128 |
else:
|
129 |
log_lines.append(f"✅ 通过白噪声检验 (p-value = {lb_p_value:.4f}),可以进行后续建模。")
|
130 |
-
yield update_ui()
|
131 |
-
|
132 |
# --- 5. 季节性检验与分解 ---
|
133 |
-
log_lines.append("### 4. 季节性检验与STL分解")
|
134 |
-
# (简化了您的季节性检验逻辑,直接检查周期性并设定参数)
|
135 |
period = 365
|
136 |
-
seasonal_enabled = len(ts_data) > 2 *
|
137 |
m_period = 7 if seasonal_enabled else 1
|
138 |
log_lines.append(f"✅ 季节性参数设定: m={m_period}, seasonal={seasonal_enabled}")
|
139 |
|
140 |
if len(ts_data) >= 2 * period:
|
141 |
-
|
|
|
|
|
|
|
|
|
|
|
142 |
res = stl.fit()
|
143 |
fig, axes = plt.subplots(4, 1, figsize=(12, 8), sharex=True)
|
144 |
-
res.plot(
|
145 |
-
|
|
|
146 |
plt.tight_layout(rect=[0, 0, 1, 0.96])
|
147 |
figures.append(fig)
|
148 |
log_lines.append("✅ STL分解图已生成。")
|
@@ -150,6 +155,8 @@ def run_full_analysis(progress=gr.Progress(track_tqdm=True)):
|
|
150 |
log_lines.append("⚠️ 数据长度不足以进行年度季节性分解。")
|
151 |
yield update_ui()
|
152 |
|
|
|
|
|
153 |
# --- 6. 混合策略回测优化窗口大小 ---
|
154 |
log_lines.append("\n### 5. 优化训练窗口大小")
|
155 |
log_lines.append("⏳ **此步骤计算量大,可能需要5-15分钟,请耐心等待...**")
|
|
|
127 |
log_lines.append(f"⚠️ 序列可能是白噪声(p-value = {lb_p_value:.4f}),模型可能无效。")
|
128 |
else:
|
129 |
log_lines.append(f"✅ 通过白噪声检验 (p-value = {lb_p_value:.4f}),可以进行后续建模。")
|
130 |
+
yield update_ui()
|
131 |
+
|
132 |
# --- 5. 季节性检验与分解 ---
|
133 |
+
log_lines.append("\n### 4. 季节性检验与STL分解")
|
|
|
134 |
period = 365
|
135 |
+
seasonal_enabled = len(ts_data) > 2 * 14 # 改为数据多于两周则开启季节性
|
136 |
m_period = 7 if seasonal_enabled else 1
|
137 |
log_lines.append(f"✅ 季节性参数设定: m={m_period}, seasonal={seasonal_enabled}")
|
138 |
|
139 |
if len(ts_data) >= 2 * period:
|
140 |
+
# 【关键修复】确保 seasonal 参数是奇数
|
141 |
+
seasonal_period_for_stl = period if period % 2 != 0 else period + 1
|
142 |
+
log_lines.append(f"✅ 准备进行STL分解,周期(period)={period},季节平滑窗口(seasonal)={seasonal_period_for_stl}。")
|
143 |
+
yield update_ui() # 更新一下日志,让用户知道我们在做什么
|
144 |
+
|
145 |
+
stl = STL(ts_data, period=period, seasonal=seasonal_period_for_stl)
|
146 |
res = stl.fit()
|
147 |
fig, axes = plt.subplots(4, 1, figsize=(12, 8), sharex=True)
|
148 |
+
# 使用 res.plot() 可以自动处理标签
|
149 |
+
res.plot(axes=axes)
|
150 |
+
fig.suptitle(f'STL 分解图 (周期={period})', fontsize=16)
|
151 |
plt.tight_layout(rect=[0, 0, 1, 0.96])
|
152 |
figures.append(fig)
|
153 |
log_lines.append("✅ STL分解图已生成。")
|
|
|
155 |
log_lines.append("⚠️ 数据长度不足以进行年度季节性分解。")
|
156 |
yield update_ui()
|
157 |
|
158 |
+
|
159 |
+
|
160 |
# --- 6. 混合策略回测优化窗口大小 ---
|
161 |
log_lines.append("\n### 5. 优化训练窗口大小")
|
162 |
log_lines.append("⏳ **此步骤计算量大,可能需要5-15分钟,请耐心等待...**")
|