[English](README_EN.md) | [中文](README.md)
# 时序模型传递函数分析器
[](https://python.org)
[](LICENSE)
[](tests/)
一个用于自动推导时间序列模型传递函数的Python库。支持ARIMA和SARIMA模型的参数化输入和传递函数的符号推导。
## 🚀 核心功能
### 1. 模型参数化输入与解析
- 支持多种输入方式:命令行参数、配置文件(JSON/YAML)、交互式输入
- 自动验证模型参数的有效性
- 支持符号参数和数值参数
### 2. 传递函数自动推导与生成
- 基于符号计算自动推导传递函数表达式
- 将ARIMA/SARIMA模型转换为关于滞后算子B的多项式比值形式
- 支持LaTeX、纯文本、JSON等多种输出格式
### 3. 高级分析功能
- 稳定性分析(极点、零点计算)
- 脉冲响应函数计算
- 频率响应分析
- 系统特性评估
## 📦 安装
### 使用uv(推荐)
```bash
uv add time-series-model-transfer-function-analyzer
```
### 使用pip
```bash
pip install time-series-model-transfer-function-analyzer
```
### 从源码安装
```bash
git clone https://github.com/zym9863/time-series-model-transfer-function-analyzer.git
cd time-series-model-transfer-function-analyzer
uv sync
```
## 🎯 快速开始
### FastAPI Web服务
本项目提供了完整的FastAPI Web服务,支持通过HTTP API进行时间序列模型分析。
#### 启动服务
```bash
# 方法1:使用启动脚本
python scripts/start_api.py
# 方法2:直接使用uvicorn
uvicorn src.api.app:create_app --factory --host 0.0.0.0 --port 8000 --reload
# 方法3:使用便捷脚本
# Windows
scripts/start_api.bat
# Linux/macOS
chmod +x scripts/start_api.sh
./scripts/start_api.sh
```
#### 访问API文档
启动服务后,可以通过以下地址访问:
- **API文档 (Swagger UI)**: http://localhost:8000/docs
- **API文档 (ReDoc)**: http://localhost:8000/redoc
- **OpenAPI规范**: http://localhost:8000/openapi.json
- **健康检查**: http://localhost:8000/api/v1/health
#### API使用示例
**1. 健康检查**
```bash
curl -X GET "http://localhost:8000/api/v1/health"
```
**2. ARIMA模型分析**
```bash
curl -X POST "http://localhost:8000/api/v1/analyze/arima" \
-H "Content-Type: application/json" \
-d '{
"p": 2,
"d": 1,
"q": 1,
"ar_params": [0.5, -0.3],
"ma_params": [0.2],
"include_stability": true
}'
```
**3. 通过模型字符串分析**
```bash
curl -X POST "http://localhost:8000/api/v1/analyze/model-string" \
-H "Content-Type: application/json" \
-d '{
"model_string": "ARIMA(2,1,1)",
"include_stability": true,
"include_impulse": true
}'
```
**4. 获取支持的模型类型**
```bash
curl -X GET "http://localhost:8000/api/v1/models"
```
### 命令行工具
#### 基本用法
```bash
# 分析简单ARIMA模型
tsm-analyzer analyze -m "ARIMA(2,1,1)"
# 分析SARIMA模型并输出LaTeX格式
tsm-analyzer analyze -m "SARIMA(2,1,1)(1,1,1,12)" --format latex
# 从配置文件分析
tsm-analyzer analyze -f examples/arima_example.json --include-analysis
# 交互式输入
tsm-analyzer analyze --interactive
```
#### 高级分析
```bash
# 计算脉冲响应
tsm-analyzer impulse -m "ARIMA(2,1,1)" --max-lag 10
# 计算频率响应
tsm-analyzer frequency -m "ARIMA(2,1,1)" --frequencies "0,0.1,0.2,0.3,0.4,0.5"
# 稳定性分析
tsm-analyzer stability -m "ARIMA(2,1,1)"
```
### Python API
#### 基本使用
```python
from time_series_analyzer import TimeSeriesAnalyzer
# 创建分析器
analyzer = TimeSeriesAnalyzer()
# 创建ARIMA模型
model = analyzer.create_arima_model(
p=2, d=1, q=1,
ar_params=[0.5, -0.3],
ma_params=[0.2]
)
# 推导传递函数
transfer_func = analyzer.derive_transfer_function(model)
print(f"传递函数: {transfer_func}")
# 分析稳定性
stability = analyzer.analyze_stability(model)
print(f"系统稳定性: {stability['is_stable']}")
```
#### 便捷函数
```python
from time_series_analyzer import analyze_arima, parse_and_analyze
# 快速分析ARIMA模型
result = analyze_arima(
p=2, d=1, q=1,
ar_params=[0.5, -0.3],
ma_params=[0.2],
include_stability=True,
include_impulse=True
)
# 从字符串解析并分析
result = parse_and_analyze(
"SARIMA(2,1,1)(1,1,1,12)",
include_stability=True
)
```
## 📋 支持的模型
### ARIMA模型
- **ARIMA(p,d,q)**: 自回归积分移动平均模型
- 支持任意阶数的AR、I、MA部分
- 自动处理差分操作
### SARIMA模型
- **SARIMA(p,d,q)(P,D,Q,m)**: 季节性ARIMA模型
- 支持季节性和非季节性参数
- 灵活的季节性周期设置
## 🔧 配置文件格式
### JSON格式
```json
{
"model_type": "ARIMA",
"p": 2,
"d": 1,
"q": 1,
"ar_params": [0.5, -0.3],
"ma_params": [0.2],
"constant": 0
}
```
### YAML格式
```yaml
model_type: SARIMA
p: 2
d: 1
q: 1
P: 1
D: 1
Q: 1
m: 12
ar_params: [0.5, -0.3]
ma_params: [0.2]
seasonal_ar_params: [0.8]
seasonal_ma_params: [0.4]
```
## 📊 输出格式
### LaTeX数学表达式
```latex
\section{ARIMA(2,1,1) 模型分析}
\subsection{传递函数}
$H(B) = \frac{1 + 0.2B}{(1 - 0.5B + 0.3B^2)(1-B)}$
```
### 纯文本格式
```
==================================================
ARIMA(2,1,1) 模型分析
==================================================
传递函数:
------------------------------
H(B) = (1 + 0.2*B) / ((1 - 0.5*B + 0.3*B**2)*(1 - B))
稳定性分析:
------------------------------
系统稳定性: 稳定
最大极点模长: 0.8660
```
### JSON结构化数据
```json
{
"timestamp": "2024-01-01T12:00:00",
"model": {
"model_type": "ARIMA",
"parameters": {"p": 2, "d": 1, "q": 1}
},
"transfer_function": {
"numerator": "1 + 0.2*B",
"denominator": "(1 - 0.5*B + 0.3*B**2)*(1 - B)",
"poles": [{"real": 0.5, "imag": 0.866}],
"zeros": [{"real": -5.0, "imag": 0.0}]
}
}
```
## 🧮 数学原理
### ARIMA模型的传递函数
对于ARIMA(p,d,q)模型:
```
φ(B)(1-B)^d X_t = θ(B)ε_t
```
其传递函数为:
```
H(B) = θ(B) / [φ(B)(1-B)^d]
```
其中:
- φ(B) = 1 - φ₁B - φ₂B² - ... - φₚBᵖ (自回归多项式)
- θ(B) = 1 + θ₁B + θ₂B² + ... + θₑBᵠ (移动平均多项式)
- (1-B)^d 是差分算子
### SARIMA模型的传递函数
对于SARIMA(p,d,q)(P,D,Q,m)模型:
```
φ(B)Φ(B^m)(1-B)^d(1-B^m)^D X_t = θ(B)Θ(B^m)ε_t
```
其传递函数为:
```
H(B) = θ(B)Θ(B^m) / [φ(B)Φ(B^m)(1-B)^d(1-B^m)^D]
```
## 🔍 示例分析
### 示例1:ARIMA(1,1,1)模型
```python
from time_series_analyzer import parse_and_analyze
# 分析ARIMA(1,1,1)模型
result = parse_and_analyze(
"ARIMA(1,1,1)",
include_stability=True,
include_impulse=True,
max_lag=10
)
print("模型信息:")
print(f" 类型: {result['model']['model_type']}")
print(f" 参数: p={result['model']['parameters']['p']}, "
f"d={result['model']['parameters']['d']}, "
f"q={result['model']['parameters']['q']}")
print("\n传递函数:")
print(f" 分子: {result['transfer_function']['numerator']}")
print(f" 分母: {result['transfer_function']['denominator']}")
print(f"\n稳定性: {'稳定' if result['stability']['is_stable'] else '不稳定'}")
```
### 示例2:季节性模型分析
```python
from time_series_analyzer import TimeSeriesAnalyzer
analyzer = TimeSeriesAnalyzer()
# 创建SARIMA模型
model = analyzer.create_sarima_model(
p=1, d=1, q=1, # 非季节性部分
P=1, D=1, Q=1, m=12, # 季节性部分(月度数据)
ar_params=[0.7],
ma_params=[0.3],
seasonal_ar_params=[0.5],
seasonal_ma_params=[0.2]
)
# 生成完整报告
report = analyzer.generate_report(
model,
format='text',
include_analysis=True
)
print(report)
```
## 🛠️ 开发
### 环境设置
```bash
# 克隆仓库
git clone https://github.com/zym9863/time-series-model-transfer-function-analyzer.git
cd time-series-model-transfer-function-analyzer
# 安装开发依赖
uv sync --dev
# 运行测试
uv run pytest
# 代码格式化
uv run black src tests
uv run isort src tests
# 类型检查
uv run mypy src
```
### 项目结构
```
time-series-model-transfer-function-analyzer/
├── src/
│ ├── time_series_analyzer/ # 核心分析库
│ │ ├── __init__.py # 主要API导出
│ │ ├── models.py # ARIMA/SARIMA模型定义
│ │ ├── transfer_function.py # 传递函数推导引擎
│ │ ├── parsers.py # 输入解析器
│ │ ├── formatters.py # 输出格式化器
│ │ ├── api.py # 高级API接口
│ │ └── cli.py # 命令行工具
│ └── api/ # FastAPI Web服务
│ ├── __init__.py
│ ├── app.py # FastAPI应用主文件
│ ├── config.py # 配置管理
│ ├── middleware.py # 中间件
│ ├── schemas.py # 请求/响应模型
│ └── routers/ # API路由
│ ├── __init__.py
│ ├── analysis.py # 分析服务路由
│ ├── health.py # 健康检查路由
│ └── models.py # 模型管理路由
├── scripts/ # 启动脚本
│ ├── start_api.py # Python启动脚本
│ ├── start_api.bat # Windows批处理脚本
│ └── start_api.sh # Linux/macOS脚本
├── tests/ # 测试套件
├── examples/ # 示例配置文件
├── docs/ # 文档
└── pyproject.toml # 项目配置
```
## 📚 API参考
### 核心类
#### `TimeSeriesAnalyzer`
主要的分析器类,提供所有分析功能。
**方法:**
- `create_arima_model()` - 创建ARIMA模型
- `create_sarima_model()` - 创建SARIMA模型
- `derive_transfer_function()` - 推导传递函数
- `analyze_stability()` - 稳定性分析
- `compute_impulse_response()` - 计算脉冲响应
- `compute_frequency_response()` - 计算频率响应
- `generate_report()` - 生成分析报告
#### `ARIMAModel` / `SeasonalARIMAModel`
模型数据类,使用Pydantic进行验证。
#### `TransferFunction`
传递函数表示类,包含分子、分母多项式和分析方法。
### 便捷函数
- `analyze_arima()` - 快速分析ARIMA模型
- `analyze_sarima()` - 快速分析SARIMA模型
- `parse_and_analyze()` - 从字符串解析并分析
### FastAPI端点
#### 健康检查
- `GET /api/v1/health` - 服务健康检查
#### 模型管理
- `GET /api/v1/models` - 获取支持的模型类型
- `GET /api/v1/models/validate/{model_string}` - 验证模型字符串
#### 分析服务
- `POST /api/v1/analyze/arima` - 分析ARIMA模型
- `POST /api/v1/analyze/sarima` - 分析SARIMA模型
- `POST /api/v1/analyze/model-string` - 通过模型字符串分析
- `GET /api/v1/analyze/transfer-function/{model_string}` - 仅获取传递函数
- `GET /api/v1/analyze/stability/{model_string}` - 仅获取稳定性分析
#### 请求/响应格式
所有API端点都使用JSON格式进行数据交换。详细的请求和响应格式请参考:
- **Swagger UI文档**: http://localhost:8000/docs
- **ReDoc文档**: http://localhost:8000/redoc
## 🤝 贡献
欢迎贡献代码!请遵循以下步骤:
1. Fork 项目
2. 创建特性分支 (`git checkout -b feature/amazing-feature`)
3. 提交更改 (`git commit -m 'Add amazing feature'`)
4. 推送到分支 (`git push origin feature/amazing-feature`)
5. 开启 Pull Request
### 贡献指南
- 确保所有测试通过
- 添加适当的测试覆盖
- 遵循代码风格指南
- 更新相关文档
## 📄 许可证
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
## 🙏 致谢
- [SymPy](https://www.sympy.org/) - 符号数学计算
- [Pydantic](https://pydantic-docs.helpmanual.io/) - 数据验证
- [Click](https://click.palletsprojects.com/) - 命令行界面
- [Rich](https://rich.readthedocs.io/) - 终端美化
## 📞 联系方式
- 项目主页: https://github.com/zym9863/time-series-model-transfer-function-analyzer
- 问题反馈: https://github.com/zym9863/time-series-model-transfer-function-analyzer/issues
---
**注意**: 这是一个学术研究工具,主要用于教学和研究目的。在生产环境中使用前请充分测试。
Raw data
{
"_id": null,
"home_page": null,
"name": "time-series-model-transfer-function-analyzer",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "arima, econometrics, signal-processing, time-series, transfer-function",
"author": null,
"author_email": "zym <ym214413520@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/14/b1/540c5d5003f0e4ee8a24342e22681c2c5758a864d7f593585e67ee179521/time_series_model_transfer_function_analyzer-0.1.2.tar.gz",
"platform": null,
"description": "[English](README_EN.md) | [\u4e2d\u6587](README.md)\n\n# \u65f6\u5e8f\u6a21\u578b\u4f20\u9012\u51fd\u6570\u5206\u6790\u5668\n\n[](https://python.org)\n[](LICENSE)\n[](tests/)\n\n\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u63a8\u5bfc\u65f6\u95f4\u5e8f\u5217\u6a21\u578b\u4f20\u9012\u51fd\u6570\u7684Python\u5e93\u3002\u652f\u6301ARIMA\u548cSARIMA\u6a21\u578b\u7684\u53c2\u6570\u5316\u8f93\u5165\u548c\u4f20\u9012\u51fd\u6570\u7684\u7b26\u53f7\u63a8\u5bfc\u3002\n\n## \ud83d\ude80 \u6838\u5fc3\u529f\u80fd\n\n### 1. \u6a21\u578b\u53c2\u6570\u5316\u8f93\u5165\u4e0e\u89e3\u6790\n- \u652f\u6301\u591a\u79cd\u8f93\u5165\u65b9\u5f0f\uff1a\u547d\u4ee4\u884c\u53c2\u6570\u3001\u914d\u7f6e\u6587\u4ef6\uff08JSON/YAML\uff09\u3001\u4ea4\u4e92\u5f0f\u8f93\u5165\n- \u81ea\u52a8\u9a8c\u8bc1\u6a21\u578b\u53c2\u6570\u7684\u6709\u6548\u6027\n- \u652f\u6301\u7b26\u53f7\u53c2\u6570\u548c\u6570\u503c\u53c2\u6570\n\n### 2. \u4f20\u9012\u51fd\u6570\u81ea\u52a8\u63a8\u5bfc\u4e0e\u751f\u6210\n- \u57fa\u4e8e\u7b26\u53f7\u8ba1\u7b97\u81ea\u52a8\u63a8\u5bfc\u4f20\u9012\u51fd\u6570\u8868\u8fbe\u5f0f\n- \u5c06ARIMA/SARIMA\u6a21\u578b\u8f6c\u6362\u4e3a\u5173\u4e8e\u6ede\u540e\u7b97\u5b50B\u7684\u591a\u9879\u5f0f\u6bd4\u503c\u5f62\u5f0f\n- \u652f\u6301LaTeX\u3001\u7eaf\u6587\u672c\u3001JSON\u7b49\u591a\u79cd\u8f93\u51fa\u683c\u5f0f\n\n### 3. \u9ad8\u7ea7\u5206\u6790\u529f\u80fd\n- \u7a33\u5b9a\u6027\u5206\u6790\uff08\u6781\u70b9\u3001\u96f6\u70b9\u8ba1\u7b97\uff09\n- \u8109\u51b2\u54cd\u5e94\u51fd\u6570\u8ba1\u7b97\n- \u9891\u7387\u54cd\u5e94\u5206\u6790\n- \u7cfb\u7edf\u7279\u6027\u8bc4\u4f30\n\n## \ud83d\udce6 \u5b89\u88c5\n\n### \u4f7f\u7528uv\uff08\u63a8\u8350\uff09\n```bash\nuv add time-series-model-transfer-function-analyzer\n```\n\n### \u4f7f\u7528pip\n```bash\npip install time-series-model-transfer-function-analyzer\n```\n\n### \u4ece\u6e90\u7801\u5b89\u88c5\n```bash\ngit clone https://github.com/zym9863/time-series-model-transfer-function-analyzer.git\ncd time-series-model-transfer-function-analyzer\nuv sync\n```\n\n## \ud83c\udfaf \u5feb\u901f\u5f00\u59cb\n\n### FastAPI Web\u670d\u52a1\n\n\u672c\u9879\u76ee\u63d0\u4f9b\u4e86\u5b8c\u6574\u7684FastAPI Web\u670d\u52a1\uff0c\u652f\u6301\u901a\u8fc7HTTP API\u8fdb\u884c\u65f6\u95f4\u5e8f\u5217\u6a21\u578b\u5206\u6790\u3002\n\n#### \u542f\u52a8\u670d\u52a1\n\n```bash\n# \u65b9\u6cd51\uff1a\u4f7f\u7528\u542f\u52a8\u811a\u672c\npython scripts/start_api.py\n\n# \u65b9\u6cd52\uff1a\u76f4\u63a5\u4f7f\u7528uvicorn\nuvicorn src.api.app:create_app --factory --host 0.0.0.0 --port 8000 --reload\n\n# \u65b9\u6cd53\uff1a\u4f7f\u7528\u4fbf\u6377\u811a\u672c\n# Windows\nscripts/start_api.bat\n\n# Linux/macOS\nchmod +x scripts/start_api.sh\n./scripts/start_api.sh\n```\n\n#### \u8bbf\u95eeAPI\u6587\u6863\n\n\u542f\u52a8\u670d\u52a1\u540e\uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u5730\u5740\u8bbf\u95ee\uff1a\n\n- **API\u6587\u6863 (Swagger UI)**: http://localhost:8000/docs\n- **API\u6587\u6863 (ReDoc)**: http://localhost:8000/redoc\n- **OpenAPI\u89c4\u8303**: http://localhost:8000/openapi.json\n- **\u5065\u5eb7\u68c0\u67e5**: http://localhost:8000/api/v1/health\n\n#### API\u4f7f\u7528\u793a\u4f8b\n\n**1. \u5065\u5eb7\u68c0\u67e5**\n```bash\ncurl -X GET \"http://localhost:8000/api/v1/health\"\n```\n\n**2. ARIMA\u6a21\u578b\u5206\u6790**\n```bash\ncurl -X POST \"http://localhost:8000/api/v1/analyze/arima\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"p\": 2,\n \"d\": 1,\n \"q\": 1,\n \"ar_params\": [0.5, -0.3],\n \"ma_params\": [0.2],\n \"include_stability\": true\n }'\n```\n\n**3. \u901a\u8fc7\u6a21\u578b\u5b57\u7b26\u4e32\u5206\u6790**\n```bash\ncurl -X POST \"http://localhost:8000/api/v1/analyze/model-string\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model_string\": \"ARIMA(2,1,1)\",\n \"include_stability\": true,\n \"include_impulse\": true\n }'\n```\n\n**4. \u83b7\u53d6\u652f\u6301\u7684\u6a21\u578b\u7c7b\u578b**\n```bash\ncurl -X GET \"http://localhost:8000/api/v1/models\"\n```\n\n### \u547d\u4ee4\u884c\u5de5\u5177\n\n#### \u57fa\u672c\u7528\u6cd5\n```bash\n# \u5206\u6790\u7b80\u5355ARIMA\u6a21\u578b\ntsm-analyzer analyze -m \"ARIMA(2,1,1)\"\n\n# \u5206\u6790SARIMA\u6a21\u578b\u5e76\u8f93\u51faLaTeX\u683c\u5f0f\ntsm-analyzer analyze -m \"SARIMA(2,1,1)(1,1,1,12)\" --format latex\n\n# \u4ece\u914d\u7f6e\u6587\u4ef6\u5206\u6790\ntsm-analyzer analyze -f examples/arima_example.json --include-analysis\n\n# \u4ea4\u4e92\u5f0f\u8f93\u5165\ntsm-analyzer analyze --interactive\n```\n\n#### \u9ad8\u7ea7\u5206\u6790\n```bash\n# \u8ba1\u7b97\u8109\u51b2\u54cd\u5e94\ntsm-analyzer impulse -m \"ARIMA(2,1,1)\" --max-lag 10\n\n# \u8ba1\u7b97\u9891\u7387\u54cd\u5e94\ntsm-analyzer frequency -m \"ARIMA(2,1,1)\" --frequencies \"0,0.1,0.2,0.3,0.4,0.5\"\n\n# \u7a33\u5b9a\u6027\u5206\u6790\ntsm-analyzer stability -m \"ARIMA(2,1,1)\"\n```\n\n### Python API\n\n#### \u57fa\u672c\u4f7f\u7528\n```python\nfrom time_series_analyzer import TimeSeriesAnalyzer\n\n# \u521b\u5efa\u5206\u6790\u5668\nanalyzer = TimeSeriesAnalyzer()\n\n# \u521b\u5efaARIMA\u6a21\u578b\nmodel = analyzer.create_arima_model(\n p=2, d=1, q=1,\n ar_params=[0.5, -0.3],\n ma_params=[0.2]\n)\n\n# \u63a8\u5bfc\u4f20\u9012\u51fd\u6570\ntransfer_func = analyzer.derive_transfer_function(model)\nprint(f\"\u4f20\u9012\u51fd\u6570: {transfer_func}\")\n\n# \u5206\u6790\u7a33\u5b9a\u6027\nstability = analyzer.analyze_stability(model)\nprint(f\"\u7cfb\u7edf\u7a33\u5b9a\u6027: {stability['is_stable']}\")\n```\n\n#### \u4fbf\u6377\u51fd\u6570\n```python\nfrom time_series_analyzer import analyze_arima, parse_and_analyze\n\n# \u5feb\u901f\u5206\u6790ARIMA\u6a21\u578b\nresult = analyze_arima(\n p=2, d=1, q=1,\n ar_params=[0.5, -0.3],\n ma_params=[0.2],\n include_stability=True,\n include_impulse=True\n)\n\n# \u4ece\u5b57\u7b26\u4e32\u89e3\u6790\u5e76\u5206\u6790\nresult = parse_and_analyze(\n \"SARIMA(2,1,1)(1,1,1,12)\",\n include_stability=True\n)\n```\n\n## \ud83d\udccb \u652f\u6301\u7684\u6a21\u578b\n\n### ARIMA\u6a21\u578b\n- **ARIMA(p,d,q)**: \u81ea\u56de\u5f52\u79ef\u5206\u79fb\u52a8\u5e73\u5747\u6a21\u578b\n- \u652f\u6301\u4efb\u610f\u9636\u6570\u7684AR\u3001I\u3001MA\u90e8\u5206\n- \u81ea\u52a8\u5904\u7406\u5dee\u5206\u64cd\u4f5c\n\n### SARIMA\u6a21\u578b\n- **SARIMA(p,d,q)(P,D,Q,m)**: \u5b63\u8282\u6027ARIMA\u6a21\u578b\n- \u652f\u6301\u5b63\u8282\u6027\u548c\u975e\u5b63\u8282\u6027\u53c2\u6570\n- \u7075\u6d3b\u7684\u5b63\u8282\u6027\u5468\u671f\u8bbe\u7f6e\n\n## \ud83d\udd27 \u914d\u7f6e\u6587\u4ef6\u683c\u5f0f\n\n### JSON\u683c\u5f0f\n```json\n{\n \"model_type\": \"ARIMA\",\n \"p\": 2,\n \"d\": 1,\n \"q\": 1,\n \"ar_params\": [0.5, -0.3],\n \"ma_params\": [0.2],\n \"constant\": 0\n}\n```\n\n### YAML\u683c\u5f0f\n```yaml\nmodel_type: SARIMA\np: 2\nd: 1\nq: 1\nP: 1\nD: 1\nQ: 1\nm: 12\nar_params: [0.5, -0.3]\nma_params: [0.2]\nseasonal_ar_params: [0.8]\nseasonal_ma_params: [0.4]\n```\n\n## \ud83d\udcca \u8f93\u51fa\u683c\u5f0f\n\n### LaTeX\u6570\u5b66\u8868\u8fbe\u5f0f\n```latex\n\\section{ARIMA(2,1,1) \u6a21\u578b\u5206\u6790}\n\n\\subsection{\u4f20\u9012\u51fd\u6570}\n$H(B) = \\frac{1 + 0.2B}{(1 - 0.5B + 0.3B^2)(1-B)}$\n```\n\n### \u7eaf\u6587\u672c\u683c\u5f0f\n```\n==================================================\nARIMA(2,1,1) \u6a21\u578b\u5206\u6790\n==================================================\n\n\u4f20\u9012\u51fd\u6570:\n------------------------------\nH(B) = (1 + 0.2*B) / ((1 - 0.5*B + 0.3*B**2)*(1 - B))\n\n\u7a33\u5b9a\u6027\u5206\u6790:\n------------------------------\n\u7cfb\u7edf\u7a33\u5b9a\u6027: \u7a33\u5b9a\n\u6700\u5927\u6781\u70b9\u6a21\u957f: 0.8660\n```\n\n### JSON\u7ed3\u6784\u5316\u6570\u636e\n```json\n{\n \"timestamp\": \"2024-01-01T12:00:00\",\n \"model\": {\n \"model_type\": \"ARIMA\",\n \"parameters\": {\"p\": 2, \"d\": 1, \"q\": 1}\n },\n \"transfer_function\": {\n \"numerator\": \"1 + 0.2*B\",\n \"denominator\": \"(1 - 0.5*B + 0.3*B**2)*(1 - B)\",\n \"poles\": [{\"real\": 0.5, \"imag\": 0.866}],\n \"zeros\": [{\"real\": -5.0, \"imag\": 0.0}]\n }\n}\n```\n\n## \ud83e\uddee \u6570\u5b66\u539f\u7406\n\n### ARIMA\u6a21\u578b\u7684\u4f20\u9012\u51fd\u6570\n\n\u5bf9\u4e8eARIMA(p,d,q)\u6a21\u578b\uff1a\n```\n\u03c6(B)(1-B)^d X_t = \u03b8(B)\u03b5_t\n```\n\n\u5176\u4f20\u9012\u51fd\u6570\u4e3a\uff1a\n```\nH(B) = \u03b8(B) / [\u03c6(B)(1-B)^d]\n```\n\n\u5176\u4e2d\uff1a\n- \u03c6(B) = 1 - \u03c6\u2081B - \u03c6\u2082B\u00b2 - ... - \u03c6\u209aB\u1d56 (\u81ea\u56de\u5f52\u591a\u9879\u5f0f)\n- \u03b8(B) = 1 + \u03b8\u2081B + \u03b8\u2082B\u00b2 + ... + \u03b8\u2091B\u1d60 (\u79fb\u52a8\u5e73\u5747\u591a\u9879\u5f0f)\n- (1-B)^d \u662f\u5dee\u5206\u7b97\u5b50\n\n### SARIMA\u6a21\u578b\u7684\u4f20\u9012\u51fd\u6570\n\n\u5bf9\u4e8eSARIMA(p,d,q)(P,D,Q,m)\u6a21\u578b\uff1a\n```\n\u03c6(B)\u03a6(B^m)(1-B)^d(1-B^m)^D X_t = \u03b8(B)\u0398(B^m)\u03b5_t\n```\n\n\u5176\u4f20\u9012\u51fd\u6570\u4e3a\uff1a\n```\nH(B) = \u03b8(B)\u0398(B^m) / [\u03c6(B)\u03a6(B^m)(1-B)^d(1-B^m)^D]\n```\n\n## \ud83d\udd0d \u793a\u4f8b\u5206\u6790\n\n### \u793a\u4f8b1\uff1aARIMA(1,1,1)\u6a21\u578b\n\n```python\nfrom time_series_analyzer import parse_and_analyze\n\n# \u5206\u6790ARIMA(1,1,1)\u6a21\u578b\nresult = parse_and_analyze(\n \"ARIMA(1,1,1)\",\n include_stability=True,\n include_impulse=True,\n max_lag=10\n)\n\nprint(\"\u6a21\u578b\u4fe1\u606f:\")\nprint(f\" \u7c7b\u578b: {result['model']['model_type']}\")\nprint(f\" \u53c2\u6570: p={result['model']['parameters']['p']}, \"\n f\"d={result['model']['parameters']['d']}, \"\n f\"q={result['model']['parameters']['q']}\")\n\nprint(\"\\n\u4f20\u9012\u51fd\u6570:\")\nprint(f\" \u5206\u5b50: {result['transfer_function']['numerator']}\")\nprint(f\" \u5206\u6bcd: {result['transfer_function']['denominator']}\")\n\nprint(f\"\\n\u7a33\u5b9a\u6027: {'\u7a33\u5b9a' if result['stability']['is_stable'] else '\u4e0d\u7a33\u5b9a'}\")\n```\n\n### \u793a\u4f8b2\uff1a\u5b63\u8282\u6027\u6a21\u578b\u5206\u6790\n\n```python\nfrom time_series_analyzer import TimeSeriesAnalyzer\n\nanalyzer = TimeSeriesAnalyzer()\n\n# \u521b\u5efaSARIMA\u6a21\u578b\nmodel = analyzer.create_sarima_model(\n p=1, d=1, q=1, # \u975e\u5b63\u8282\u6027\u90e8\u5206\n P=1, D=1, Q=1, m=12, # \u5b63\u8282\u6027\u90e8\u5206\uff08\u6708\u5ea6\u6570\u636e\uff09\n ar_params=[0.7],\n ma_params=[0.3],\n seasonal_ar_params=[0.5],\n seasonal_ma_params=[0.2]\n)\n\n# \u751f\u6210\u5b8c\u6574\u62a5\u544a\nreport = analyzer.generate_report(\n model,\n format='text',\n include_analysis=True\n)\n\nprint(report)\n```\n\n## \ud83d\udee0\ufe0f \u5f00\u53d1\n\n### \u73af\u5883\u8bbe\u7f6e\n```bash\n# \u514b\u9686\u4ed3\u5e93\ngit clone https://github.com/zym9863/time-series-model-transfer-function-analyzer.git\ncd time-series-model-transfer-function-analyzer\n\n# \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\nuv sync --dev\n\n# \u8fd0\u884c\u6d4b\u8bd5\nuv run pytest\n\n# \u4ee3\u7801\u683c\u5f0f\u5316\nuv run black src tests\nuv run isort src tests\n\n# \u7c7b\u578b\u68c0\u67e5\nuv run mypy src\n```\n\n### \u9879\u76ee\u7ed3\u6784\n```\ntime-series-model-transfer-function-analyzer/\n\u251c\u2500\u2500 src/\n\u2502 \u251c\u2500\u2500 time_series_analyzer/ # \u6838\u5fc3\u5206\u6790\u5e93\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py # \u4e3b\u8981API\u5bfc\u51fa\n\u2502 \u2502 \u251c\u2500\u2500 models.py # ARIMA/SARIMA\u6a21\u578b\u5b9a\u4e49\n\u2502 \u2502 \u251c\u2500\u2500 transfer_function.py # \u4f20\u9012\u51fd\u6570\u63a8\u5bfc\u5f15\u64ce\n\u2502 \u2502 \u251c\u2500\u2500 parsers.py # \u8f93\u5165\u89e3\u6790\u5668\n\u2502 \u2502 \u251c\u2500\u2500 formatters.py # \u8f93\u51fa\u683c\u5f0f\u5316\u5668\n\u2502 \u2502 \u251c\u2500\u2500 api.py # \u9ad8\u7ea7API\u63a5\u53e3\n\u2502 \u2502 \u2514\u2500\u2500 cli.py # \u547d\u4ee4\u884c\u5de5\u5177\n\u2502 \u2514\u2500\u2500 api/ # FastAPI Web\u670d\u52a1\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 app.py # FastAPI\u5e94\u7528\u4e3b\u6587\u4ef6\n\u2502 \u251c\u2500\u2500 config.py # \u914d\u7f6e\u7ba1\u7406\n\u2502 \u251c\u2500\u2500 middleware.py # \u4e2d\u95f4\u4ef6\n\u2502 \u251c\u2500\u2500 schemas.py # \u8bf7\u6c42/\u54cd\u5e94\u6a21\u578b\n\u2502 \u2514\u2500\u2500 routers/ # API\u8def\u7531\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 analysis.py # \u5206\u6790\u670d\u52a1\u8def\u7531\n\u2502 \u251c\u2500\u2500 health.py # \u5065\u5eb7\u68c0\u67e5\u8def\u7531\n\u2502 \u2514\u2500\u2500 models.py # \u6a21\u578b\u7ba1\u7406\u8def\u7531\n\u251c\u2500\u2500 scripts/ # \u542f\u52a8\u811a\u672c\n\u2502 \u251c\u2500\u2500 start_api.py # Python\u542f\u52a8\u811a\u672c\n\u2502 \u251c\u2500\u2500 start_api.bat # Windows\u6279\u5904\u7406\u811a\u672c\n\u2502 \u2514\u2500\u2500 start_api.sh # Linux/macOS\u811a\u672c\n\u251c\u2500\u2500 tests/ # \u6d4b\u8bd5\u5957\u4ef6\n\u251c\u2500\u2500 examples/ # \u793a\u4f8b\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs/ # \u6587\u6863\n\u2514\u2500\u2500 pyproject.toml # \u9879\u76ee\u914d\u7f6e\n```\n\n## \ud83d\udcda API\u53c2\u8003\n\n### \u6838\u5fc3\u7c7b\n\n#### `TimeSeriesAnalyzer`\n\u4e3b\u8981\u7684\u5206\u6790\u5668\u7c7b\uff0c\u63d0\u4f9b\u6240\u6709\u5206\u6790\u529f\u80fd\u3002\n\n**\u65b9\u6cd5:**\n- `create_arima_model()` - \u521b\u5efaARIMA\u6a21\u578b\n- `create_sarima_model()` - \u521b\u5efaSARIMA\u6a21\u578b\n- `derive_transfer_function()` - \u63a8\u5bfc\u4f20\u9012\u51fd\u6570\n- `analyze_stability()` - \u7a33\u5b9a\u6027\u5206\u6790\n- `compute_impulse_response()` - \u8ba1\u7b97\u8109\u51b2\u54cd\u5e94\n- `compute_frequency_response()` - \u8ba1\u7b97\u9891\u7387\u54cd\u5e94\n- `generate_report()` - \u751f\u6210\u5206\u6790\u62a5\u544a\n\n#### `ARIMAModel` / `SeasonalARIMAModel`\n\u6a21\u578b\u6570\u636e\u7c7b\uff0c\u4f7f\u7528Pydantic\u8fdb\u884c\u9a8c\u8bc1\u3002\n\n#### `TransferFunction`\n\u4f20\u9012\u51fd\u6570\u8868\u793a\u7c7b\uff0c\u5305\u542b\u5206\u5b50\u3001\u5206\u6bcd\u591a\u9879\u5f0f\u548c\u5206\u6790\u65b9\u6cd5\u3002\n\n### \u4fbf\u6377\u51fd\u6570\n\n- `analyze_arima()` - \u5feb\u901f\u5206\u6790ARIMA\u6a21\u578b\n- `analyze_sarima()` - \u5feb\u901f\u5206\u6790SARIMA\u6a21\u578b\n- `parse_and_analyze()` - \u4ece\u5b57\u7b26\u4e32\u89e3\u6790\u5e76\u5206\u6790\n\n### FastAPI\u7aef\u70b9\n\n#### \u5065\u5eb7\u68c0\u67e5\n- `GET /api/v1/health` - \u670d\u52a1\u5065\u5eb7\u68c0\u67e5\n\n#### \u6a21\u578b\u7ba1\u7406\n- `GET /api/v1/models` - \u83b7\u53d6\u652f\u6301\u7684\u6a21\u578b\u7c7b\u578b\n- `GET /api/v1/models/validate/{model_string}` - \u9a8c\u8bc1\u6a21\u578b\u5b57\u7b26\u4e32\n\n#### \u5206\u6790\u670d\u52a1\n- `POST /api/v1/analyze/arima` - \u5206\u6790ARIMA\u6a21\u578b\n- `POST /api/v1/analyze/sarima` - \u5206\u6790SARIMA\u6a21\u578b\n- `POST /api/v1/analyze/model-string` - \u901a\u8fc7\u6a21\u578b\u5b57\u7b26\u4e32\u5206\u6790\n- `GET /api/v1/analyze/transfer-function/{model_string}` - \u4ec5\u83b7\u53d6\u4f20\u9012\u51fd\u6570\n- `GET /api/v1/analyze/stability/{model_string}` - \u4ec5\u83b7\u53d6\u7a33\u5b9a\u6027\u5206\u6790\n\n#### \u8bf7\u6c42/\u54cd\u5e94\u683c\u5f0f\n\n\u6240\u6709API\u7aef\u70b9\u90fd\u4f7f\u7528JSON\u683c\u5f0f\u8fdb\u884c\u6570\u636e\u4ea4\u6362\u3002\u8be6\u7ec6\u7684\u8bf7\u6c42\u548c\u54cd\u5e94\u683c\u5f0f\u8bf7\u53c2\u8003\uff1a\n- **Swagger UI\u6587\u6863**: http://localhost:8000/docs\n- **ReDoc\u6587\u6863**: http://localhost:8000/redoc\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u8d21\u732e\u4ee3\u7801\uff01\u8bf7\u9075\u5faa\u4ee5\u4e0b\u6b65\u9aa4\uff1a\n\n1. Fork \u9879\u76ee\n2. \u521b\u5efa\u7279\u6027\u5206\u652f (`git checkout -b feature/amazing-feature`)\n3. \u63d0\u4ea4\u66f4\u6539 (`git commit -m 'Add amazing feature'`)\n4. \u63a8\u9001\u5230\u5206\u652f (`git push origin feature/amazing-feature`)\n5. \u5f00\u542f Pull Request\n\n### \u8d21\u732e\u6307\u5357\n\n- \u786e\u4fdd\u6240\u6709\u6d4b\u8bd5\u901a\u8fc7\n- \u6dfb\u52a0\u9002\u5f53\u7684\u6d4b\u8bd5\u8986\u76d6\n- \u9075\u5faa\u4ee3\u7801\u98ce\u683c\u6307\u5357\n- \u66f4\u65b0\u76f8\u5173\u6587\u6863\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1 - \u67e5\u770b [LICENSE](LICENSE) \u6587\u4ef6\u4e86\u89e3\u8be6\u60c5\u3002\n\n## \ud83d\ude4f \u81f4\u8c22\n\n- [SymPy](https://www.sympy.org/) - \u7b26\u53f7\u6570\u5b66\u8ba1\u7b97\n- [Pydantic](https://pydantic-docs.helpmanual.io/) - \u6570\u636e\u9a8c\u8bc1\n- [Click](https://click.palletsprojects.com/) - \u547d\u4ee4\u884c\u754c\u9762\n- [Rich](https://rich.readthedocs.io/) - \u7ec8\u7aef\u7f8e\u5316\n\n## \ud83d\udcde \u8054\u7cfb\u65b9\u5f0f\n\n- \u9879\u76ee\u4e3b\u9875: https://github.com/zym9863/time-series-model-transfer-function-analyzer\n- \u95ee\u9898\u53cd\u9988: https://github.com/zym9863/time-series-model-transfer-function-analyzer/issues\n\n---\n\n**\u6ce8\u610f**: \u8fd9\u662f\u4e00\u4e2a\u5b66\u672f\u7814\u7a76\u5de5\u5177\uff0c\u4e3b\u8981\u7528\u4e8e\u6559\u5b66\u548c\u7814\u7a76\u76ee\u7684\u3002\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u4f7f\u7528\u524d\u8bf7\u5145\u5206\u6d4b\u8bd5\u3002",
"bugtrack_url": null,
"license": null,
"summary": "\u65f6\u5e8f\u6a21\u578b\u4f20\u9012\u51fd\u6570\u5206\u6790\u5668 - \u81ea\u52a8\u63a8\u5bfcARIMA\u6a21\u578b\u7684\u4f20\u9012\u51fd\u6570\u8868\u8fbe\u5f0f",
"version": "0.1.2",
"project_urls": {
"Homepage": "https://github.com/zym9863/time-series-model-transfer-function-analyzer",
"Issues": "https://github.com/zym9863/time-series-model-transfer-function-analyzer/issues",
"Repository": "https://github.com/zym9863/time-series-model-transfer-function-analyzer"
},
"split_keywords": [
"arima",
" econometrics",
" signal-processing",
" time-series",
" transfer-function"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "57ab1b82d69b3372008dba53480da927ed231a2b8203ff40780e93555f9945a0",
"md5": "5197356e701619bf5b4630d02bffa8cd",
"sha256": "d392ea9c3b365ad69855f83e244668abb11321141aabe1a86042d71f7a7fe20f"
},
"downloads": -1,
"filename": "time_series_model_transfer_function_analyzer-0.1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "5197356e701619bf5b4630d02bffa8cd",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 25998,
"upload_time": "2025-07-13T16:15:35",
"upload_time_iso_8601": "2025-07-13T16:15:35.344020Z",
"url": "https://files.pythonhosted.org/packages/57/ab/1b82d69b3372008dba53480da927ed231a2b8203ff40780e93555f9945a0/time_series_model_transfer_function_analyzer-0.1.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "14b1540c5d5003f0e4ee8a24342e22681c2c5758a864d7f593585e67ee179521",
"md5": "7056056a29612ccc53a931b020bbbef4",
"sha256": "734b01aa83535a95e3add68b3bf8e7dae70fed393773dc30677cade47594f3e8"
},
"downloads": -1,
"filename": "time_series_model_transfer_function_analyzer-0.1.2.tar.gz",
"has_sig": false,
"md5_digest": "7056056a29612ccc53a931b020bbbef4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 167190,
"upload_time": "2025-07-13T16:15:36",
"upload_time_iso_8601": "2025-07-13T16:15:36.808856Z",
"url": "https://files.pythonhosted.org/packages/14/b1/540c5d5003f0e4ee8a24342e22681c2c5758a864d7f593585e67ee179521/time_series_model_transfer_function_analyzer-0.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-13 16:15:36",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "zym9863",
"github_project": "time-series-model-transfer-function-analyzer",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "time-series-model-transfer-function-analyzer"
}