From 34f18104cccd65e42e4cb057c73ba5b877728a1a Mon Sep 17 00:00:00 2001 From: LYFxiaoan Date: Fri, 25 Jul 2025 16:32:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8E=86=E5=8F=B2=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=B7=AF=E5=BE=84=E6=8C=87=E5=90=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lyf开发日志记录文档.md | 15 + prediction_history.db | Bin 167936 -> 167936 bytes ..._19549899-43bc-4a16-8a9e-c897d25693fb.json | 1 - ..._34e230fe-00ef-4a43-900f-49ac495f7f1f.json | 1 + ..._b00ec055-7dae-4ef6-a8b5-cfcccfb56baa.json | 1 + ..._b37dbac5-dc53-4528-9182-1bdf8d8bb836.json | 1 + ..._bd11c5d4-49d0-4f72-af4b-2885ad3ba385.json | 525 ++++++++++++++++++ server/tools/delete_old_predictions.py | 98 ++++ 项目快速上手指南.md | 85 ++- 9 files changed, 723 insertions(+), 4 deletions(-) delete mode 100644 saved_predictions/prediction_19549899-43bc-4a16-8a9e-c897d25693fb.json create mode 100644 saved_predictions/prediction_34e230fe-00ef-4a43-900f-49ac495f7f1f.json create mode 100644 saved_predictions/prediction_b00ec055-7dae-4ef6-a8b5-cfcccfb56baa.json create mode 100644 saved_predictions/prediction_b37dbac5-dc53-4528-9182-1bdf8d8bb836.json create mode 100644 saved_predictions/prediction_bd11c5d4-49d0-4f72-af4b-2885ad3ba385.json create mode 100644 server/tools/delete_old_predictions.py diff --git a/lyf开发日志记录文档.md b/lyf开发日志记录文档.md index f79f15b..d0ea0e9 100644 --- a/lyf开发日志记录文档.md +++ b/lyf开发日志记录文档.md @@ -395,3 +395,18 @@ 2. **撰写新指南**: 基于分析结果,撰写并覆盖生成了一份全新的、内容详尽的 **`项目快速上手指南.md`**。 3. **文档迭代**: 根据开发者的提问,在新指南中补充了关于“数据库索引 -> JSON文件内容”的读取机制说明,以及关于如何管理和清理历史产物的“系统维护与扩展”章节。 - **最终成果**: 产出了一份高质量、与当前代码完全同步的核心技术指南,显著提升了项目的可维护性和知识传承效率。 + + +--- + +## 2025-07-25 (续): 历史数据一致性修复 +**开发者**: Roo (AI Assistant) & lyf + +### 19:45 - 修复历史预测详情加载失败 (404 Not Found) +- **问题现象**: 在修复了新预测的保存路径后,前端历史预测列表中的旧记录在点击“查看详情”时,会报错“预测结果文件不存在”。 +- **根本原因分析**: 这是一个**数据一致性**问题。虽然我们修复了**新数据**的写入逻辑,但数据库中仍然存在大量**旧记录**,这些记录的 `file_path` 字段依然指向了旧的、错误的 `static/predictions/` 路径。 +- **解决方案 (数据清理)**: + 1. **创建清理脚本**: 创建了一个一次性维护脚本 `server/tools/delete_old_predictions.py`,用于安全地清理这些“脏数据”。 + 2. **调试与修复**: 脚本的初版存在时区比较逻辑错误,未能正确识别本地时区的记录。在经过一轮调试,将时间比较基准从UTC修正为本地时间后,脚本得以正常工作。 + 3. **执行清理**: 最终成功执行脚本,从数据库中清除了所有在指定时间点之前创建的、带有错误文件路径的历史记录。 +- **最终结论**: 通过对数据库中的存量数据进行清理,彻底解决了因新旧数据路径不一致而导致的 `404` 错误,确保了系统数据的一致性和功能的稳定性。 diff --git a/prediction_history.db b/prediction_history.db index b2a9488f706a43a4497d3fc16658f2c20baf3c5f..85470c094bd9dc48f2a0ee662b42d17684189806 100644 GIT binary patch delta 6460 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 O6D}8LE-v({H~$x<+^N0* diff --git a/saved_predictions/prediction_19549899-43bc-4a16-8a9e-c897d25693fb.json b/saved_predictions/prediction_19549899-43bc-4a16-8a9e-c897d25693fb.json deleted file mode 100644 index c36bb4b..0000000 --- a/saved_predictions/prediction_19549899-43bc-4a16-8a9e-c897d25693fb.json +++ /dev/null @@ -1 +0,0 @@ -{"product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "model_type": "xgboost", "predictions": [{"date": "2025-04-05", "predicted_sales": 24.257638931274414}, {"date": "2025-04-06", "predicted_sales": 23.752357482910156}, {"date": "2025-04-07", "predicted_sales": 24.069677352905273}, {"date": "2025-04-08", "predicted_sales": 19.112489700317383}, {"date": "2025-04-09", "predicted_sales": 21.332242965698242}, {"date": "2025-04-10", "predicted_sales": 20.065534591674805}, {"date": "2025-04-11", "predicted_sales": 19.03286361694336}, {"date": "2025-04-12", "predicted_sales": 22.03268814086914}, {"date": "2025-04-13", "predicted_sales": 22.380788803100586}, {"date": "2025-04-14", "predicted_sales": 22.927005767822266}, {"date": "2025-04-15", "predicted_sales": 17.80633544921875}, {"date": "2025-04-16", "predicted_sales": 22.225345611572266}, {"date": "2025-04-17", "predicted_sales": 22.632287979125977}, {"date": "2025-04-18", "predicted_sales": 19.119356155395508}, {"date": "2025-04-19", "predicted_sales": 23.014183044433594}, {"date": "2025-04-20", "predicted_sales": 17.28049087524414}, {"date": "2025-04-21", "predicted_sales": 16.84412384033203}, {"date": "2025-04-22", "predicted_sales": 16.275175094604492}, {"date": "2025-04-23", "predicted_sales": 14.114492416381836}], "prediction_data": [{"date": "2025-04-05", "predicted_sales": 24.257638931274414}, {"date": "2025-04-06", "predicted_sales": 23.752357482910156}, {"date": "2025-04-07", "predicted_sales": 24.069677352905273}, {"date": "2025-04-08", "predicted_sales": 19.112489700317383}, {"date": "2025-04-09", "predicted_sales": 21.332242965698242}, {"date": "2025-04-10", "predicted_sales": 20.065534591674805}, {"date": "2025-04-11", "predicted_sales": 19.03286361694336}, {"date": "2025-04-12", "predicted_sales": 22.03268814086914}, {"date": "2025-04-13", "predicted_sales": 22.380788803100586}, {"date": "2025-04-14", "predicted_sales": 22.927005767822266}, {"date": "2025-04-15", "predicted_sales": 17.80633544921875}, {"date": "2025-04-16", "predicted_sales": 22.225345611572266}, {"date": "2025-04-17", "predicted_sales": 22.632287979125977}, {"date": "2025-04-18", "predicted_sales": 19.119356155395508}, {"date": "2025-04-19", "predicted_sales": 23.014183044433594}, {"date": "2025-04-20", "predicted_sales": 17.28049087524414}, {"date": "2025-04-21", "predicted_sales": 16.84412384033203}, {"date": "2025-04-22", "predicted_sales": 16.275175094604492}, {"date": "2025-04-23", "predicted_sales": 14.114492416381836}], "history_data": [{"date": "2025-03-06", "sales": 57.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-07", "sales": 84.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-08", "sales": 96.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 3, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-09", "sales": 78.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 3, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-10", "sales": 55.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-11", "sales": 67.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-12", "sales": 78.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-13", "sales": 66.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-14", "sales": 66.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-15", "sales": 83.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 3, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-16", "sales": 83.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 3, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-17", "sales": 66.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-18", "sales": 62.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-19", "sales": 64.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-20", "sales": 53.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-21", "sales": 62.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-22", "sales": 85.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 3, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-23", "sales": 77.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 3, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-24", "sales": 57.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-25", "sales": 65.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-26", "sales": 83.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-27", "sales": 73.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-28", "sales": 63.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-29", "sales": 69.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 3, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-30", "sales": 100.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 3, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-03-31", "sales": 72.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 3, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-04-01", "sales": 112.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 4, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-04-02", "sales": 56.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 4, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-04-03", "sales": 115.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 4, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-04-04", "sales": 84.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 4, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}], "analysis": {"trend": {"slope": -0.35340793676543664, "trend_type": "下降", "r_squared": 0.4464575969990724, "p_value": 0.001766767507323499, "volatility": 0.1417623496278433, "volatility_level": "中"}, "statistics": {"mean": 20.435530411569697, "median": 21.332242965698242, "min": 14.114492416381836, "max": 24.257638931274414, "std": 2.8969888070353678, "q1": 18.419599533081055, "q3": 22.77964687347412}, "day_over_day": [-2.082978684759045, 1.335951053378298, -20.595156220444913, 11.614150224206519, -5.937999000200192, -5.1464912136450165, 15.76128839201732, 1.579928241192423, 2.4405617224983955, -22.33466668286142, 24.817066796006017, 1.8309833046727726, -15.521770609186694, 20.37111949472713, -24.91373323189177, -2.5252004590751786, -3.3777283468151222, -13.275941215151416], "influencing_factors": {"product_id": "17002608", "model_type": "xgboost", "feature_count": 7, "important_features": ["价格", "周末", "节假日"]}, "explanation": "xgboost模型对产品17002608的预测分析:\n预测显示销量整体呈下降趋势,平均每天下降约0.35个单位。\n预测期内销量波动性中,表明销量有一定波动,但整体可控。\n预测期内平均日销量为20.44个单位,最高日销量为24.26个单位,最低日销量为14.11个单位。\n\n主要影响因素包括:价格, 周末, 节假日。"}} \ No newline at end of file diff --git a/saved_predictions/prediction_34e230fe-00ef-4a43-900f-49ac495f7f1f.json b/saved_predictions/prediction_34e230fe-00ef-4a43-900f-49ac495f7f1f.json new file mode 100644 index 0000000..75d601e --- /dev/null +++ b/saved_predictions/prediction_34e230fe-00ef-4a43-900f-49ac495f7f1f.json @@ -0,0 +1 @@ +{"product_id": null, "product_name": "一树贵阳金阳南路分店(福州街分店)", "model_type": "cnn_bilstm_attention", "predictions": [{"date": "2025-07-25", "predicted_sales": 13.282493591308594}, {"date": "2025-07-26", "predicted_sales": 13.293810844421387}, {"date": "2025-07-27", "predicted_sales": 13.289920806884766}, {"date": "2025-07-28", "predicted_sales": 13.431988716125488}, {"date": "2025-07-29", "predicted_sales": 13.326523780822754}, {"date": "2025-07-30", "predicted_sales": 12.930220603942871}, {"date": "2025-07-31", "predicted_sales": 13.056842803955078}, {"date": "2025-08-01", "predicted_sales": 13.158577919006348}, {"date": "2025-08-02", "predicted_sales": 13.169232368469238}, {"date": "2025-08-03", "predicted_sales": 13.183417320251465}, {"date": "2025-08-04", "predicted_sales": 13.33667278289795}, {"date": "2025-08-05", "predicted_sales": 13.194056510925293}, {"date": "2025-08-06", "predicted_sales": 12.770544052124023}, {"date": "2025-08-07", "predicted_sales": 12.872998237609863}, {"date": "2025-08-08", "predicted_sales": 12.92524242401123}], "prediction_data": [{"date": "2025-07-25", "predicted_sales": 13.282493591308594}, {"date": "2025-07-26", "predicted_sales": 13.293810844421387}, {"date": "2025-07-27", "predicted_sales": 13.289920806884766}, {"date": "2025-07-28", "predicted_sales": 13.431988716125488}, {"date": "2025-07-29", "predicted_sales": 13.326523780822754}, {"date": "2025-07-30", "predicted_sales": 12.930220603942871}, {"date": "2025-07-31", "predicted_sales": 13.056842803955078}, {"date": "2025-08-01", "predicted_sales": 13.158577919006348}, {"date": "2025-08-02", "predicted_sales": 13.169232368469238}, {"date": "2025-08-03", "predicted_sales": 13.183417320251465}, {"date": "2025-08-04", "predicted_sales": 13.33667278289795}, {"date": "2025-08-05", "predicted_sales": 13.194056510925293}, {"date": "2025-08-06", "predicted_sales": 12.770544052124023}, {"date": "2025-08-07", "predicted_sales": 12.872998237609863}, {"date": "2025-08-08", "predicted_sales": 12.92524242401123}], "history_data": [{"date": "2025-06-24", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-25", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-26", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-27", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-28", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 6, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-29", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 6, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-30", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-01", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-02", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-03", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-04", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-05", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-06", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-07", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-08", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-09", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-10", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-11", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-12", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-13", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-14", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-15", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-16", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-17", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-18", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-19", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-20", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-21", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-22", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-23", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-24", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}], "analysis": null, "store_name": "一树贵阳金阳南路分店(福州街分店)"} \ No newline at end of file diff --git a/saved_predictions/prediction_b00ec055-7dae-4ef6-a8b5-cfcccfb56baa.json b/saved_predictions/prediction_b00ec055-7dae-4ef6-a8b5-cfcccfb56baa.json new file mode 100644 index 0000000..d2e0f22 --- /dev/null +++ b/saved_predictions/prediction_b00ec055-7dae-4ef6-a8b5-cfcccfb56baa.json @@ -0,0 +1 @@ +{"product_id": null, "product_name": "一树贵阳金阳南路分店(福州街分店)", "model_type": "cnn_bilstm_attention", "predictions": [{"date": "2025-07-25", "predicted_sales": 13.282493591308594}, {"date": "2025-07-26", "predicted_sales": 13.293810844421387}, {"date": "2025-07-27", "predicted_sales": 13.289920806884766}, {"date": "2025-07-28", "predicted_sales": 13.431988716125488}, {"date": "2025-07-29", "predicted_sales": 13.326523780822754}, {"date": "2025-07-30", "predicted_sales": 12.930220603942871}, {"date": "2025-07-31", "predicted_sales": 13.056842803955078}], "prediction_data": [{"date": "2025-07-25", "predicted_sales": 13.282493591308594}, {"date": "2025-07-26", "predicted_sales": 13.293810844421387}, {"date": "2025-07-27", "predicted_sales": 13.289920806884766}, {"date": "2025-07-28", "predicted_sales": 13.431988716125488}, {"date": "2025-07-29", "predicted_sales": 13.326523780822754}, {"date": "2025-07-30", "predicted_sales": 12.930220603942871}, {"date": "2025-07-31", "predicted_sales": 13.056842803955078}], "history_data": [{"date": "2025-06-25", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-26", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-27", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-28", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 6, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-29", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 6, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-30", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-01", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-02", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-03", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-04", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-05", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-06", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-07", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-08", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-09", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-10", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-11", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-12", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-13", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-14", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-15", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-16", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-17", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-18", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-19", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-20", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-21", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-22", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-23", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-24", "sales": 0.0, "product_id": "17002608", "product_name": "云南白药创可贴(便携型)", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}], "analysis": null, "store_name": "一树贵阳金阳南路分店(福州街分店)"} \ No newline at end of file diff --git a/saved_predictions/prediction_b37dbac5-dc53-4528-9182-1bdf8d8bb836.json b/saved_predictions/prediction_b37dbac5-dc53-4528-9182-1bdf8d8bb836.json new file mode 100644 index 0000000..5981783 --- /dev/null +++ b/saved_predictions/prediction_b37dbac5-dc53-4528-9182-1bdf8d8bb836.json @@ -0,0 +1 @@ +{"product_id": "17020190", "product_name": "左炔诺孕酮片", "model_type": "cnn_bilstm_attention", "predictions": [{"date": "2025-07-25", "predicted_sales": 3.459650993347168}, {"date": "2025-07-26", "predicted_sales": 3.489595890045166}, {"date": "2025-07-27", "predicted_sales": 3.516561508178711}, {"date": "2025-07-28", "predicted_sales": 3.53338623046875}, {"date": "2025-07-29", "predicted_sales": 3.4927194118499756}, {"date": "2025-07-30", "predicted_sales": 3.460852861404419}, {"date": "2025-07-31", "predicted_sales": 3.4948110580444336}], "prediction_data": [{"date": "2025-07-25", "predicted_sales": 3.459650993347168}, {"date": "2025-07-26", "predicted_sales": 3.489595890045166}, {"date": "2025-07-27", "predicted_sales": 3.516561508178711}, {"date": "2025-07-28", "predicted_sales": 3.53338623046875}, {"date": "2025-07-29", "predicted_sales": 3.4927194118499756}, {"date": "2025-07-30", "predicted_sales": 3.460852861404419}, {"date": "2025-07-31", "predicted_sales": 3.4948110580444336}], "history_data": [{"date": "2025-06-25", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-26", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-27", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-28", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 6, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-29", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 6, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-06-30", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 6, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-01", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-02", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-03", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-04", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-05", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-06", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-07", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-08", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-09", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-10", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-11", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-12", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-13", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-14", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-15", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-16", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-17", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-18", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 4, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-19", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 5, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-20", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 6, "month": 7, "is_holiday": false, "is_weekend": true, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-21", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 0, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-22", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 1, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-23", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 2, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}, {"date": "2025-07-24", "sales": 0.0, "product_id": "17020190", "product_name": "左炔诺孕酮片", "store_id": "GLOBAL", "store_name": "全部店铺-SUM", "weekday": 3, "month": 7, "is_holiday": false, "is_weekend": false, "is_promotion": false, "temperature": 20.0}], "analysis": {"trend": {"slope": 0.0008625728743416922, "trend_type": "平稳", "r_squared": 0.004794615347496793, "p_value": 0.8827307616676634, "volatility": 0.007133638657102353, "volatility_level": "低"}, "statistics": {"mean": 3.492511136191232, "median": 3.4927194118499756, "min": 3.459650993347168, "max": 3.53338623046875, "std": 0.024914312451494232, "q1": 3.4752243757247925, "q3": 3.5056862831115723}, "day_over_day": [0.8655467489518861, 0.77274329129256, 0.4784424288017895, -1.1509304663073707, -0.9123707543595094, 0.9812089100556087], "influencing_factors": {"product_id": "17020190", "model_type": "cnn_bilstm_attention", "feature_count": 7, "important_features": ["价格", "周末", "节假日"]}, "explanation": "cnn_bilstm_attention模型对产品17020190的预测分析:\n预测显示销量整体呈平稳趋势,销量基本保持稳定。\n预测期内销量波动性低,表明销量相对稳定,预测可信度较高。\n预测期内平均日销量为3.49个单位,最高日销量为3.53个单位,最低日销量为3.46个单位。\n\n主要影响因素包括:价格, 周末, 节假日。"}} \ No newline at end of file diff --git a/saved_predictions/prediction_bd11c5d4-49d0-4f72-af4b-2885ad3ba385.json b/saved_predictions/prediction_bd11c5d4-49d0-4f72-af4b-2885ad3ba385.json new file mode 100644 index 0000000..4e9ac2a --- /dev/null +++ b/saved_predictions/prediction_bd11c5d4-49d0-4f72-af4b-2885ad3ba385.json @@ -0,0 +1,525 @@ +{ + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "model_type": "cnn_bilstm_attention", + "predictions": [ + { + "date": "2025-07-25", + "predicted_sales": 0.8147072196006775 + }, + { + "date": "2025-07-26", + "predicted_sales": 0.8167740106582642 + }, + { + "date": "2025-07-27", + "predicted_sales": 0.8197348117828369 + }, + { + "date": "2025-07-28", + "predicted_sales": 0.8219858407974243 + }, + { + "date": "2025-07-29", + "predicted_sales": 0.8112776875495911 + }, + { + "date": "2025-07-30", + "predicted_sales": 0.8004958629608154 + }, + { + "date": "2025-07-31", + "predicted_sales": 0.8058184385299683 + } + ], + "prediction_data": [ + { + "date": "2025-07-25", + "predicted_sales": 0.8147072196006775 + }, + { + "date": "2025-07-26", + "predicted_sales": 0.8167740106582642 + }, + { + "date": "2025-07-27", + "predicted_sales": 0.8197348117828369 + }, + { + "date": "2025-07-28", + "predicted_sales": 0.8219858407974243 + }, + { + "date": "2025-07-29", + "predicted_sales": 0.8112776875495911 + }, + { + "date": "2025-07-30", + "predicted_sales": 0.8004958629608154 + }, + { + "date": "2025-07-31", + "predicted_sales": 0.8058184385299683 + } + ], + "history_data": [ + { + "date": "2025-06-25", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 2, + "month": 6, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-06-26", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 3, + "month": 6, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-06-27", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 4, + "month": 6, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-06-28", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 5, + "month": 6, + "is_holiday": false, + "is_weekend": true, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-06-29", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 6, + "month": 6, + "is_holiday": false, + "is_weekend": true, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-06-30", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 0, + "month": 6, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-01", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 1, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-02", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 2, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-03", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 3, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-04", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 4, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-05", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 5, + "month": 7, + "is_holiday": false, + "is_weekend": true, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-06", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 6, + "month": 7, + "is_holiday": false, + "is_weekend": true, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-07", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 0, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-08", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 1, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-09", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 2, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-10", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 3, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-11", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 4, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-12", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 5, + "month": 7, + "is_holiday": false, + "is_weekend": true, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-13", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 6, + "month": 7, + "is_holiday": false, + "is_weekend": true, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-14", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 0, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-15", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 1, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-16", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 2, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-17", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 3, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-18", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 4, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-19", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 5, + "month": 7, + "is_holiday": false, + "is_weekend": true, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-20", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 6, + "month": 7, + "is_holiday": false, + "is_weekend": true, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-21", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 0, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-22", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 1, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-23", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 2, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + }, + { + "date": "2025-07-24", + "sales": 0.0, + "product_id": "17021449", + "product_name": "布洛芬混悬液(美林)", + "store_id": "GLOBAL", + "store_name": "全部店铺-SUM", + "weekday": 3, + "month": 7, + "is_holiday": false, + "is_weekend": false, + "is_promotion": false, + "temperature": 20.0 + } + ], + "analysis": { + "trend": { + "slope": -0.0024171343871525353, + "trend_type": "平稳", + "r_squared": 0.4619268323887481, + "p_value": 0.0930247330579927, + "volatility": 0.008749220910445412, + "volatility_level": "低" + }, + "statistics": { + "mean": 0.8129705531256539, + "median": 0.8147072196006775, + "min": 0.8004958629608154, + "max": 0.8219858407974243, + "std": 0.007112858962983344, + "q1": 0.8085480630397797, + "q3": 0.8182544112205505 + }, + "day_over_day": [ + 0.25368512857903625, + 0.36249942896524706, + 0.2746045406674448, + -1.3027174820243943, + -1.328993112252526, + 0.6649098159565847 + ], + "influencing_factors": { + "product_id": "17021449", + "model_type": "cnn_bilstm_attention", + "feature_count": 7, + "important_features": [ + "价格", + "周末", + "节假日" + ] + }, + "explanation": "cnn_bilstm_attention模型对产品17021449的预测分析:\n预测显示销量整体呈平稳趋势,销量基本保持稳定。\n预测期内销量波动性低,表明销量相对稳定,预测可信度较高。\n预测期内平均日销量为0.81个单位,最高日销量为0.82个单位,最低日销量为0.80个单位。\n\n主要影响因素包括:价格, 周末, 节假日。" + } +} \ No newline at end of file diff --git a/server/tools/delete_old_predictions.py b/server/tools/delete_old_predictions.py new file mode 100644 index 0000000..4904d3f --- /dev/null +++ b/server/tools/delete_old_predictions.py @@ -0,0 +1,98 @@ +import sqlite3 +import os +import datetime + +# --- 配置 --- +DB_PATH = 'prediction_history.db' +# 用户指定的时间:2025年7月25日下午两点 (14:00) +# 数据库中存储的是本地时区的ISO格式字符串,所以我们直接用本地时间构建字符串 +CUTOFF_DATETIME_LOCAL = datetime.datetime(2025, 7, 25, 14, 0, 0) +# 生成与数据库格式匹配的ISO字符串 +CUTOFF_ISO_STRING = CUTOFF_DATETIME_LOCAL.isoformat() + +def get_db_connection(): + """创建并返回数据库连接""" + conn = sqlite3.connect(DB_PATH) + conn.row_factory = sqlite3.Row + return conn + +def main(): + """主执行函数""" + print("--- 开始清理旧的预测历史数据 ---") + print(f"数据库路径: {os.path.abspath(DB_PATH)}") + print(f"时间分界点 (本地时间): {CUTOFF_ISO_STRING}") + + conn = None + try: + conn = get_db_connection() + cursor = conn.cursor() + + # 1. 找出所有需要删除的记录 + query = "SELECT id, file_path, created_at FROM prediction_history WHERE created_at < ?" + cursor.execute(query, (CUTOFF_ISO_STRING,)) + records_to_delete = cursor.fetchall() + + if not records_to_delete: + print("\n[INFO] 没有找到需要清理的旧数据。") + return + + print(f"\n[INFO] 发现了 {len(records_to_delete)} 条需要清理的记录。") + + ids_to_delete_from_db = [] + files_deleted_count = 0 + files_not_found_count = 0 + + # 2. 遍历记录,删除关联的JSON文件 + for record in records_to_delete: + record_id = record['id'] + file_path = record['file_path'] + created_at = record['created_at'] + + print(f" - 正在处理记录 ID: {record_id} (创建于: {created_at})") + + if file_path and isinstance(file_path, str): + # 确保我们处理的是项目根目录下的相对路径 + absolute_file_path = os.path.abspath(file_path) + if os.path.exists(absolute_file_path): + try: + os.remove(absolute_file_path) + print(f" [SUCCESS] 已删除文件: {absolute_file_path}") + files_deleted_count += 1 + except OSError as e: + print(f" [ERROR] 删除文件失败: {e}") + else: + print(f" [WARNING] 文件未找到 (可能已被删除): {absolute_file_path}") + files_not_found_count += 1 + else: + print(f" [INFO] 此记录没有关联的文件路径。") + + ids_to_delete_from_db.append(record_id) + + # 3. 从数据库中删除记录 + if ids_to_delete_from_db: + # 使用元组来传递给 a, b, c IN (?, ?, ?) + placeholders = ','.join('?' for _ in ids_to_delete_from_db) + delete_query = f"DELETE FROM prediction_history WHERE id IN ({placeholders})" + + cursor.execute(delete_query, ids_to_delete_from_db) + conn.commit() + print(f"\n[SUCCESS] 已从数据库中删除 {cursor.rowcount} 条记录。") + + print("\n--- 清理完成 ---") + print(f"总计处理记录: {len(records_to_delete)}") + print(f"成功删除文件: {files_deleted_count}") + print(f"未找到的文件: {files_not_found_count}") + + except sqlite3.Error as e: + print(f"\n[FATAL] 数据库操作失败: {e}") + except Exception as e: + print(f"\n[FATAL] 发生未知错误: {e}") + finally: + if conn: + conn.close() + print("\n数据库连接已关闭。") + +if __name__ == '__main__': + # 确保脚本在项目根目录执行 + # os.chdir(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + main() \ No newline at end of file diff --git a/项目快速上手指南.md b/项目快速上手指南.md index 114c5fd..223a980 100644 --- a/项目快速上手指南.md +++ b/项目快速上手指南.md @@ -59,7 +59,7 @@ | - data/*.parquet: 原始时序数据 | | - saved_models/*.pth: 训练好的模型文件 (权重、配置、缩放器) | | - saved_predictions/*.json: 详细的预测结果文件 | -| - prediction_history.db: SQLite数据库 (存储元数据) | +| - prediction_history.db: SQLite数据库 (存储元数据和文件路径索引) | +-----------------------------------------------------------------+ ``` @@ -67,7 +67,11 @@ #### **步骤一:数据准备** - **原始数据**: 存储在 [`data/timeseries_training_data_sample_10s50p.parquet`](data/timeseries_training_data_sample_10s50p.parquet)。 -- **元数据**: 存储在根目录的 `prediction_history.db` SQLite数据库中。 +- **数据存储模式**: 本项目采用“数据库作索引,文件系统存内容”的设计模式。 + - **元数据 (索引)**: 存储在根目录的 `prediction_history.db` SQLite数据库中。它只记录轻量级的元信息(如模型版本、预测参数)和指向真实数据文件的**路径**。 + - **真实数据 (内容)**: + - **模型**: 训练好的模型(`.pth`文件)存放在 [`saved_models/`](saved_models/) 目录。 + - **预测结果**: 详细的预测数据(`.json`文件)存放在 [`saved_predictions/`](saved_predictions/) 目录。 #### **步骤二:模型训练 (异步)** 1. **API触发**: 前端调用 `POST /api/training` ([`server/api.py`](server/api.py:815))。 @@ -158,4 +162,79 @@ #### **企业级方案:归档到冷存储** -对于需要长期保留数据以备审计的场景,更专业的做法是将旧文件归档至廉价的云对象存储(如阿里云OSS, AWS S3等),而不是直接删除。数据库中仅更新文件路径指向云端地址即可。 \ No newline at end of file +对于需要长期保留数据以备审计的场景,更专业的做法是将旧文件归档至廉价的云对象存储(如阿里云OSS, AWS S3等),而不是直接删除。数据库中仅更新文件路径指向云端地址即可。 + +--- + +## 核心概念扫盲:算法、模型、训练与预测 + +对于初次接触AI和数据科学的开发者来说,这些术语可能会令人困惑。本章节旨在用最通俗易懂的方式,解释本项目核心的AI部分是如何工作的。 + +### 1. 一个简单的比喻:学生备考 + +让我们把整个AI预测系统想象成一个准备参加数学考试的学生: + +* **历史数据 (Data)**:就像是学生的**教科书和练习册** (`pharmacy_sales.xlsx` 文件)。里面包含了大量的历史题目(过去的销售情况)和对应的正确答案。 +* **算法 (Algorithm)**:是学生的**学习方法和大脑结构** (本项目中的 `KAN` 神经网络)。它定义了学生如何去理解问题、寻找规律,但算法本身不包含任何知识。它只是一套空的学习框架。 +* **训练 (Training)**:就是学生**学习和复习**的过程 (`server/trainers/kan_trainer.py` 脚本)。学生通过不断地做练习册上的题(读取历史数据),然后对照答案(真实的销售额),分析自己错在哪里(计算损失/Loss),然后反思并修正自己的解题思路(反向传播与优化)。这个过程会重复很多遍(Epochs),直到学生在模拟考试(测试集)中取得好成绩。 +* **模型 (Model)**:是学生学习完成后,**学到的所有知识和解题技巧** (保存在 `saved_models/` 下的 `.pth` 文件)。它不再是空的大脑框架,而是包含了所有规律和知识、准备好上考场的“成型的知识体系”。 +* **预测 (Prediction)**:就是学生**正式上考场考试**的过程 (`server/predictors/model_predictor.py` 脚本)。我们给学生一套他从未见过的新题目(例如,提供最近30天的数据,让他预测未来7天),学生利用他已经学到的知识(加载`.pth`模型文件),给出他认为最可能的答案(未来的销售额)。 + +### 2. 训练和预测在本项目中的区别与联系 + +**Q: 训练和预测所使用的算法有区别吗?** + +**A:** 核心算法(大脑结构)是**完全相同**的,都是 `KAN` 网络。但它们所做的事情(功能)截然不同。 + +* **训练 (`train_product_model_with_kan`)** + * **目标**:**创造一个模型**。 + * **输入**:大量的历史数据(特征+答案)。 + * **过程**:是一个**学习和迭代**的过程。它会反复调整算法内部的参数(权重),目标是让预测结果与真实答案的差距越来越小。这是一个计算量巨大、非常耗时的过程。 + * **输出**:一个 `.pth` 文件,这就是训练好的模型。 + +* **预测 (`load_model_and_predict`)** + * **目标**:**使用一个已有的模型**。 + * **输入**:一小段最近的历史数据(只有特征,没有答案)。 + * **过程**:是一个**计算和应用**的过程。它加载训练好的`.pth`模型文件,将输入数据“喂”给模型,模型根据已经固化的参数,直接计算出结果。这个过程非常快。 + * **输出**:对未来的预测数据(JSON格式)。 + +**总结**:训练是“从0到1”打造模型的过程,预测是“使用这个1”来解决实际问题的过程。 + +### 3. 模型的具体实现是怎样的? + +1. **我们如何得到模型?** + * 我们运行训练脚本 (`uv run train_model`)。 + * 该脚本调用 `kan_trainer.py` 中的 `train_product_model_with_kan` 函数。 + * 这个函数会加载销售数据,对数据进行预处理(例如,将“星期一”转换为数字1,将所有数据缩放到0-1之间以便于神经网络处理)。 + * 然后,它将数据切分成“用连续30天的数据,预测未来7天销量”这样的样本对。 + * 最后,它通过成千上万次的学习迭代,将学到的知识保存为一个 `.pth` 文件。 + +2. **预测的具体实现是怎样的?** + * 我们通过API请求预测。 + * API调用 `model_predictor.py` 中的 `load_model_and_predict` 函数。 + * 该函数首先根据请求,找到对应的 `.pth` 模型文件并加载它。 + * 然后,它获取预测开始日期前最新的30天真实数据。 + * 它将这30天数据输入模型,得到对未来第1天的预测销量。 + * **关键一步(自回归)**:它将第1天的预测结果,当作“真实发生过”的数据,拼接到历史数据的末尾,并丢掉最老的一天,形成一个新的30天数据序列。 + * 它用这个新的序列去预测第2天的销量。 + * ……如此循环往复,直到预测出未来7天的全部结果。 + +### 4. 我需要具备哪些技术才能理解? + +这是一个很好的问题,可以分层来看: + +* **初级(能使用和调试)**: + * **Python基础**:能读懂基本的Python代码和逻辑。 + * **Pandas库**:了解如何操作和处理表格数据(DataFrame)。我们项目中的数据预处理大量使用Pandas。 + * **理解本章节内容**:对训练和预测有宏观概念,知道输入什么、输出什么即可。 + +* **中级(能修改和优化)**: + * **PyTorch框架**:了解PyTorch的基本概念,如 `Tensor`(张量)、`nn.Module`(模型结构)、`Optimizer`(优化器)、`DataLoader`(数据加载器)。我们的 `KAN` 模型就是用PyTorch构建的。 + * **机器学习基础概念**:了解什么是特征工程、训练集/测试集、损失函数、过拟合与欠拟合等。 + +* **高级(能设计和创新)**: + * **深度学习理论**:深入理解神经网络、反向传播等原理。 + * **时间序列分析**:了解ARIMA、LSTM、Transformer等其他时间序列预测模型的原理和优劣。 + +**给您的建议**: +您现在完全不需要焦虑。从“初级”开始,先尝试理解数据的流转,即数据是如何从文件加载,被Pandas处理,然后输入给训练器或预测器的。当您能熟练地进行使用和调试后,再逐步去了解PyTorch和机器学习的细节。边学边做是最高效的方式。 \ No newline at end of file