aigroup-econ-mcp 0.4.2__py3-none-any.whl → 1.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- .gitignore +253 -0
- PKG-INFO +710 -0
- README.md +672 -0
- __init__.py +14 -0
- aigroup_econ_mcp-1.4.3.dist-info/METADATA +710 -0
- aigroup_econ_mcp-1.4.3.dist-info/RECORD +92 -0
- aigroup_econ_mcp-1.4.3.dist-info/entry_points.txt +2 -0
- aigroup_econ_mcp-1.4.3.dist-info/licenses/LICENSE +21 -0
- cli.py +28 -0
- econometrics/README.md +18 -0
- econometrics/__init__.py +191 -0
- econometrics/advanced_methods/modern_computing_machine_learning/__init__.py +0 -0
- econometrics/basic_parametric_estimation/__init__.py +31 -0
- econometrics/basic_parametric_estimation/gmm/__init__.py +13 -0
- econometrics/basic_parametric_estimation/gmm/gmm_model.py +256 -0
- econometrics/basic_parametric_estimation/mle/__init__.py +13 -0
- econometrics/basic_parametric_estimation/mle/mle_model.py +241 -0
- econometrics/basic_parametric_estimation/ols/__init__.py +13 -0
- econometrics/basic_parametric_estimation/ols/ols_model.py +141 -0
- econometrics/causal_inference/causal_identification_strategy/__init__.py +0 -0
- econometrics/missing_data/missing_data_measurement_error/__init__.py +0 -0
- econometrics/model_specification_diagnostics_robust_inference/README.md +173 -0
- econometrics/model_specification_diagnostics_robust_inference/__init__.py +78 -0
- econometrics/model_specification_diagnostics_robust_inference/diagnostic_tests/__init__.py +20 -0
- econometrics/model_specification_diagnostics_robust_inference/diagnostic_tests/diagnostic_tests_model.py +149 -0
- econometrics/model_specification_diagnostics_robust_inference/generalized_least_squares/__init__.py +15 -0
- econometrics/model_specification_diagnostics_robust_inference/generalized_least_squares/gls_model.py +130 -0
- econometrics/model_specification_diagnostics_robust_inference/model_selection/__init__.py +18 -0
- econometrics/model_specification_diagnostics_robust_inference/model_selection/model_selection_model.py +286 -0
- econometrics/model_specification_diagnostics_robust_inference/regularization/__init__.py +15 -0
- econometrics/model_specification_diagnostics_robust_inference/regularization/regularization_model.py +177 -0
- econometrics/model_specification_diagnostics_robust_inference/robust_errors/__init__.py +15 -0
- econometrics/model_specification_diagnostics_robust_inference/robust_errors/robust_errors_model.py +122 -0
- econometrics/model_specification_diagnostics_robust_inference/simultaneous_equations/__init__.py +15 -0
- econometrics/model_specification_diagnostics_robust_inference/simultaneous_equations/simultaneous_equations_model.py +246 -0
- econometrics/model_specification_diagnostics_robust_inference/weighted_least_squares/__init__.py +15 -0
- econometrics/model_specification_diagnostics_robust_inference/weighted_least_squares/wls_model.py +127 -0
- econometrics/nonparametric/nonparametric_semiparametric_methods/__init__.py +0 -0
- econometrics/spatial_econometrics/spatial_econometrics_new/__init__.py +0 -0
- econometrics/specific_data_modeling/micro_discrete_limited_data/__init__.py +0 -0
- econometrics/specific_data_modeling/survival_duration_data/__init__.py +0 -0
- econometrics/specific_data_modeling/time_series_panel_data/__init__.py +143 -0
- econometrics/specific_data_modeling/time_series_panel_data/arima_model.py +104 -0
- econometrics/specific_data_modeling/time_series_panel_data/cointegration_vecm.py +334 -0
- econometrics/specific_data_modeling/time_series_panel_data/dynamic_panel_models.py +653 -0
- econometrics/specific_data_modeling/time_series_panel_data/exponential_smoothing.py +176 -0
- econometrics/specific_data_modeling/time_series_panel_data/garch_model.py +198 -0
- econometrics/specific_data_modeling/time_series_panel_data/panel_diagnostics.py +125 -0
- econometrics/specific_data_modeling/time_series_panel_data/panel_var.py +60 -0
- econometrics/specific_data_modeling/time_series_panel_data/structural_break_tests.py +87 -0
- econometrics/specific_data_modeling/time_series_panel_data/time_varying_parameter_models.py +106 -0
- econometrics/specific_data_modeling/time_series_panel_data/unit_root_tests.py +204 -0
- econometrics/specific_data_modeling/time_series_panel_data/var_svar_model.py +372 -0
- econometrics/statistical_inference/statistical_inference_techniques/__init__.py +0 -0
- econometrics/statistics/distribution_decomposition_methods/__init__.py +0 -0
- econometrics/tests/basic_parametric_estimation_tests/__init__.py +3 -0
- econometrics/tests/basic_parametric_estimation_tests/test_gmm.py +128 -0
- econometrics/tests/basic_parametric_estimation_tests/test_mle.py +127 -0
- econometrics/tests/basic_parametric_estimation_tests/test_ols.py +100 -0
- econometrics/tests/model_specification_diagnostics_tests/__init__.py +3 -0
- econometrics/tests/model_specification_diagnostics_tests/test_diagnostic_tests.py +86 -0
- econometrics/tests/model_specification_diagnostics_tests/test_robust_errors.py +89 -0
- econometrics/tests/specific_data_modeling_tests/__init__.py +3 -0
- econometrics/tests/specific_data_modeling_tests/test_arima.py +98 -0
- econometrics/tests/specific_data_modeling_tests/test_dynamic_panel.py +198 -0
- econometrics/tests/specific_data_modeling_tests/test_exponential_smoothing.py +105 -0
- econometrics/tests/specific_data_modeling_tests/test_garch.py +118 -0
- econometrics/tests/specific_data_modeling_tests/test_unit_root.py +156 -0
- econometrics/tests/specific_data_modeling_tests/test_var.py +124 -0
- prompts/__init__.py +0 -0
- prompts/analysis_guides.py +43 -0
- pyproject.toml +78 -0
- resources/MCP_MASTER_GUIDE.md +422 -0
- resources/MCP_TOOLS_DATA_FORMAT_GUIDE.md +185 -0
- resources/__init__.py +0 -0
- server.py +83 -0
- tools/README.md +88 -0
- tools/__init__.py +45 -0
- tools/data_loader.py +213 -0
- tools/decorators.py +38 -0
- tools/econometrics_adapter.py +286 -0
- tools/mcp_tool_groups/__init__.py +1 -0
- tools/mcp_tool_groups/basic_parametric_tools.py +173 -0
- tools/mcp_tool_groups/model_specification_tools.py +402 -0
- tools/mcp_tool_groups/time_series_tools.py +494 -0
- tools/mcp_tools_registry.py +114 -0
- tools/model_specification_adapter.py +369 -0
- tools/output_formatter.py +563 -0
- tools/time_series_panel_data_adapter.py +858 -0
- tools/time_series_panel_data_tools.py +65 -0
- aigroup_econ_mcp/__init__.py +0 -19
- aigroup_econ_mcp/cli.py +0 -82
- aigroup_econ_mcp/config.py +0 -561
- aigroup_econ_mcp/server.py +0 -452
- aigroup_econ_mcp/tools/__init__.py +0 -18
- aigroup_econ_mcp/tools/base.py +0 -470
- aigroup_econ_mcp/tools/cache.py +0 -533
- aigroup_econ_mcp/tools/data_loader.py +0 -171
- aigroup_econ_mcp/tools/file_parser.py +0 -829
- aigroup_econ_mcp/tools/machine_learning.py +0 -60
- aigroup_econ_mcp/tools/ml_ensemble.py +0 -210
- aigroup_econ_mcp/tools/ml_evaluation.py +0 -272
- aigroup_econ_mcp/tools/ml_models.py +0 -54
- aigroup_econ_mcp/tools/ml_regularization.py +0 -172
- aigroup_econ_mcp/tools/monitoring.py +0 -555
- aigroup_econ_mcp/tools/optimized_example.py +0 -229
- aigroup_econ_mcp/tools/panel_data.py +0 -553
- aigroup_econ_mcp/tools/regression.py +0 -214
- aigroup_econ_mcp/tools/statistics.py +0 -154
- aigroup_econ_mcp/tools/time_series.py +0 -667
- aigroup_econ_mcp/tools/timeout.py +0 -283
- aigroup_econ_mcp/tools/tool_handlers.py +0 -378
- aigroup_econ_mcp/tools/tool_registry.py +0 -170
- aigroup_econ_mcp/tools/validation.py +0 -482
- aigroup_econ_mcp-0.4.2.dist-info/METADATA +0 -360
- aigroup_econ_mcp-0.4.2.dist-info/RECORD +0 -29
- aigroup_econ_mcp-0.4.2.dist-info/entry_points.txt +0 -2
- /aigroup_econ_mcp-0.4.2.dist-info/licenses/LICENSE → /LICENSE +0 -0
- {aigroup_econ_mcp-0.4.2.dist-info → aigroup_econ_mcp-1.4.3.dist-info}/WHEEL +0 -0
aigroup_econ_mcp/server.py
DELETED
|
@@ -1,452 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
AIGroup 计量经济学 MCP 服务器 - 优化版
|
|
3
|
-
使用组件化架构,代码量减少80%,同时自动支持文件输入
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from typing import Dict, Any, Optional, List, Annotated
|
|
7
|
-
from collections.abc import AsyncIterator
|
|
8
|
-
from contextlib import asynccontextmanager
|
|
9
|
-
from dataclasses import dataclass
|
|
10
|
-
|
|
11
|
-
from pydantic import BaseModel, Field
|
|
12
|
-
from mcp.server.fastmcp import FastMCP, Context
|
|
13
|
-
from mcp.server.session import ServerSession
|
|
14
|
-
from mcp.types import CallToolResult, TextContent
|
|
15
|
-
|
|
16
|
-
# 导入工具处理器
|
|
17
|
-
from .tools.tool_handlers import (
|
|
18
|
-
handle_descriptive_statistics,
|
|
19
|
-
handle_ols_regression,
|
|
20
|
-
handle_hypothesis_testing,
|
|
21
|
-
handle_time_series_analysis,
|
|
22
|
-
handle_correlation_analysis,
|
|
23
|
-
handle_panel_fixed_effects,
|
|
24
|
-
handle_panel_random_effects,
|
|
25
|
-
handle_panel_hausman_test,
|
|
26
|
-
handle_panel_unit_root_test,
|
|
27
|
-
handle_var_model,
|
|
28
|
-
handle_vecm_model,
|
|
29
|
-
handle_garch_model,
|
|
30
|
-
handle_state_space_model,
|
|
31
|
-
handle_variance_decomposition,
|
|
32
|
-
handle_random_forest,
|
|
33
|
-
handle_gradient_boosting,
|
|
34
|
-
handle_lasso_regression,
|
|
35
|
-
handle_ridge_regression,
|
|
36
|
-
handle_cross_validation,
|
|
37
|
-
handle_feature_importance
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
# 导入装饰器
|
|
41
|
-
from .tools.base import with_file_support_decorator as econometric_tool
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
# 应用上下文
|
|
45
|
-
@dataclass
|
|
46
|
-
class AppContext:
|
|
47
|
-
"""应用上下文,包含共享资源"""
|
|
48
|
-
config: Dict[str, Any]
|
|
49
|
-
version: str = "0.2.0"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@asynccontextmanager
|
|
53
|
-
async def lifespan(server: FastMCP) -> AsyncIterator[AppContext]:
|
|
54
|
-
"""服务器生命周期管理"""
|
|
55
|
-
config = {
|
|
56
|
-
"max_sample_size": 10000,
|
|
57
|
-
"default_significance_level": 0.05,
|
|
58
|
-
"supported_tests": ["t_test", "f_test", "chi_square", "adf"],
|
|
59
|
-
"data_types": ["cross_section", "time_series", "panel"]
|
|
60
|
-
}
|
|
61
|
-
try:
|
|
62
|
-
yield AppContext(config=config, version="0.2.0")
|
|
63
|
-
finally:
|
|
64
|
-
pass
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
# 创建MCP服务器实例
|
|
68
|
-
mcp = FastMCP(
|
|
69
|
-
name="aigroup-econ-mcp",
|
|
70
|
-
instructions="Econometrics MCP Server - Provides data analysis with automatic file input support",
|
|
71
|
-
lifespan=lifespan
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
# ============================================================================
|
|
76
|
-
# 基础统计工具 (5个) - 自动支持文件输入
|
|
77
|
-
# ============================================================================
|
|
78
|
-
|
|
79
|
-
@mcp.tool()
|
|
80
|
-
@econometric_tool('multi_var_dict')
|
|
81
|
-
async def descriptive_statistics(
|
|
82
|
-
ctx: Context[ServerSession, AppContext],
|
|
83
|
-
file_path: Annotated[Optional[str], Field(default=None, description="CSV/JSON文件路径")] = None,
|
|
84
|
-
file_content: Annotated[Optional[str], Field(default=None, description="CSV/JSON文件内容")] = None,
|
|
85
|
-
file_format: Annotated[str, Field(default="auto", description="文件格式(csv/json/auto)")] = "auto",
|
|
86
|
-
data: Annotated[Optional[Dict[str, List[float]]], Field(default=None, description="数据字典(直接数据输入)")] = None
|
|
87
|
-
) -> CallToolResult:
|
|
88
|
-
"""
|
|
89
|
-
计算描述性统计量
|
|
90
|
-
|
|
91
|
-
支持三种输入方式(按优先级):
|
|
92
|
-
1. file_path: 文件路径 (如 "data.csv")
|
|
93
|
-
2. file_content: 文件内容字符串
|
|
94
|
-
3. data: 直接传入数据字典
|
|
95
|
-
"""
|
|
96
|
-
return await handle_descriptive_statistics(ctx, data=data)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
@mcp.tool()
|
|
100
|
-
@econometric_tool('regression')
|
|
101
|
-
async def ols_regression(
|
|
102
|
-
ctx: Context[ServerSession, AppContext],
|
|
103
|
-
file_path: Annotated[Optional[str], Field(default=None, description="CSV/JSON文件路径")] = None,
|
|
104
|
-
file_content: Annotated[Optional[str], Field(default=None, description="CSV/JSON文件内容")] = None,
|
|
105
|
-
file_format: Annotated[str, Field(default="auto", description="文件格式")] = "auto",
|
|
106
|
-
y_data: Annotated[Optional[List[float]], Field(default=None, description="因变量(直接输入)")] = None,
|
|
107
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None, description="自变量(直接输入)")] = None,
|
|
108
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None, description="特征名称")] = None
|
|
109
|
-
) -> CallToolResult:
|
|
110
|
-
"""
|
|
111
|
-
OLS回归分析
|
|
112
|
-
|
|
113
|
-
支持文件输入或直接数据输入。文件格式示例:
|
|
114
|
-
CSV: 最后一列为因变量,其余列为自变量
|
|
115
|
-
"""
|
|
116
|
-
return await handle_ols_regression(ctx, y_data=y_data, x_data=x_data, feature_names=feature_names)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
@mcp.tool()
|
|
120
|
-
@econometric_tool('single_var')
|
|
121
|
-
async def hypothesis_testing(
|
|
122
|
-
ctx: Context[ServerSession, AppContext],
|
|
123
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
124
|
-
file_content: Annotated[Optional[str], Field(default=None, description="文件内容")] = None,
|
|
125
|
-
file_format: Annotated[str, Field(default="auto", description="文件格式")] = "auto",
|
|
126
|
-
data: Annotated[Optional[List[float]], Field(default=None, description="第一组数据")] = None,
|
|
127
|
-
data2: Annotated[Optional[List[float]], Field(default=None, description="第二组数据")] = None,
|
|
128
|
-
test_type: Annotated[str, Field(default="t_test", description="检验类型(t_test/adf)")] = "t_test"
|
|
129
|
-
) -> CallToolResult:
|
|
130
|
-
"""假设检验 - 支持文件或直接数据输入"""
|
|
131
|
-
return await handle_hypothesis_testing(ctx, data1=data, data2=data2, test_type=test_type)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
@mcp.tool()
|
|
135
|
-
@econometric_tool('single_var')
|
|
136
|
-
async def time_series_analysis(
|
|
137
|
-
ctx: Context[ServerSession, AppContext],
|
|
138
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
139
|
-
file_content: Annotated[Optional[str], Field(default=None, description="文件内容")] = None,
|
|
140
|
-
file_format: Annotated[str, Field(default="auto", description="文件格式")] = "auto",
|
|
141
|
-
data: Annotated[Optional[List[float]], Field(default=None, description="时间序列数据")] = None
|
|
142
|
-
) -> CallToolResult:
|
|
143
|
-
"""时间序列分析 - 支持文件或直接数据输入"""
|
|
144
|
-
return await handle_time_series_analysis(ctx, data=data)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
@mcp.tool()
|
|
148
|
-
@econometric_tool('multi_var_dict')
|
|
149
|
-
async def correlation_analysis(
|
|
150
|
-
ctx: Context[ServerSession, AppContext],
|
|
151
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
152
|
-
file_content: Annotated[Optional[str], Field(default=None, description="文件内容")] = None,
|
|
153
|
-
file_format: Annotated[str, Field(default="auto", description="文件格式")] = "auto",
|
|
154
|
-
data: Annotated[Optional[Dict[str, List[float]]], Field(default=None, description="多变量数据")] = None,
|
|
155
|
-
method: Annotated[str, Field(default="pearson", description="相关系数类型")] = "pearson"
|
|
156
|
-
) -> CallToolResult:
|
|
157
|
-
"""相关性分析 - 支持文件或直接数据输入"""
|
|
158
|
-
return await handle_correlation_analysis(ctx, data=data, method=method)
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
# ============================================================================
|
|
162
|
-
# 面板数据工具 (4个) - 自动支持文件输入
|
|
163
|
-
# ============================================================================
|
|
164
|
-
|
|
165
|
-
@mcp.tool()
|
|
166
|
-
@econometric_tool('panel')
|
|
167
|
-
async def panel_fixed_effects(
|
|
168
|
-
ctx: Context[ServerSession, AppContext],
|
|
169
|
-
file_path: Annotated[Optional[str], Field(
|
|
170
|
-
default=None,
|
|
171
|
-
description="CSV文件路径。CSV格式要求:必须包含实体ID列(列名含entity_id/id/entity/firm/company/country/region之一)和时间列(列名含time_period/time/date/year/month/period/quarter之一)"
|
|
172
|
-
)] = None,
|
|
173
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
174
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
175
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
176
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None,
|
|
177
|
-
entity_ids: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
178
|
-
time_periods: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
179
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
180
|
-
entity_effects: Annotated[bool, Field(default=True)] = True,
|
|
181
|
-
time_effects: Annotated[bool, Field(default=False)] = False
|
|
182
|
-
) -> CallToolResult:
|
|
183
|
-
"""固定效应模型 - 支持文件输入"""
|
|
184
|
-
return await handle_panel_fixed_effects(ctx, y_data, x_data, entity_ids, time_periods,
|
|
185
|
-
feature_names, entity_effects, time_effects)
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
@mcp.tool()
|
|
189
|
-
@econometric_tool('panel')
|
|
190
|
-
async def panel_random_effects(
|
|
191
|
-
ctx: Context[ServerSession, AppContext],
|
|
192
|
-
file_path: Annotated[Optional[str], Field(
|
|
193
|
-
default=None,
|
|
194
|
-
description="CSV文件路径。CSV格式要求:必须包含实体ID列(列名含entity_id/id/entity/firm/company/country/region之一)和时间列(列名含time_period/time/date/year/month/period/quarter之一)"
|
|
195
|
-
)] = None,
|
|
196
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
197
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
198
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
199
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None,
|
|
200
|
-
entity_ids: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
201
|
-
time_periods: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
202
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
203
|
-
entity_effects: Annotated[bool, Field(default=True)] = True,
|
|
204
|
-
time_effects: Annotated[bool, Field(default=False)] = False
|
|
205
|
-
) -> CallToolResult:
|
|
206
|
-
"""随机效应模型 - 支持文件输入"""
|
|
207
|
-
return await handle_panel_random_effects(ctx, y_data, x_data, entity_ids, time_periods,
|
|
208
|
-
feature_names, entity_effects, time_effects)
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
@mcp.tool()
|
|
212
|
-
@econometric_tool('panel')
|
|
213
|
-
async def panel_hausman_test(
|
|
214
|
-
ctx: Context[ServerSession, AppContext],
|
|
215
|
-
file_path: Annotated[Optional[str], Field(
|
|
216
|
-
default=None,
|
|
217
|
-
description="CSV文件路径。CSV格式要求:必须包含实体ID列(列名含entity_id/id/entity/firm/company/country/region之一)和时间列(列名含time_period/time/date/year/month/period/quarter之一)"
|
|
218
|
-
)] = None,
|
|
219
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
220
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
221
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
222
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None,
|
|
223
|
-
entity_ids: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
224
|
-
time_periods: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
225
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None
|
|
226
|
-
) -> CallToolResult:
|
|
227
|
-
"""Hausman检验 - 支持文件输入"""
|
|
228
|
-
return await handle_panel_hausman_test(ctx, y_data, x_data, entity_ids, time_periods, feature_names)
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
@mcp.tool()
|
|
232
|
-
@econometric_tool('panel') # 保持panel类型以获取entity_ids和time_periods
|
|
233
|
-
async def panel_unit_root_test(
|
|
234
|
-
ctx: Context[ServerSession, AppContext],
|
|
235
|
-
file_path: Annotated[Optional[str], Field(
|
|
236
|
-
default=None,
|
|
237
|
-
description="CSV文件路径。CSV格式要求:必须包含实体ID列(列名含entity_id/id/entity/firm/company/country/region之一)和时间列(列名含time_period/time/date/year/month/period/quarter之一)。数据量要求:至少3个实体,每个实体至少5个时间点"
|
|
238
|
-
)] = None,
|
|
239
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
240
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
241
|
-
data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
242
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None, # 从panel转换来的
|
|
243
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None, # 从panel转换来的,忽略
|
|
244
|
-
entity_ids: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
245
|
-
time_periods: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
246
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None, # 从panel转换来的,忽略
|
|
247
|
-
test_type: Annotated[str, Field(default="levinlin")] = "levinlin"
|
|
248
|
-
) -> CallToolResult:
|
|
249
|
-
"""面板单位根检验 - 支持文件输入"""
|
|
250
|
-
# 传递所有参数给handler
|
|
251
|
-
return await handle_panel_unit_root_test(
|
|
252
|
-
ctx,
|
|
253
|
-
data=data,
|
|
254
|
-
y_data=y_data,
|
|
255
|
-
entity_ids=entity_ids,
|
|
256
|
-
time_periods=time_periods,
|
|
257
|
-
test_type=test_type
|
|
258
|
-
)
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
# ============================================================================
|
|
262
|
-
# 高级时间序列工具 (5个) - 自动支持文件输入
|
|
263
|
-
# ============================================================================
|
|
264
|
-
|
|
265
|
-
@mcp.tool()
|
|
266
|
-
@econometric_tool('time_series')
|
|
267
|
-
async def var_model_analysis(
|
|
268
|
-
ctx: Context[ServerSession, AppContext],
|
|
269
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
270
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
271
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
272
|
-
data: Annotated[Optional[Dict[str, List[float]]], Field(default=None)] = None,
|
|
273
|
-
max_lags: Annotated[int, Field(default=5)] = 5,
|
|
274
|
-
ic: Annotated[str, Field(default="aic")] = "aic"
|
|
275
|
-
) -> CallToolResult:
|
|
276
|
-
"""VAR模型分析 - 支持文件输入"""
|
|
277
|
-
return await handle_var_model(ctx, data, max_lags, ic)
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
@mcp.tool()
|
|
281
|
-
@econometric_tool('time_series')
|
|
282
|
-
async def vecm_model_analysis(
|
|
283
|
-
ctx: Context[ServerSession, AppContext],
|
|
284
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
285
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
286
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
287
|
-
data: Annotated[Optional[Dict[str, List[float]]], Field(default=None)] = None,
|
|
288
|
-
coint_rank: Annotated[int, Field(default=1)] = 1,
|
|
289
|
-
deterministic: Annotated[str, Field(default="co")] = "co",
|
|
290
|
-
max_lags: Annotated[int, Field(default=5)] = 5
|
|
291
|
-
) -> CallToolResult:
|
|
292
|
-
"""VECM模型分析 - 支持文件输入"""
|
|
293
|
-
return await handle_vecm_model(ctx, data, coint_rank, deterministic, max_lags)
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
@mcp.tool()
|
|
297
|
-
@econometric_tool('single_var')
|
|
298
|
-
async def garch_model_analysis(
|
|
299
|
-
ctx: Context[ServerSession, AppContext],
|
|
300
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
301
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
302
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
303
|
-
data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
304
|
-
order: Annotated[tuple, Field(default=(1, 1))] = (1, 1),
|
|
305
|
-
dist: Annotated[str, Field(default="normal")] = "normal"
|
|
306
|
-
) -> CallToolResult:
|
|
307
|
-
"""GARCH模型分析 - 支持文件输入"""
|
|
308
|
-
return await handle_garch_model(ctx, data, order, dist)
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
@mcp.tool()
|
|
312
|
-
@econometric_tool('single_var')
|
|
313
|
-
async def state_space_model_analysis(
|
|
314
|
-
ctx: Context[ServerSession, AppContext],
|
|
315
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
316
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
317
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
318
|
-
data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
319
|
-
state_dim: Annotated[int, Field(default=1)] = 1,
|
|
320
|
-
observation_dim: Annotated[int, Field(default=1)] = 1,
|
|
321
|
-
trend: Annotated[bool, Field(default=True)] = True,
|
|
322
|
-
seasonal: Annotated[bool, Field(default=False)] = False,
|
|
323
|
-
period: Annotated[int, Field(default=12)] = 12
|
|
324
|
-
) -> CallToolResult:
|
|
325
|
-
"""状态空间模型分析 - 支持文件输入"""
|
|
326
|
-
return await handle_state_space_model(ctx, data, state_dim, observation_dim, trend, seasonal, period)
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
@mcp.tool()
|
|
330
|
-
@econometric_tool('time_series')
|
|
331
|
-
async def variance_decomposition_analysis(
|
|
332
|
-
ctx: Context[ServerSession, AppContext],
|
|
333
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
334
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
335
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
336
|
-
data: Annotated[Optional[Dict[str, List[float]]], Field(default=None)] = None,
|
|
337
|
-
periods: Annotated[int, Field(default=10)] = 10,
|
|
338
|
-
max_lags: Annotated[int, Field(default=5)] = 5
|
|
339
|
-
) -> CallToolResult:
|
|
340
|
-
"""方差分解分析 - 支持文件输入"""
|
|
341
|
-
return await handle_variance_decomposition(ctx, data, periods, max_lags)
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
# ============================================================================
|
|
345
|
-
# 机器学习工具 (6个) - 自动支持文件输入
|
|
346
|
-
# ============================================================================
|
|
347
|
-
|
|
348
|
-
@mcp.tool()
|
|
349
|
-
@econometric_tool('regression')
|
|
350
|
-
async def random_forest_regression_analysis(
|
|
351
|
-
ctx: Context[ServerSession, AppContext],
|
|
352
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
353
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
354
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
355
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
356
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None,
|
|
357
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
358
|
-
n_estimators: Annotated[int, Field(default=100)] = 100,
|
|
359
|
-
max_depth: Annotated[Optional[int], Field(default=None)] = None
|
|
360
|
-
) -> CallToolResult:
|
|
361
|
-
"""随机森林回归 - 支持文件输入"""
|
|
362
|
-
return await handle_random_forest(ctx, y_data, x_data, feature_names, n_estimators, max_depth)
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
@mcp.tool()
|
|
366
|
-
@econometric_tool('regression')
|
|
367
|
-
async def gradient_boosting_regression_analysis(
|
|
368
|
-
ctx: Context[ServerSession, AppContext],
|
|
369
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
370
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
371
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
372
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
373
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None,
|
|
374
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
375
|
-
n_estimators: Annotated[int, Field(default=100)] = 100,
|
|
376
|
-
learning_rate: Annotated[float, Field(default=0.1)] = 0.1,
|
|
377
|
-
max_depth: Annotated[int, Field(default=3)] = 3
|
|
378
|
-
) -> CallToolResult:
|
|
379
|
-
"""梯度提升树回归 - 支持文件输入"""
|
|
380
|
-
return await handle_gradient_boosting(ctx, y_data, x_data, feature_names, n_estimators, learning_rate, max_depth)
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
@mcp.tool()
|
|
384
|
-
@econometric_tool('regression')
|
|
385
|
-
async def lasso_regression_analysis(
|
|
386
|
-
ctx: Context[ServerSession, AppContext],
|
|
387
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
388
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
389
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
390
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
391
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None,
|
|
392
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
393
|
-
alpha: Annotated[float, Field(default=1.0)] = 1.0
|
|
394
|
-
) -> CallToolResult:
|
|
395
|
-
"""Lasso回归 - 支持文件输入"""
|
|
396
|
-
return await handle_lasso_regression(ctx, y_data, x_data, feature_names, alpha)
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
@mcp.tool()
|
|
400
|
-
@econometric_tool('regression')
|
|
401
|
-
async def ridge_regression_analysis(
|
|
402
|
-
ctx: Context[ServerSession, AppContext],
|
|
403
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
404
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
405
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
406
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
407
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None,
|
|
408
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
409
|
-
alpha: Annotated[float, Field(default=1.0)] = 1.0
|
|
410
|
-
) -> CallToolResult:
|
|
411
|
-
"""Ridge回归 - 支持文件输入"""
|
|
412
|
-
return await handle_ridge_regression(ctx, y_data, x_data, feature_names, alpha)
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
@mcp.tool()
|
|
416
|
-
@econometric_tool('regression')
|
|
417
|
-
async def cross_validation_analysis(
|
|
418
|
-
ctx: Context[ServerSession, AppContext],
|
|
419
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
420
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
421
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
422
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
423
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None,
|
|
424
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
425
|
-
model_type: Annotated[str, Field(default="random_forest")] = "random_forest",
|
|
426
|
-
cv_folds: Annotated[int, Field(default=5)] = 5,
|
|
427
|
-
scoring: Annotated[str, Field(default="r2")] = "r2"
|
|
428
|
-
) -> CallToolResult:
|
|
429
|
-
"""交叉验证 - 支持文件输入"""
|
|
430
|
-
return await handle_cross_validation(ctx, y_data, x_data, model_type, cv_folds, scoring)
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
@mcp.tool()
|
|
434
|
-
@econometric_tool('regression')
|
|
435
|
-
async def feature_importance_analysis_tool(
|
|
436
|
-
ctx: Context[ServerSession, AppContext],
|
|
437
|
-
file_path: Annotated[Optional[str], Field(default=None, description="文件路径")] = None,
|
|
438
|
-
file_content: Annotated[Optional[str], Field(default=None)] = None,
|
|
439
|
-
file_format: Annotated[str, Field(default="auto")] = "auto",
|
|
440
|
-
y_data: Annotated[Optional[List[float]], Field(default=None)] = None,
|
|
441
|
-
x_data: Annotated[Optional[List[List[float]]], Field(default=None)] = None,
|
|
442
|
-
feature_names: Annotated[Optional[List[str]], Field(default=None)] = None,
|
|
443
|
-
method: Annotated[str, Field(default="random_forest")] = "random_forest",
|
|
444
|
-
top_k: Annotated[int, Field(default=5)] = 5
|
|
445
|
-
) -> CallToolResult:
|
|
446
|
-
"""特征重要性分析 - 支持文件输入"""
|
|
447
|
-
return await handle_feature_importance(ctx, y_data, x_data, feature_names, method, top_k)
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
def create_mcp_server() -> FastMCP:
|
|
451
|
-
"""创建并返回MCP服务器实例"""
|
|
452
|
-
return mcp
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
计量经济学工具模块
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
from . import regression, statistics, time_series, machine_learning, panel_data
|
|
6
|
-
from . import validation, cache, monitoring, file_parser
|
|
7
|
-
|
|
8
|
-
__all__ = [
|
|
9
|
-
"regression",
|
|
10
|
-
"statistics",
|
|
11
|
-
"time_series",
|
|
12
|
-
"machine_learning",
|
|
13
|
-
"panel_data",
|
|
14
|
-
"validation",
|
|
15
|
-
"cache",
|
|
16
|
-
"monitoring",
|
|
17
|
-
"file_parser"
|
|
18
|
-
]
|