time-series-model-transfer-function-analyzer


Nametime-series-model-transfer-function-analyzer JSON
Version 0.1.2 PyPI version JSON
download
home_pageNone
Summary时序模型传递函数分析器 - 自动推导ARIMA模型的传递函数表达式
upload_time2025-07-13 16:15:36
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords arima econometrics signal-processing time-series transfer-function
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [English](README_EN.md) | [中文](README.md)

# 时序模型传递函数分析器

[![Python Version](https://img.shields.io/badge/python-3.9+-blue.svg)](https://python.org)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
[![Tests](https://img.shields.io/badge/tests-passing-brightgreen.svg)](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[![Python Version](https://img.shields.io/badge/python-3.9+-blue.svg)](https://python.org)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Tests](https://img.shields.io/badge/tests-passing-brightgreen.svg)](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"
}
        
Elapsed time: 1.10572s