Json-Python-Server/docs/旧的charts-data-mode-plan.md
2026-01-29 18:18:32 +08:00

126 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 前后端分离的可视化数据返回方案ECharts
## 目标
- 后端不再生成/传输图片,仅返回图表数据;前端使用 ECharts 渲染。
- 统一的数据结构,减少前端适配代码;杜绝 NaN/Infinity/不可序列化对象导致的 API 崩溃。
- 与现有 API 保持兼容(`images` 可留空),逐步迁移到 `charts` 数据模式。
## 序列化与清洗规范(必须遵守)
- **NaN / Infinity / pd.NA**:递归清洗为 `null`JSON `null`)。不得返回字符串 "NaN"。
- **时间戳**:统一 ISO8601 字符串(例 `2023-01-01T12:00:00`)。
- **数组/矩阵**:全部转为原生 Python list再 JSON 序列化。
- **DataFrame**:优先 `to_dict(orient="records")` 或组装 dataset 形式(见下)。
- **数值类型**numpy 标量转原生 `int/float/bool`;遇到 `nan/inf` 先清洗。
> 建议实现一个通用函数 `to_echarts_safe(obj)`,递归处理上述清洗与类型转换,所有响应数据出站前统一走这一层。
## 响应骨架(新增 `charts`,旧字段保持)
```json
{
"success": true,
"meta": { ... },
"analysis": {
"zh": {
"data_description": "...",
"preprocessing_steps": [ ... ],
"api_analysis": { ... },
"steps": [
{"key": "ts", "title": "Time Series", "summary": "...", "chart": "ts"},
...
]
}
},
"charts": {
"ts": { "type": "line", "dataset": [...], "meta": {...} },
"acf_pacf": { "type": "bar", "series": [...], "meta": {...} },
"heatmap": { "type": "heatmap", "data": [...], "xLabels": [...], "yLabels": [...], "meta": {...} },
...
},
"images": {},
"log": [...]
}
```
- `steps[].chart` 指向 `charts` 的 key前端可按步骤顺序渲染。
- `images` 保留但为空,兼容旧前端。
## 各图表建议的数据格式(贴合 ECharts
- **时间序列ts**`dataset` 形式
- 二维数组:首行表头,例如 `[ ["timestamp","sales","ad_cost"], ["2023-01-01T00:00:00", 10, 5], ... ]`
- 前端:`dataset.source = dataset``series: [{type:'line', encode:{x:'timestamp', y:'sales'}}, ...]`
- **ACF / PACFacf_pacf**
- `{ series: [{name:'acf', data:[{lag:0, value:1.0}, ...]}, {name:'pacf', data:[...] }], meta:{column:'sales'} }`
- **平稳性检验stationarity**
- `{ adf: {statistic:..., p_value:..., critical_values:{...}}, kpss:{...}, meta:{column:'sales'} }`
- 前端可渲染 bar/表格。
- **正态性检验normality**
- `{ columns: [{name:'col', shapiro_p:..., jb_p:..., shapiro_stat:..., jb_stat:...}], meta:{} }`
- **季节性分解seasonal**
- `dataset` 形式:`[["timestamp","observed","trend","seasonal","resid"], [...]]`
- **频谱分析spectral**
- `periodogram`: `{ f: [...], psd: [...] }`(可截断前 N 点)
- `spectrogram`: `{ f: [...], t: [...], values: [[i,j,val], ...] }`(可只返回 log10 后再压缩)
- **相关性热力图heatmap**
- `{ data: [[i,j,value], ...], xLabels:[...], yLabels:[...], meta:{} }`(后端提前 flatten N×N 矩阵)
- **PCA 碎石图pca_scree**
- `dataset`: `[["component","explained","cumulative"], [1,0.4,0.4], ...]`
- **PCA 散点pca_scatter**
- `records`: `[{pc1:..., pc2:..., timestamp:"..."}, ...]`
- **特征重要性feature_importance**
- `records`: `[{feature:"...", importance:0.12}, ...]`
- **聚类cluster**
- `records`: `[{timestamp:"...", cluster:0, x:<可选>, y:<可选>}...]`
- **因子分析factor**
- 类似聚类:`[{timestamp:"...", factor1:..., factor2:...}]`
- **协整检验cointegration**
- `{ trace_stat:[...], crit_95:[...], eigen_vals:[...], meta:{} }`
- **VAR 预测var_forecast**
- `dataset`: `[["step","var1_forecast","var2_forecast"], [1, ...], ...]`
> 原则:能用 `dataset` 就用 `dataset`,多条线在前端通过 `encode` 指定;需要矩阵的提前 flatten其余用 records。
## 样式与主题
- 后端不返回颜色、线型等视觉样式仅返回语义字段series 名称、指标含义)。前端根据主题决定配色与风格。
## 实施步骤(建议)
1) 增加 `to_echarts_safe` 清洗函数,统一处理 NaN/Infinity/Timestamp/DataFrame -> JSON-safe。
2) 在各分析函数里:保留计算逻辑,改为组装 chart datadataset/records/flatten不再生成 PNG`generate_plots` 逻辑可留作开关,但默认 False。
3) `run_analysis` 汇总时,将各 step 的数据填入 `charts`,在 `steps` 内写入 `chart` key引用图表
4) 路由层返回 `charts` 字段,`images` 留空,`steps` 仍返回。
5) 前端按 `charts` 协议接入 ECharts去掉对 `images` 的依赖。
## 兼容与回退
- 旧前端:仍可拿到 `analysis.steps``images`(为空)。
- 新前端:使用 `charts`。如果某一步失败,返回 `{error:"..."}` 和简短 summary避免 500。
## 性能注意
- 后端不画图CPU/IO 显著下降;如需进一步优化,可让前端传 `methods` 列表决定执行哪些步骤。
## 算法是否需要改动?
- 核心统计/时序算法ADF/KPSS、ACF/PACF、PCA、VAR、季节分解、相关矩阵、聚类等保持不变改动集中在“结果封装”层。
- 需要调整的只是输出包装:
- 将现有用于绘图的中间结果DataFrame/ndarray/statsmodels 结果)转换为 ECharts 友好的 JSON 结构,统一经过 `to_echarts_safe` 清洗NaN/Inf/Timestamp
- 矩阵类结果(如相关性)在后端提前 flatten 成 `[i,j,value]` 列表dataset 形式优先用于多系列折线/柱状。
- 可按需做截断/摘要以控体积(如 periodogram 取前 N 点spectrogram 取均值或下采样)。
- 补充元信息(列名/单位/变量名),方便前端生成 legend/tooltip。
- 不需改动的部分:
- 预处理、标准化流程、算法的数学实现与参数选择滞后阶、分解周期、PCA 组件数等)保持现状。
- 如后续发现数据量过大或性能瓶颈,可再对个别步骤做抽样/截断,但不影响算法正确性。
## 追加约定(仍然不改算法,只改结果包装)
- **直方图分箱**:正态性/分布分析中,后端负责 binning`np.histogram`),返回 `[["range_start","range_end","count"], ...]`。前端不做分箱。
- **to_echarts_safe 扩展**:除 NaN/Inf/Timestamp 外,显式处理 numpy 各数值类型、Decimal必要时加“已访问集合”防循环引用。统一输出 JSON-safe、ECharts-friendly 结构。
- **矩阵/多系列格式**:矩阵类(相关性等)继续 flatten `[i,j,value]`;多系列/多列数据优先用 dataset+encode保证对齐。