# 药店单品销售预测系统 - API参考手册 ## 1. API概述 药店销售预测系统提供了完整的RESTful API服务,支持药店销售数据管理、模型训练、销售预测和模型管理等功能。API使用JSON格式进行数据交换,并通过Swagger UI提供交互式文档。 ## 2. API基础信息 - **基础URL**: `http://localhost:5000/api` - **内容类型**: `application/json` - **认证方式**: 无认证(仅适用于测试环境) - **状态码**: - `200 OK`: 请求成功 - `400 Bad Request`: 请求参数错误 - `404 Not Found`: 资源不存在 - `500 Internal Server Error`: 服务器内部错误 ## 3. 启动API服务 ```bash # 基本启动 python api.py # 指定主机和端口 python api.py --host 127.0.0.1 --port 8080 # 禁用Swagger UI python api.py --swagger false # 禁用调试模式 python api.py --debug false ``` ## 4. 数据管理API ### 4.1 获取所有产品列表 获取系统中所有产品的ID和名称。 - **URL**: `/products` - **方法**: `GET` - **URL参数**: 无 **响应示例**: ```json { "status": "success", "data": [ { "product_id": "P001", "product_name": "布洛芬片" }, { "product_id": "P002", "product_name": "阿司匹林" } ] } ``` ### 4.2 获取单个产品详情 获取特定产品的详细信息。 - **URL**: `/products/{product_id}` - **方法**: `GET` - **URL参数**: - `product_id`: 产品ID,例如"P001" **响应示例**: ```json { "status": "success", "data": { "product_id": "P001", "product_name": "布洛芬片", "data_points": 365, "date_range": { "start": "2023-01-01", "end": "2023-12-31" } } } ``` ### 4.3 获取产品销售数据 获取指定产品在特定日期范围内的销售数据。 - **URL**: `/products/{product_id}/sales` - **方法**: `GET` - **URL参数**: - `product_id`: 产品ID,例如"P001" - **查询参数**: - `start_date`: 开始日期,格式为YYYY-MM-DD(可选) - `end_date`: 结束日期,格式为YYYY-MM-DD(可选) **响应示例**: ```json { "status": "success", "data": [ { "date": "2023-01-01", "product_id": "P001", "product_name": "布洛芬片", "sales": 120, "price": 15.5, "weekday": 6, "month": 1, "is_holiday": 1, "is_weekend": 1, "is_promotion": 0, "temperature": 5.2 }, { "date": "2023-01-02", "product_id": "P001", "product_name": "布洛芬片", "sales": 85, "price": 15.5, "weekday": 0, "month": 1, "is_holiday": 0, "is_weekend": 0, "is_promotion": 0, "temperature": 4.8 } ] } ``` ### 4.4 上传销售数据 上传新的销售数据文件。 - **URL**: `/data/upload` - **方法**: `POST` - **内容类型**: `multipart/form-data` - **参数**: - `file`: Excel文件(.xlsx),包含销售数据 **响应示例**: ```json { "status": "success", "message": "数据上传成功", "data": { "products": 5, "rows": 1825 } } ``` ## 5. 模型训练API ### 5.1 启动模型训练任务 启动一个新的模型训练任务。 - **URL**: `/training` - **方法**: `POST` - **请求体**: ```json { "product_id": "P001", "model_type": "mlstm", "parameters": { "look_back": 14, "future_days": 7, "batch_size": 64, "epochs": 100, "learning_rate": 0.001 } } ``` - **参数说明**: - `product_id`: 产品ID - `model_type`: 模型类型,可选值:`mlstm`, `transformer`, `kan` - `parameters`: 训练参数(可选) - `look_back`: 回看天数,默认14 - `future_days`: 预测天数,默认7 - `batch_size`: 批大小,默认32 - `epochs`: 训练轮次,默认50 - `learning_rate`: 学习率,默认0.001 **响应示例**: ```json { "status": "success", "task_id": "train_P001_mlstm_20230615123456", "message": "模型训练任务已启动" } ``` ### 5.2 查询训练任务状态 查询训练任务的状态。 - **URL**: `/training/{task_id}` - **方法**: `GET` - **URL参数**: - `task_id`: 任务ID,由启动训练任务时返回 **响应示例**: ```json { "status": "success", "data": { "task_id": "train_P001_mlstm_20230615123456", "product_id": "P001", "model_type": "mlstm", "status": "completed", "progress": 100, "created_at": "2023-06-15T12:34:56", "completed_at": "2023-06-15T12:45:23", "metrics": { "mse": 35.67, "rmse": 5.97, "mae": 4.21, "r2": 0.87 } } } ``` ## 6. 模型预测API ### 6.1 使用模型预测 使用指定的模型进行预测。 - **URL**: `/prediction` - **方法**: `POST` - **请求体**: ```json { "product_id": "P001", "model_type": "mlstm", "days": 7, "version": "latest" } ``` - **参数说明**: - `product_id`: 产品ID - `model_type`: 模型类型,可选值:`mlstm`, `transformer`, `kan` - `days`: 预测天数,默认7 - `version`: 模型版本,默认"latest" **响应示例**: ```json { "status": "success", "data": { "product_id": "P001", "product_name": "布洛芬片", "model_type": "mlstm", "version": "20230615123456", "prediction_dates": ["2023-07-01", "2023-07-02", "2023-07-03", "2023-07-04", "2023-07-05", "2023-07-06", "2023-07-07"], "predicted_sales": [125.4, 118.2, 130.1, 142.3, 138.7, 129.5, 145.2], "metrics": { "mse": 35.67, "rmse": 5.97, "mae": 4.21, "r2": 0.87 } } } ``` ### 6.2 比较不同模型预测结果 比较不同模型对同一产品的预测结果。 - **URL**: `/prediction/compare` - **方法**: `POST` - **请求体**: ```json { "product_id": "P001", "model_types": ["mlstm", "transformer", "kan"], "days": 7 } ``` - **参数说明**: - `product_id`: 产品ID - `model_types`: 要比较的模型类型列表 - `days`: 预测天数,默认7 **响应示例**: ```json { "status": "success", "data": { "product_id": "P001", "product_name": "布洛芬片", "prediction_dates": ["2023-07-01", "2023-07-02", "2023-07-03", "2023-07-04", "2023-07-05", "2023-07-06", "2023-07-07"], "predictions": { "mlstm": { "version": "20230615123456", "predicted_sales": [125.4, 118.2, 130.1, 142.3, 138.7, 129.5, 145.2], "metrics": { "mse": 35.67, "rmse": 5.97, "mae": 4.21, "r2": 0.87 } }, "transformer": { "version": "20230614152345", "predicted_sales": [127.8, 119.5, 132.3, 139.7, 141.2, 130.8, 143.1], "metrics": { "mse": 38.24, "rmse": 6.18, "mae": 4.35, "r2": 0.85 } }, "kan": { "version": "20230613110012", "predicted_sales": [124.1, 117.6, 128.9, 143.5, 139.2, 128.7, 146.3], "metrics": { "mse": 33.21, "rmse": 5.76, "mae": 4.12, "r2": 0.89 } } } } } ``` ## 7. 模型管理API ### 7.1 获取模型列表 获取系统中所有可用的模型。 - **URL**: `/models` - **方法**: `GET` - **查询参数**: - `product_id`: 按产品ID筛选(可选) - `model_type`: 按模型类型筛选(可选) **响应示例**: ```json { "status": "success", "data": [ { "product_id": "P001", "model_type": "mlstm", "version": "20230615123456", "created_at": "2023-06-15T12:45:23", "metrics": { "mse": 35.67, "rmse": 5.97, "mae": 4.21, "r2": 0.87 } }, { "product_id": "P001", "model_type": "transformer", "version": "20230614152345", "created_at": "2023-06-14T15:32:11", "metrics": { "mse": 38.24, "rmse": 6.18, "mae": 4.35, "r2": 0.85 } } ] } ``` ### 7.2 获取模型详情 获取特定模型的详细信息。 - **URL**: `/models/{product_id}/{model_type}` - **方法**: `GET` - **URL参数**: - `product_id`: 产品ID - `model_type`: 模型类型 - **查询参数**: - `version`: 模型版本(可选,默认为最新版本) **响应示例**: ```json { "status": "success", "data": { "product_id": "P001", "product_name": "布洛芬片", "model_type": "mlstm", "version": "20230615123456", "created_at": "2023-06-15T12:45:23", "file_size": "2.3 MB", "parameters": { "look_back": 14, "future_days": 7, "batch_size": 64, "epochs": 100, "learning_rate": 0.001 }, "metrics": { "mse": 35.67, "rmse": 5.97, "mae": 4.21, "r2": 0.87, "mape": 3.45 } } } ``` ### 7.3 删除模型 删除指定的模型。 - **URL**: `/models/{product_id}/{model_type}` - **方法**: `DELETE` - **URL参数**: - `product_id`: 产品ID - `model_type`: 模型类型 - **查询参数**: - `version`: 模型版本(可选,默认为最新版本) **响应示例**: ```json { "status": "success", "message": "模型已成功删除" } ``` ### 7.4 导出模型 导出指定的模型。 - **URL**: `/models/{product_id}/{model_type}/export` - **方法**: `GET` - **URL参数**: - `product_id`: 产品ID - `model_type`: 模型类型 - **查询参数**: - `version`: 模型版本(可选,默认为最新版本) **响应**: 文件下载(模型文件) ### 7.5 导入模型 导入模型文件。 - **URL**: `/models/import` - **方法**: `POST` - **内容类型**: `multipart/form-data` - **参数**: - `file`: 模型文件 - `overwrite`: 是否覆盖同名模型(可选,默认为false) **响应示例**: ```json { "status": "success", "message": "模型已成功导入", "data": { "product_id": "P001", "model_type": "mlstm", "version": "20230615123456" } } ``` ## 8. 系统信息API ### 8.1 获取系统状态 获取系统当前状态。 - **URL**: `/system/status` - **方法**: `GET` **响应示例**: ```json { "status": "success", "data": { "version": "1.0.0", "uptime": "3 days, 4 hours", "gpu_available": true, "models_count": 15, "products_count": 5, "system_load": { "cpu": "32%", "memory": "48%", "gpu": "15%" } } } ``` ### 8.2 获取正在进行的任务 获取当前正在进行的任务列表。 - **URL**: `/system/tasks` - **方法**: `GET` **响应示例**: ```json { "status": "success", "data": [ { "task_id": "train_P003_mlstm_20230618091234", "type": "training", "product_id": "P003", "model_type": "mlstm", "status": "in_progress", "progress": 65, "created_at": "2023-06-18T09:12:34" }, { "task_id": "predict_P002_kan_20230618093012", "type": "prediction", "product_id": "P002", "model_type": "kan", "status": "in_progress", "progress": 80, "created_at": "2023-06-18T09:30:12" } ] } ``` ## 9. API调用示例 ### 9.1 使用curl调用API #### 获取产品列表 ```bash curl -X GET "http://localhost:5000/api/products" ``` #### 获取特定产品销售数据 ```bash curl -X GET "http://localhost:5000/api/products/P001/sales?start_date=2023-01-01&end_date=2023-01-31" ``` #### 启动模型训练 ```bash curl -X POST "http://localhost:5000/api/training" \ -H "Content-Type: application/json" \ -d '{"product_id": "P001", "model_type": "mlstm", "parameters": {"epochs": 100}}' ``` #### 使用模型预测 ```bash curl -X POST "http://localhost:5000/api/prediction" \ -H "Content-Type: application/json" \ -d '{"product_id": "P001", "model_type": "mlstm", "days": 7}' ``` ### 9.2 使用Python requests库调用API ```python import requests import json # 基础URL base_url = "http://localhost:5000/api" # 获取产品列表 response = requests.get(f"{base_url}/products") products = response.json() print(json.dumps(products, indent=2)) # 启动模型训练 train_data = { "product_id": "P001", "model_type": "mlstm", "parameters": { "epochs": 100, "batch_size": 64 } } response = requests.post(f"{base_url}/training", json=train_data) result = response.json() print(json.dumps(result, indent=2)) # 使用模型预测 predict_data = { "product_id": "P001", "model_type": "mlstm", "days": 7 } response = requests.post(f"{base_url}/prediction", json=predict_data) predictions = response.json() print(json.dumps(predictions, indent=2)) ``` ## 10. 错误处理 所有API响应都包含`status`字段,用于表示请求是否成功。如果请求失败,将返回一个包含错误信息的响应: ```json { "status": "error", "error": { "code": "MODEL_NOT_FOUND", "message": "找不到指定的模型" } } ``` 常见错误代码: - `INVALID_PARAMETERS`: 请求参数无效 - `PRODUCT_NOT_FOUND`: 找不到指定的产品 - `MODEL_NOT_FOUND`: 找不到指定的模型 - `TASK_NOT_FOUND`: 找不到指定的任务 - `FILE_UPLOAD_ERROR`: 文件上传失败 - `TRAINING_ERROR`: 模型训练失败 - `PREDICTION_ERROR`: 模型预测失败 - `SYSTEM_ERROR`: 系统内部错误