aigroup-econ-mcp 0.5.0__py3-none-any.whl → 0.7.0__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.
Potentially problematic release.
This version of aigroup-econ-mcp might be problematic. Click here for more details.
- aigroup_econ_mcp/__init__.py +1 -1
- aigroup_econ_mcp/server.py +2 -2
- aigroup_econ_mcp/tools/ml_regularization.py +22 -8
- aigroup_econ_mcp/tools/panel_data.py +70 -4
- aigroup_econ_mcp/tools/tool_descriptions.py +492 -112
- aigroup_econ_mcp/tools/tool_handlers.py +134 -6
- {aigroup_econ_mcp-0.5.0.dist-info → aigroup_econ_mcp-0.7.0.dist-info}/METADATA +2 -2
- {aigroup_econ_mcp-0.5.0.dist-info → aigroup_econ_mcp-0.7.0.dist-info}/RECORD +11 -11
- {aigroup_econ_mcp-0.5.0.dist-info → aigroup_econ_mcp-0.7.0.dist-info}/WHEEL +0 -0
- {aigroup_econ_mcp-0.5.0.dist-info → aigroup_econ_mcp-0.7.0.dist-info}/entry_points.txt +0 -0
- {aigroup_econ_mcp-0.5.0.dist-info → aigroup_econ_mcp-0.7.0.dist-info}/licenses/LICENSE +0 -0
aigroup_econ_mcp/__init__.py
CHANGED
aigroup_econ_mcp/server.py
CHANGED
|
@@ -70,7 +70,7 @@ from .tools.tool_descriptions import (
|
|
|
70
70
|
class AppContext:
|
|
71
71
|
"""应用上下文,包含共享资源"""
|
|
72
72
|
config: Dict[str, Any]
|
|
73
|
-
version: str = "0.
|
|
73
|
+
version: str = "0.6.0"
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
@asynccontextmanager
|
|
@@ -83,7 +83,7 @@ async def lifespan(server: FastMCP) -> AsyncIterator[AppContext]:
|
|
|
83
83
|
"data_types": ["cross_section", "time_series", "panel"]
|
|
84
84
|
}
|
|
85
85
|
try:
|
|
86
|
-
yield AppContext(config=config, version="0.
|
|
86
|
+
yield AppContext(config=config, version="0.6.0")
|
|
87
87
|
finally:
|
|
88
88
|
pass
|
|
89
89
|
|
|
@@ -130,36 +130,50 @@ def _regularized_regression(
|
|
|
130
130
|
elif len(feature_names) != X.shape[1]:
|
|
131
131
|
raise ValueError(f"特征名称数量({len(feature_names)})与自变量数量({X.shape[1]})不匹配")
|
|
132
132
|
|
|
133
|
-
#
|
|
133
|
+
# 检查数据质量
|
|
134
|
+
if len(y) < 5:
|
|
135
|
+
warnings.warn(f"⚠️ 警告:样本数量较少({len(y)}个),正则化回归可能不稳定")
|
|
136
|
+
|
|
137
|
+
# 数据标准化 - 只标准化自变量,不标准化因变量
|
|
134
138
|
scaler = StandardScaler()
|
|
135
139
|
X_scaled = scaler.fit_transform(X)
|
|
136
|
-
y_scaled = (y - np.mean(y)) / np.std(y) # 标准化因变量
|
|
137
140
|
|
|
138
141
|
# 选择模型
|
|
139
142
|
if model_type == "lasso":
|
|
140
|
-
model = Lasso(alpha=alpha, random_state=random_state, max_iter=10000)
|
|
143
|
+
model = Lasso(alpha=alpha, random_state=random_state, max_iter=10000, tol=1e-4)
|
|
144
|
+
# 对于Lasso,如果alpha过大,建议使用更小的值
|
|
145
|
+
if alpha > 10:
|
|
146
|
+
warnings.warn(f"⚠️ 警告:Lasso正则化参数alpha={alpha}可能过大,建议尝试更小的值(如0.1-1.0)")
|
|
141
147
|
elif model_type == "ridge":
|
|
142
148
|
model = Ridge(alpha=alpha, random_state=random_state)
|
|
143
149
|
else:
|
|
144
150
|
raise ValueError(f"不支持的模型类型: {model_type}")
|
|
145
151
|
|
|
146
152
|
# 训练模型
|
|
147
|
-
|
|
153
|
+
try:
|
|
154
|
+
model.fit(X_scaled, y)
|
|
155
|
+
except Exception as e:
|
|
156
|
+
raise ValueError(f"{model_type}模型拟合失败: {str(e)}。建议:1) 检查数据质量 2) 尝试不同的alpha值 3) 增加样本数量")
|
|
148
157
|
|
|
149
158
|
# 预测
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
# 将预测值转换回原始尺度
|
|
153
|
-
y_pred = y_pred_scaled * np.std(y) + np.mean(y)
|
|
159
|
+
y_pred = model.predict(X_scaled)
|
|
154
160
|
|
|
155
161
|
# 计算评估指标
|
|
156
162
|
r2 = r2_score(y, y_pred)
|
|
157
163
|
mse = mean_squared_error(y, y_pred)
|
|
158
164
|
mae = mean_absolute_error(y, y_pred)
|
|
159
165
|
|
|
166
|
+
# 检查R²是否为负值
|
|
167
|
+
if r2 < 0:
|
|
168
|
+
warnings.warn(f"⚠️ 警告:{model_type}模型的R²为负值({r2:.4f}),表明模型性能比简单均值预测更差。可能原因:1) 数据噪声过大 2) 特征与目标变量无关 3) 正则化参数过大 4) 样本量过小")
|
|
169
|
+
|
|
160
170
|
# 系数(注意:由于标准化,系数需要适当解释)
|
|
161
171
|
coefficients = dict(zip(feature_names, model.coef_))
|
|
162
172
|
|
|
173
|
+
# 检查系数是否全为0(Lasso过度压缩)
|
|
174
|
+
if model_type == "lasso" and all(abs(coef) < 1e-10 for coef in model.coef_):
|
|
175
|
+
warnings.warn(f"⚠️ 警告:Lasso模型所有系数都被压缩为0,表明正则化参数alpha={alpha}可能过大,建议减小alpha值")
|
|
176
|
+
|
|
163
177
|
return RegularizedRegressionResult(
|
|
164
178
|
model_type=model_type,
|
|
165
179
|
r2_score=r2,
|
|
@@ -63,6 +63,23 @@ def prepare_panel_data(
|
|
|
63
63
|
"""
|
|
64
64
|
准备面板数据格式
|
|
65
65
|
|
|
66
|
+
📊 数据格式要求:
|
|
67
|
+
- 因变量(y_data): 数值列表,如 [1.2, 3.4, 5.6, ...]
|
|
68
|
+
- 自变量(X_data): 二维数值列表,如 [[1, 2], [3, 4], [5, 6], ...]
|
|
69
|
+
- 实体ID(entity_ids): 字符串列表,标识不同个体,如 ['A', 'A', 'B', 'B', ...]
|
|
70
|
+
- 时间标识符(time_periods): 字符串或数值列表,标识时间点,如 ['2020', '2020', '2021', '2021', ...]
|
|
71
|
+
|
|
72
|
+
💡 使用示例:
|
|
73
|
+
y_data = [10, 12, 8, 9] # 4个观测值
|
|
74
|
+
X_data = [[1, 2], [2, 3], [1, 1], [2, 2]] # 2个自变量,4个观测值
|
|
75
|
+
entity_ids = ['A', 'A', 'B', 'B'] # 2个实体,每个实体2个时间点
|
|
76
|
+
time_periods = ['2020', '2021', '2020', '2021'] # 2个时间点
|
|
77
|
+
|
|
78
|
+
⚠️ 注意事项:
|
|
79
|
+
- 确保每个实体有相同的时间点数量(平衡面板)
|
|
80
|
+
- 实体ID和时间标识符的组合必须唯一
|
|
81
|
+
- 建议至少3个实体,每个实体至少2个时间点
|
|
82
|
+
|
|
66
83
|
Args:
|
|
67
84
|
y_data: 因变量数据
|
|
68
85
|
X_data: 自变量数据,二维列表
|
|
@@ -73,13 +90,62 @@ def prepare_panel_data(
|
|
|
73
90
|
Returns:
|
|
74
91
|
pd.DataFrame: 面板数据格式的DataFrame
|
|
75
92
|
"""
|
|
76
|
-
# 数据验证
|
|
93
|
+
# 数据验证 - 提供更详细的错误信息
|
|
94
|
+
if not y_data or not X_data or not entity_ids or not time_periods:
|
|
95
|
+
raise ValueError("所有输入数据都不能为空。请提供:因变量(y_data)、自变量(X_data)、实体ID(entity_ids)、时间标识符(time_periods)")
|
|
96
|
+
|
|
77
97
|
if len(y_data) != len(X_data):
|
|
78
|
-
raise ValueError("
|
|
98
|
+
raise ValueError(f"因变量和自变量的观测数量不一致:因变量有{len(y_data)}个观测值,自变量有{len(X_data)}个观测值")
|
|
99
|
+
|
|
79
100
|
if len(y_data) != len(entity_ids):
|
|
80
|
-
raise ValueError("
|
|
101
|
+
raise ValueError(f"因变量和个体标识符数量不一致:因变量有{len(y_data)}个观测值,实体ID有{len(entity_ids)}个")
|
|
102
|
+
|
|
81
103
|
if len(y_data) != len(time_periods):
|
|
82
|
-
raise ValueError("
|
|
104
|
+
raise ValueError(f"因变量和时间标识符数量不一致:因变量有{len(y_data)}个观测值,时间标识符有{len(time_periods)}个")
|
|
105
|
+
|
|
106
|
+
# 检查自变量维度一致性
|
|
107
|
+
if len(X_data) > 0:
|
|
108
|
+
first_dim = len(X_data[0])
|
|
109
|
+
for i, x_row in enumerate(X_data):
|
|
110
|
+
if len(x_row) != first_dim:
|
|
111
|
+
raise ValueError(f"自变量维度不一致:第{i}行有{len(x_row)}个变量,但第一行有{first_dim}个变量")
|
|
112
|
+
|
|
113
|
+
# 检查面板数据平衡性
|
|
114
|
+
entity_time_counts = {}
|
|
115
|
+
for entity, time_period in zip(entity_ids, time_periods):
|
|
116
|
+
key = (entity, time_period)
|
|
117
|
+
if key in entity_time_counts:
|
|
118
|
+
raise ValueError(f"重复的实体-时间组合:实体 '{entity}' 在时间 '{time_period}' 有多个观测值")
|
|
119
|
+
entity_time_counts[key] = True
|
|
120
|
+
|
|
121
|
+
# 检查每个实体的时间点数量
|
|
122
|
+
entity_counts = {}
|
|
123
|
+
for entity in entity_ids:
|
|
124
|
+
entity_counts[entity] = entity_counts.get(entity, 0) + 1
|
|
125
|
+
|
|
126
|
+
unique_entities = len(entity_counts)
|
|
127
|
+
if unique_entities < 2:
|
|
128
|
+
raise ValueError(f"面板数据需要至少2个不同的实体,当前只有{unique_entities}个")
|
|
129
|
+
|
|
130
|
+
# 检查时间点数量
|
|
131
|
+
time_counts = {}
|
|
132
|
+
for time_period in time_periods:
|
|
133
|
+
time_counts[time_period] = time_counts.get(time_period, 0) + 1
|
|
134
|
+
|
|
135
|
+
unique_times = len(time_counts)
|
|
136
|
+
if unique_times < 2:
|
|
137
|
+
raise ValueError(f"面板数据需要至少2个不同的时间点,当前只有{unique_times}个")
|
|
138
|
+
|
|
139
|
+
# 检查是否为平衡面板
|
|
140
|
+
time_counts_per_entity = {}
|
|
141
|
+
for entity in set(entity_ids):
|
|
142
|
+
entity_times = [time for e, time in zip(entity_ids, time_periods) if e == entity]
|
|
143
|
+
time_counts_per_entity[entity] = len(set(entity_times))
|
|
144
|
+
|
|
145
|
+
min_times = min(time_counts_per_entity.values())
|
|
146
|
+
max_times = max(time_counts_per_entity.values())
|
|
147
|
+
if min_times != max_times:
|
|
148
|
+
warnings.warn(f"⚠️ 警告:面板数据不平衡。不同实体的时间点数量不同(最少{min_times}个,最多{max_times}个)。建议使用平衡面板数据以获得更可靠的结果。")
|
|
83
149
|
|
|
84
150
|
# 处理时间标识符格式兼容性
|
|
85
151
|
processed_time_periods = []
|
|
@@ -1,158 +1,425 @@
|
|
|
1
1
|
"""
|
|
2
|
-
工具描述模块
|
|
3
|
-
统一管理所有MCP
|
|
2
|
+
工具描述模块 - 优化版
|
|
3
|
+
统一管理所有MCP工具的描述信息,为大模型提供详细、结构化的工具说明
|
|
4
|
+
包含使用示例、参数说明、适用场景等信息,提升大模型调用体验
|
|
4
5
|
"""
|
|
5
6
|
|
|
6
|
-
from typing import Dict, Any, List
|
|
7
|
+
from typing import Dict, Any, List, Optional
|
|
7
8
|
from pydantic import Field
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
class ToolDescription:
|
|
11
|
-
"""工具描述类"""
|
|
12
|
+
"""工具描述类 - 优化版"""
|
|
12
13
|
|
|
13
|
-
def __init__(self, name: str, description: str, field_descriptions: Dict[str, str] = None
|
|
14
|
+
def __init__(self, name: str, description: str, field_descriptions: Dict[str, str] = None,
|
|
15
|
+
examples: Optional[List[str]] = None, use_cases: Optional[List[str]] = None):
|
|
14
16
|
self.name = name
|
|
15
17
|
self.description = description
|
|
16
18
|
self.field_descriptions = field_descriptions or {}
|
|
19
|
+
self.examples = examples or []
|
|
20
|
+
self.use_cases = use_cases or []
|
|
17
21
|
|
|
18
22
|
def get_field_description(self, field_name: str, default: str = "") -> str:
|
|
19
23
|
"""获取字段描述"""
|
|
20
24
|
return self.field_descriptions.get(field_name, default)
|
|
25
|
+
|
|
26
|
+
def get_full_description(self) -> str:
|
|
27
|
+
"""获取完整描述,包含示例和用例"""
|
|
28
|
+
full_desc = self.description
|
|
29
|
+
if self.examples:
|
|
30
|
+
full_desc += "\n\n使用示例:\n" + "\n".join(f"- {example}" for example in self.examples)
|
|
31
|
+
if self.use_cases:
|
|
32
|
+
full_desc += "\n\n适用场景:\n" + "\n".join(f"- {use_case}" for use_case in self.use_cases)
|
|
33
|
+
return full_desc
|
|
21
34
|
|
|
22
35
|
|
|
23
36
|
# ============================================================================
|
|
24
|
-
# 基础统计工具描述 (5个)
|
|
37
|
+
# 基础统计工具描述 (5个) - 优化版
|
|
25
38
|
# ============================================================================
|
|
26
39
|
|
|
27
40
|
DESCRIPTIVE_STATISTICS = ToolDescription(
|
|
28
41
|
name="descriptive_statistics",
|
|
29
|
-
description="
|
|
42
|
+
description="""计算描述性统计量
|
|
43
|
+
|
|
44
|
+
功能说明:
|
|
45
|
+
- 计算数据的均值、标准差、最小值、最大值、中位数、四分位数等
|
|
46
|
+
- 支持数值型数据的全面统计分析
|
|
47
|
+
- 自动识别异常值和数据分布特征
|
|
48
|
+
|
|
49
|
+
输入方式优先级:
|
|
50
|
+
1. file_path: 文件路径 (推荐使用,支持CSV/JSON格式)
|
|
51
|
+
2. file_content: 文件内容字符串 (适合小文件)
|
|
52
|
+
3. data: 直接传入数据字典 (适合内存数据)
|
|
53
|
+
|
|
54
|
+
输出包含:
|
|
55
|
+
- 基本统计量: 均值、标准差、最小值、最大值
|
|
56
|
+
- 分布统计: 中位数、四分位数、偏度、峰度
|
|
57
|
+
- 数据质量: 缺失值统计、异常值检测""",
|
|
30
58
|
field_descriptions={
|
|
31
|
-
"file_path": "CSV/JSON
|
|
32
|
-
"file_content": "CSV/JSON
|
|
33
|
-
"file_format": "
|
|
34
|
-
"data": "
|
|
35
|
-
}
|
|
59
|
+
"file_path": "CSV/JSON文件路径。支持相对路径和绝对路径,文件应包含数值型数据列",
|
|
60
|
+
"file_content": "CSV/JSON文件内容字符串。适合小文件直接传输,避免路径依赖",
|
|
61
|
+
"file_format": "文件格式: csv/json/auto。auto模式自动检测文件格式",
|
|
62
|
+
"data": "数据字典格式: {'变量名1': [值1, 值2, ...], '变量名2': [值1, 值2, ...]}"
|
|
63
|
+
},
|
|
64
|
+
examples=[
|
|
65
|
+
"分析GDP数据的分布特征",
|
|
66
|
+
"计算股票收益率的描述性统计",
|
|
67
|
+
"评估消费者收入数据的集中趋势和离散程度"
|
|
68
|
+
],
|
|
69
|
+
use_cases=[
|
|
70
|
+
"数据探索性分析(EDA)",
|
|
71
|
+
"数据质量评估",
|
|
72
|
+
"变量分布特征分析",
|
|
73
|
+
"异常值检测"
|
|
74
|
+
]
|
|
36
75
|
)
|
|
37
76
|
|
|
38
77
|
OLS_REGRESSION = ToolDescription(
|
|
39
78
|
name="ols_regression",
|
|
40
|
-
description="OLS
|
|
79
|
+
description="""OLS回归分析
|
|
80
|
+
|
|
81
|
+
功能说明:
|
|
82
|
+
- 执行普通最小二乘法(OLS)回归分析
|
|
83
|
+
- 估计回归系数、标准误、t统计量、p值
|
|
84
|
+
- 计算模型拟合优度(R²、调整R²)
|
|
85
|
+
- 进行模型显著性检验(F检验)
|
|
86
|
+
|
|
87
|
+
数据格式要求:
|
|
88
|
+
- 文件输入: CSV文件最后一列为因变量,其余列为自变量
|
|
89
|
+
- 直接输入: 提供y_data(因变量)和x_data(自变量矩阵)
|
|
90
|
+
- 支持特征名称自定义
|
|
91
|
+
|
|
92
|
+
模型输出:
|
|
93
|
+
- 回归系数估计值和统计显著性
|
|
94
|
+
- 模型拟合优度指标
|
|
95
|
+
- 残差分析和诊断统计量
|
|
96
|
+
- 置信区间和预测区间""",
|
|
41
97
|
field_descriptions={
|
|
42
|
-
"file_path": "CSV/JSON
|
|
43
|
-
"file_content": "CSV/JSON
|
|
44
|
-
"file_format": "
|
|
45
|
-
"y_data": "
|
|
46
|
-
"x_data": "
|
|
47
|
-
"feature_names": "
|
|
48
|
-
}
|
|
98
|
+
"file_path": "CSV/JSON文件路径。CSV格式: 最后一列为因变量,其余列为自变量",
|
|
99
|
+
"file_content": "CSV/JSON文件内容字符串。JSON格式: {'y': [因变量], 'x1': [自变量1], ...}",
|
|
100
|
+
"file_format": "文件格式: csv/json/auto。推荐使用CSV格式",
|
|
101
|
+
"y_data": "因变量数据列表,如 [1.2, 3.4, 5.6, ...]",
|
|
102
|
+
"x_data": "自变量数据矩阵,如 [[1, 2], [3, 4], [5, 6], ...]",
|
|
103
|
+
"feature_names": "自变量名称列表,如 ['GDP', 'Population', 'Investment']"
|
|
104
|
+
},
|
|
105
|
+
examples=[
|
|
106
|
+
"分析GDP增长与投资、消费的关系",
|
|
107
|
+
"预测房价与面积、位置、房龄的关系",
|
|
108
|
+
"研究教育水平对收入的影响"
|
|
109
|
+
],
|
|
110
|
+
use_cases=[
|
|
111
|
+
"经济变量关系分析",
|
|
112
|
+
"商业预测建模",
|
|
113
|
+
"政策效果评估",
|
|
114
|
+
"影响因素识别"
|
|
115
|
+
]
|
|
49
116
|
)
|
|
50
117
|
|
|
51
118
|
HYPOTHESIS_TESTING = ToolDescription(
|
|
52
119
|
name="hypothesis_testing",
|
|
53
|
-
description="
|
|
120
|
+
description="""假设检验分析
|
|
121
|
+
|
|
122
|
+
功能说明:
|
|
123
|
+
- t检验: 比较两组数据的均值差异
|
|
124
|
+
- ADF检验: 时间序列平稳性检验
|
|
125
|
+
- 支持单样本、双样本检验
|
|
126
|
+
- 自动计算检验统计量和p值
|
|
127
|
+
|
|
128
|
+
检验类型说明:
|
|
129
|
+
- t_test: 学生t检验,用于均值比较
|
|
130
|
+
- adf: Augmented Dickey-Fuller检验,用于时间序列平稳性
|
|
131
|
+
|
|
132
|
+
数据要求:
|
|
133
|
+
- 单样本检验: 只需提供data参数
|
|
134
|
+
- 双样本检验: 提供data和data2参数
|
|
135
|
+
- 时间序列检验: 使用adf检验类型""",
|
|
54
136
|
field_descriptions={
|
|
55
|
-
"file_path": "
|
|
56
|
-
"file_content": "
|
|
57
|
-
"file_format": "
|
|
58
|
-
"data": "
|
|
59
|
-
"data2": "第二组数据",
|
|
60
|
-
"test_type": "
|
|
61
|
-
}
|
|
137
|
+
"file_path": "数据文件路径。支持单变量或多变量数据",
|
|
138
|
+
"file_content": "文件内容字符串。适合小数据集",
|
|
139
|
+
"file_format": "文件格式: csv/json/auto",
|
|
140
|
+
"data": "第一组数据或单样本数据,数值列表格式",
|
|
141
|
+
"data2": "第二组数据(双样本检验时使用),数值列表格式",
|
|
142
|
+
"test_type": "检验类型: t_test(均值检验)/adf(平稳性检验)"
|
|
143
|
+
},
|
|
144
|
+
examples=[
|
|
145
|
+
"检验两组学生的考试成绩是否有显著差异",
|
|
146
|
+
"检验GDP时间序列是否平稳",
|
|
147
|
+
"比较新旧营销策略的效果差异"
|
|
148
|
+
],
|
|
149
|
+
use_cases=[
|
|
150
|
+
"A/B测试结果验证",
|
|
151
|
+
"时间序列平稳性分析",
|
|
152
|
+
"均值差异显著性检验",
|
|
153
|
+
"实验效果评估"
|
|
154
|
+
]
|
|
62
155
|
)
|
|
63
156
|
|
|
64
157
|
TIME_SERIES_ANALYSIS = ToolDescription(
|
|
65
158
|
name="time_series_analysis",
|
|
66
|
-
description="时间序列分析
|
|
159
|
+
description="""时间序列分析
|
|
160
|
+
|
|
161
|
+
功能说明:
|
|
162
|
+
- 时间序列趋势分析和季节性分解
|
|
163
|
+
- 自相关函数(ACF)和偏自相关函数(PACF)分析
|
|
164
|
+
- 平稳性检验和单位根检验
|
|
165
|
+
- 时间序列模型诊断
|
|
166
|
+
|
|
167
|
+
分析内容:
|
|
168
|
+
- 趋势成分: 长期变化趋势
|
|
169
|
+
- 季节成分: 周期性波动
|
|
170
|
+
- 残差成分: 随机波动
|
|
171
|
+
- 自相关性: 时间依赖性分析""",
|
|
67
172
|
field_descriptions={
|
|
68
|
-
"file_path": "
|
|
69
|
-
"file_content": "
|
|
70
|
-
"file_format": "
|
|
71
|
-
"data": "
|
|
72
|
-
}
|
|
173
|
+
"file_path": "时间序列数据文件路径。支持单变量时间序列",
|
|
174
|
+
"file_content": "文件内容字符串。数据应按时间顺序排列",
|
|
175
|
+
"file_format": "文件格式: csv/json/auto",
|
|
176
|
+
"data": "时间序列数据,数值列表格式,如 [100, 105, 110, 115, ...]"
|
|
177
|
+
},
|
|
178
|
+
examples=[
|
|
179
|
+
"分析GDP季度数据的趋势和季节性",
|
|
180
|
+
"分解股票价格的趋势和波动成分",
|
|
181
|
+
"检验销售数据的自相关性"
|
|
182
|
+
],
|
|
183
|
+
use_cases=[
|
|
184
|
+
"经济周期分析",
|
|
185
|
+
"销售预测建模",
|
|
186
|
+
"金融市场分析",
|
|
187
|
+
"季节性调整"
|
|
188
|
+
]
|
|
73
189
|
)
|
|
74
190
|
|
|
75
191
|
CORRELATION_ANALYSIS = ToolDescription(
|
|
76
192
|
name="correlation_analysis",
|
|
77
|
-
description="相关性分析
|
|
193
|
+
description="""相关性分析
|
|
194
|
+
|
|
195
|
+
功能说明:
|
|
196
|
+
- 计算变量间的相关系数矩阵
|
|
197
|
+
- 支持Pearson、Spearman、Kendall相关系数
|
|
198
|
+
- 可视化相关矩阵(可选)
|
|
199
|
+
- 显著性检验和置信区间
|
|
200
|
+
|
|
201
|
+
相关系数类型:
|
|
202
|
+
- pearson: 皮尔逊相关系数,衡量线性关系
|
|
203
|
+
- spearman: 斯皮尔曼等级相关系数,衡量单调关系
|
|
204
|
+
- kendall: 肯德尔等级相关系数,稳健性更好
|
|
205
|
+
|
|
206
|
+
应用场景:
|
|
207
|
+
- 变量关系探索
|
|
208
|
+
- 多重共线性检测
|
|
209
|
+
- 特征选择辅助""",
|
|
78
210
|
field_descriptions={
|
|
79
|
-
"file_path": "
|
|
80
|
-
"file_content": "
|
|
81
|
-
"file_format": "
|
|
82
|
-
"data": "
|
|
83
|
-
"method": "
|
|
84
|
-
}
|
|
211
|
+
"file_path": "多变量数据文件路径。每列代表一个变量",
|
|
212
|
+
"file_content": "文件内容字符串。支持多变量数据",
|
|
213
|
+
"file_format": "文件格式: csv/json/auto",
|
|
214
|
+
"data": "多变量数据字典,如 {'GDP': [值], 'Population': [值], ...}",
|
|
215
|
+
"method": "相关系数类型: pearson(默认)/spearman/kendall"
|
|
216
|
+
},
|
|
217
|
+
examples=[
|
|
218
|
+
"分析经济指标间的相关性",
|
|
219
|
+
"研究股票收益率的相关性结构",
|
|
220
|
+
"探索消费者行为变量间的关系"
|
|
221
|
+
],
|
|
222
|
+
use_cases=[
|
|
223
|
+
"变量关系探索",
|
|
224
|
+
"多重共线性检测",
|
|
225
|
+
"投资组合相关性分析",
|
|
226
|
+
"市场联动性研究"
|
|
227
|
+
]
|
|
85
228
|
)
|
|
86
229
|
|
|
87
230
|
|
|
88
231
|
# ============================================================================
|
|
89
|
-
# 面板数据工具描述 (4个)
|
|
232
|
+
# 面板数据工具描述 (4个) - 优化版
|
|
90
233
|
# ============================================================================
|
|
91
234
|
|
|
92
235
|
PANEL_FIXED_EFFECTS = ToolDescription(
|
|
93
236
|
name="panel_fixed_effects",
|
|
94
|
-
description="固定效应模型
|
|
237
|
+
description="""固定效应模型
|
|
238
|
+
|
|
239
|
+
功能说明:
|
|
240
|
+
- 处理面板数据的固定效应模型
|
|
241
|
+
- 控制个体固定效应和/或时间固定效应
|
|
242
|
+
- 消除不随时间变化的个体异质性
|
|
243
|
+
- 提供稳健的标准误估计
|
|
244
|
+
|
|
245
|
+
模型特点:
|
|
246
|
+
- 实体效应: 控制个体间不可观测的固定差异
|
|
247
|
+
- 时间效应: 控制时间趋势和宏观冲击
|
|
248
|
+
- 双向固定效应: 同时控制实体和时间效应
|
|
249
|
+
|
|
250
|
+
数据格式要求:
|
|
251
|
+
- 必须包含实体ID列和时间列
|
|
252
|
+
- 实体ID列名识别: entity_id, id, entity, firm, company, country, region
|
|
253
|
+
- 时间列名识别: time_period, time, date, year, month, period, quarter
|
|
254
|
+
|
|
255
|
+
适用场景:
|
|
256
|
+
- 个体间存在不可观测的固定差异
|
|
257
|
+
- 需要控制个体特异性因素
|
|
258
|
+
- 数据存在明显的个体效应""",
|
|
95
259
|
field_descriptions={
|
|
96
|
-
"file_path": "CSV
|
|
97
|
-
"file_content": "
|
|
98
|
-
"file_format": "
|
|
99
|
-
"y_data": "
|
|
100
|
-
"x_data": "
|
|
101
|
-
"entity_ids": "实体ID
|
|
102
|
-
"time_periods": "
|
|
103
|
-
"feature_names": "
|
|
104
|
-
"entity_effects": "
|
|
105
|
-
"time_effects": "
|
|
106
|
-
}
|
|
260
|
+
"file_path": "CSV文件路径。必须包含实体ID列和时间列,支持自动识别列名",
|
|
261
|
+
"file_content": "文件内容字符串。CSV格式,包含实体ID、时间和变量列",
|
|
262
|
+
"file_format": "文件格式: csv/auto。面板数据推荐使用CSV格式",
|
|
263
|
+
"y_data": "因变量数据列表,数值格式",
|
|
264
|
+
"x_data": "自变量数据矩阵,二维列表格式",
|
|
265
|
+
"entity_ids": "实体ID列表,字符串格式,如 ['A', 'B', 'C', ...]",
|
|
266
|
+
"time_periods": "时间周期列表,字符串格式,如 ['2020', '2021', '2022', ...]",
|
|
267
|
+
"feature_names": "自变量名称列表,如 ['Investment', 'Employment', 'R&D']",
|
|
268
|
+
"entity_effects": "是否包含实体固定效应,默认True",
|
|
269
|
+
"time_effects": "是否包含时间固定效应,默认False"
|
|
270
|
+
},
|
|
271
|
+
examples=[
|
|
272
|
+
"分析不同公司的研发投入对利润的影响(控制公司固定效应)",
|
|
273
|
+
"研究各国教育支出对经济增长的影响(控制国家固定效应)",
|
|
274
|
+
"评估政策改革效果(控制个体和时间双向效应)"
|
|
275
|
+
],
|
|
276
|
+
use_cases=[
|
|
277
|
+
"公司财务面板数据分析",
|
|
278
|
+
"国家宏观经济面板研究",
|
|
279
|
+
"政策评估和效果分析",
|
|
280
|
+
"个体异质性控制"
|
|
281
|
+
]
|
|
107
282
|
)
|
|
108
283
|
|
|
109
284
|
PANEL_RANDOM_EFFECTS = ToolDescription(
|
|
110
285
|
name="panel_random_effects",
|
|
111
|
-
description="随机效应模型
|
|
286
|
+
description="""随机效应模型
|
|
287
|
+
|
|
288
|
+
功能说明:
|
|
289
|
+
- 处理面板数据的随机效应模型
|
|
290
|
+
- 假设个体效应与解释变量不相关
|
|
291
|
+
- 更有效地利用数据信息
|
|
292
|
+
- 适用于大样本面板数据
|
|
293
|
+
|
|
294
|
+
模型特点:
|
|
295
|
+
- 个体效应被视为随机变量
|
|
296
|
+
- 允许个体间存在相关性
|
|
297
|
+
- 比固定效应模型更高效
|
|
298
|
+
- 可以估计不随时间变化的变量
|
|
299
|
+
|
|
300
|
+
与固定效应比较:
|
|
301
|
+
- 随机效应假设更强(个体效应与解释变量不相关)
|
|
302
|
+
- 固定效应更稳健但损失信息
|
|
303
|
+
- 可通过Hausman检验选择合适模型
|
|
304
|
+
|
|
305
|
+
数据要求:
|
|
306
|
+
- 与固定效应模型相同的数据格式
|
|
307
|
+
- 需要实体ID和时间信息""",
|
|
112
308
|
field_descriptions={
|
|
113
|
-
"file_path": "CSV
|
|
114
|
-
"file_content": "
|
|
115
|
-
"file_format": "
|
|
116
|
-
"y_data": "
|
|
117
|
-
"x_data": "
|
|
118
|
-
"entity_ids": "实体ID
|
|
119
|
-
"time_periods": "
|
|
120
|
-
"feature_names": "
|
|
121
|
-
"entity_effects": "
|
|
122
|
-
"time_effects": "
|
|
123
|
-
}
|
|
309
|
+
"file_path": "CSV文件路径。必须包含实体ID列和时间列,支持自动识别",
|
|
310
|
+
"file_content": "文件内容字符串。CSV格式的面板数据",
|
|
311
|
+
"file_format": "文件格式: csv/auto",
|
|
312
|
+
"y_data": "因变量数据列表,数值格式",
|
|
313
|
+
"x_data": "自变量数据矩阵,二维列表格式",
|
|
314
|
+
"entity_ids": "实体ID列表,字符串格式",
|
|
315
|
+
"time_periods": "时间周期列表,字符串格式",
|
|
316
|
+
"feature_names": "自变量名称列表",
|
|
317
|
+
"entity_effects": "是否包含实体随机效应,默认True",
|
|
318
|
+
"time_effects": "是否包含时间随机效应,默认False"
|
|
319
|
+
},
|
|
320
|
+
examples=[
|
|
321
|
+
"分析企业特征对绩效的影响(假设企业效应随机)",
|
|
322
|
+
"研究家庭特征对消费行为的影响",
|
|
323
|
+
"评估地区特征对经济发展的影响"
|
|
324
|
+
],
|
|
325
|
+
use_cases=[
|
|
326
|
+
"大样本面板数据分析",
|
|
327
|
+
"个体效应与解释变量相关性较弱的情况",
|
|
328
|
+
"需要估计不随时间变化变量的影响",
|
|
329
|
+
"效率优先的分析场景"
|
|
330
|
+
]
|
|
124
331
|
)
|
|
125
332
|
|
|
126
333
|
PANEL_HAUSMAN_TEST = ToolDescription(
|
|
127
334
|
name="panel_hausman_test",
|
|
128
|
-
description="Hausman检验
|
|
335
|
+
description="""Hausman检验
|
|
336
|
+
|
|
337
|
+
功能说明:
|
|
338
|
+
- 检验固定效应模型与随机效应模型的选择
|
|
339
|
+
- 基于模型估计差异的统计检验
|
|
340
|
+
- 帮助选择合适的面板数据模型
|
|
341
|
+
- 提供检验统计量和p值
|
|
342
|
+
|
|
343
|
+
检验原理:
|
|
344
|
+
- 零假设: 随机效应模型是合适的
|
|
345
|
+
- 备择假设: 固定效应模型更合适
|
|
346
|
+
- 检验统计量服从卡方分布
|
|
347
|
+
|
|
348
|
+
决策规则:
|
|
349
|
+
- p值 < 0.05: 拒绝零假设,选择固定效应模型
|
|
350
|
+
- p值 >= 0.05: 不拒绝零假设,选择随机效应模型
|
|
351
|
+
|
|
352
|
+
数据要求:
|
|
353
|
+
- 与固定效应和随机效应模型相同的数据格式""",
|
|
129
354
|
field_descriptions={
|
|
130
|
-
"file_path": "CSV
|
|
131
|
-
"file_content": "
|
|
132
|
-
"file_format": "
|
|
133
|
-
"y_data": "
|
|
134
|
-
"x_data": "
|
|
355
|
+
"file_path": "CSV文件路径。必须包含实体ID列和时间列",
|
|
356
|
+
"file_content": "文件内容字符串。面板数据格式",
|
|
357
|
+
"file_format": "文件格式: csv/auto",
|
|
358
|
+
"y_data": "因变量数据列表",
|
|
359
|
+
"x_data": "自变量数据矩阵",
|
|
135
360
|
"entity_ids": "实体ID列表",
|
|
136
361
|
"time_periods": "时间周期列表",
|
|
137
|
-
"feature_names": "
|
|
138
|
-
}
|
|
362
|
+
"feature_names": "自变量名称列表"
|
|
363
|
+
},
|
|
364
|
+
examples=[
|
|
365
|
+
"检验企业面板数据应该使用固定效应还是随机效应模型",
|
|
366
|
+
"选择国家面板数据的合适模型形式",
|
|
367
|
+
"确定个体效应是否与解释变量相关"
|
|
368
|
+
],
|
|
369
|
+
use_cases=[
|
|
370
|
+
"面板数据模型选择",
|
|
371
|
+
"固定效应与随机效应比较",
|
|
372
|
+
"模型设定检验",
|
|
373
|
+
"实证研究模型验证"
|
|
374
|
+
]
|
|
139
375
|
)
|
|
140
376
|
|
|
141
377
|
PANEL_UNIT_ROOT_TEST = ToolDescription(
|
|
142
378
|
name="panel_unit_root_test",
|
|
143
|
-
description="面板单位根检验
|
|
379
|
+
description="""面板单位根检验
|
|
380
|
+
|
|
381
|
+
功能说明:
|
|
382
|
+
- 检验面板数据中变量的平稳性
|
|
383
|
+
- 支持多种面板单位根检验方法
|
|
384
|
+
- 检测面板数据的非平稳性
|
|
385
|
+
- 为面板协整分析提供基础
|
|
386
|
+
|
|
387
|
+
检验类型:
|
|
388
|
+
- levinlin: Levin-Lin-Chu检验,假设共同单位根过程
|
|
389
|
+
- 其他方法: 支持多种面板单位根检验
|
|
390
|
+
|
|
391
|
+
数据要求:
|
|
392
|
+
- 至少3个实体,每个实体至少5个时间点
|
|
393
|
+
- 平衡或不平衡面板数据
|
|
394
|
+
- 包含实体ID和时间信息
|
|
395
|
+
|
|
396
|
+
应用意义:
|
|
397
|
+
- 平稳性是面板数据建模的前提
|
|
398
|
+
- 非平稳数据可能导致伪回归
|
|
399
|
+
- 为面板协整分析做准备""",
|
|
144
400
|
field_descriptions={
|
|
145
|
-
"file_path": "CSV
|
|
146
|
-
"file_content": "
|
|
147
|
-
"file_format": "
|
|
148
|
-
"data": "
|
|
149
|
-
"y_data": "因变量数据",
|
|
150
|
-
"x_data": "自变量数据",
|
|
151
|
-
"entity_ids": "实体ID
|
|
152
|
-
"time_periods": "
|
|
153
|
-
"feature_names": "特征名称",
|
|
154
|
-
"test_type": "
|
|
155
|
-
}
|
|
401
|
+
"file_path": "CSV文件路径。必须包含实体ID列和时间列,数据量要求: 至少3个实体,每个实体至少5个时间点",
|
|
402
|
+
"file_content": "文件内容字符串。面板数据格式,满足最小数据量要求",
|
|
403
|
+
"file_format": "文件格式: csv/auto",
|
|
404
|
+
"data": "时间序列数据,单变量格式",
|
|
405
|
+
"y_data": "因变量数据(从面板数据转换)",
|
|
406
|
+
"x_data": "自变量数据(从面板数据转换,通常忽略)",
|
|
407
|
+
"entity_ids": "实体ID列表,用于识别不同个体",
|
|
408
|
+
"time_periods": "时间周期列表,用于时间维度识别",
|
|
409
|
+
"feature_names": "特征名称(从面板数据转换,通常忽略)",
|
|
410
|
+
"test_type": "检验类型: levinlin(默认)/其他面板单位根检验方法"
|
|
411
|
+
},
|
|
412
|
+
examples=[
|
|
413
|
+
"检验各国GDP面板数据是否平稳",
|
|
414
|
+
"检测公司股价面板数据的单位根",
|
|
415
|
+
"验证宏观经济面板变量的平稳性"
|
|
416
|
+
],
|
|
417
|
+
use_cases=[
|
|
418
|
+
"面板数据平稳性检验",
|
|
419
|
+
"面板协整分析前提检验",
|
|
420
|
+
"面板数据建模前的诊断",
|
|
421
|
+
"非平稳面板数据处理"
|
|
422
|
+
]
|
|
156
423
|
)
|
|
157
424
|
|
|
158
425
|
|
|
@@ -162,29 +429,96 @@ PANEL_UNIT_ROOT_TEST = ToolDescription(
|
|
|
162
429
|
|
|
163
430
|
VAR_MODEL_ANALYSIS = ToolDescription(
|
|
164
431
|
name="var_model_analysis",
|
|
165
|
-
description="VAR模型分析
|
|
432
|
+
description="""VAR模型分析
|
|
433
|
+
|
|
434
|
+
功能说明:
|
|
435
|
+
- 向量自回归(VAR)模型分析
|
|
436
|
+
- 分析多个时间序列变量间的动态关系
|
|
437
|
+
- 估计变量间的相互影响和滞后效应
|
|
438
|
+
- 进行脉冲响应分析和预测
|
|
439
|
+
|
|
440
|
+
模型特点:
|
|
441
|
+
- 多变量时间序列建模
|
|
442
|
+
- 变量间相互影响分析
|
|
443
|
+
- 滞后效应估计
|
|
444
|
+
- 动态系统建模
|
|
445
|
+
|
|
446
|
+
信息准则类型:
|
|
447
|
+
- aic: Akaike信息准则
|
|
448
|
+
- bic: Bayesian信息准则
|
|
449
|
+
- hqic: Hannan-Quinn信息准则
|
|
450
|
+
|
|
451
|
+
应用场景:
|
|
452
|
+
- 宏观经济变量联动分析
|
|
453
|
+
- 金融市场波动传导
|
|
454
|
+
- 多变量预测建模""",
|
|
166
455
|
field_descriptions={
|
|
167
|
-
"file_path": "
|
|
168
|
-
"file_content": "
|
|
169
|
-
"file_format": "
|
|
170
|
-
"data": "
|
|
171
|
-
"max_lags": "
|
|
172
|
-
"ic": "
|
|
173
|
-
}
|
|
456
|
+
"file_path": "多变量时间序列文件路径。支持CSV/JSON格式",
|
|
457
|
+
"file_content": "文件内容字符串。多变量时间序列数据",
|
|
458
|
+
"file_format": "文件格式: csv/json/auto",
|
|
459
|
+
"data": "多变量时间序列数据字典,如 {'GDP': [值], 'CPI': [值], ...}",
|
|
460
|
+
"max_lags": "最大滞后阶数,用于模型阶数选择,默认5",
|
|
461
|
+
"ic": "信息准则类型: aic(默认)/bic/hqic,用于最优滞后阶数选择"
|
|
462
|
+
},
|
|
463
|
+
examples=[
|
|
464
|
+
"分析GDP、CPI、利率等宏观经济变量的动态关系",
|
|
465
|
+
"研究股票市场、债券市场、外汇市场的联动效应",
|
|
466
|
+
"预测多变量经济系统的未来走势"
|
|
467
|
+
],
|
|
468
|
+
use_cases=[
|
|
469
|
+
"宏观经济政策分析",
|
|
470
|
+
"金融市场联动研究",
|
|
471
|
+
"多变量预测建模",
|
|
472
|
+
"动态系统分析"
|
|
473
|
+
]
|
|
174
474
|
)
|
|
175
475
|
|
|
176
476
|
VECM_MODEL_ANALYSIS = ToolDescription(
|
|
177
477
|
name="vecm_model_analysis",
|
|
178
|
-
description="VECM模型分析
|
|
478
|
+
description="""VECM模型分析
|
|
479
|
+
|
|
480
|
+
功能说明:
|
|
481
|
+
- 向量误差修正模型(VECM)分析
|
|
482
|
+
- 处理非平稳时间序列的协整关系
|
|
483
|
+
- 估计长期均衡关系和短期调整机制
|
|
484
|
+
- 分析变量间的长期和短期动态
|
|
485
|
+
|
|
486
|
+
模型特点:
|
|
487
|
+
- 基于VAR模型的协整扩展
|
|
488
|
+
- 长期均衡关系建模
|
|
489
|
+
- 短期调整机制分析
|
|
490
|
+
- 误差修正项估计
|
|
491
|
+
|
|
492
|
+
确定性项类型:
|
|
493
|
+
- co: 常数项在协整关系中
|
|
494
|
+
- c: 常数项在VAR中
|
|
495
|
+
- ct: 常数项和趋势项
|
|
496
|
+
- none: 无确定性项
|
|
497
|
+
|
|
498
|
+
应用场景:
|
|
499
|
+
- 非平稳时间序列的长期关系分析
|
|
500
|
+
- 经济变量的均衡关系研究
|
|
501
|
+
- 协整系统的动态调整分析""",
|
|
179
502
|
field_descriptions={
|
|
180
|
-
"file_path": "
|
|
181
|
-
"file_content": "
|
|
182
|
-
"file_format": "
|
|
183
|
-
"data": "
|
|
184
|
-
"coint_rank": "
|
|
185
|
-
"deterministic": "
|
|
186
|
-
"max_lags": "
|
|
187
|
-
}
|
|
503
|
+
"file_path": "多变量时间序列文件路径。支持非平稳时间序列",
|
|
504
|
+
"file_content": "文件内容字符串。多变量非平稳时间序列",
|
|
505
|
+
"file_format": "文件格式: csv/json/auto",
|
|
506
|
+
"data": "多变量时间序列数据字典",
|
|
507
|
+
"coint_rank": "协整秩,表示协整关系数量,默认1",
|
|
508
|
+
"deterministic": "确定性项类型: co(默认)/c/ct/none",
|
|
509
|
+
"max_lags": "最大滞后阶数,用于模型估计,默认5"
|
|
510
|
+
},
|
|
511
|
+
examples=[
|
|
512
|
+
"分析GDP和消费的长期均衡关系",
|
|
513
|
+
"研究汇率和利率的协整关系",
|
|
514
|
+
"估计股票价格和交易量的误差修正机制"
|
|
515
|
+
],
|
|
516
|
+
use_cases=[
|
|
517
|
+
"非平稳时间序列建模",
|
|
518
|
+
"长期均衡关系分析",
|
|
519
|
+
"协整系统动态研究",
|
|
520
|
+
"经济变量均衡分析"
|
|
521
|
+
]
|
|
188
522
|
)
|
|
189
523
|
|
|
190
524
|
GARCH_MODEL_ANALYSIS = ToolDescription(
|
|
@@ -267,16 +601,62 @@ GRADIENT_BOOSTING_REGRESSION_ANALYSIS = ToolDescription(
|
|
|
267
601
|
|
|
268
602
|
LASSO_REGRESSION_ANALYSIS = ToolDescription(
|
|
269
603
|
name="lasso_regression_analysis",
|
|
270
|
-
description="Lasso
|
|
604
|
+
description="""Lasso回归分析
|
|
605
|
+
|
|
606
|
+
📊 功能说明:
|
|
607
|
+
Lasso回归使用L1正则化进行特征选择和稀疏建模,能够自动将不重要的特征系数压缩为0。
|
|
608
|
+
|
|
609
|
+
📈 算法特点:
|
|
610
|
+
- 特征选择:自动识别重要特征,压缩冗余特征系数为0
|
|
611
|
+
- 稀疏解:产生稀疏的系数向量,提高模型可解释性
|
|
612
|
+
- 处理多重共线性:对高度相关的特征进行选择
|
|
613
|
+
- 正则化强度控制:通过alpha参数控制特征选择的严格程度
|
|
614
|
+
|
|
615
|
+
💡 适用场景:
|
|
616
|
+
- 高维数据特征选择(特征数量 > 样本数量)
|
|
617
|
+
- 多重共线性问题
|
|
618
|
+
- 稀疏建模需求
|
|
619
|
+
- 可解释性要求高的场景
|
|
620
|
+
- 变量筛选和降维
|
|
621
|
+
|
|
622
|
+
⚠️ 注意事项:
|
|
623
|
+
- 对alpha参数敏感,建议尝试多个值(如0.01, 0.1, 1.0, 10.0)
|
|
624
|
+
- 可能过度压缩重要特征,导致信息损失
|
|
625
|
+
- 需要数据标准化
|
|
626
|
+
- R²为负值时表明模型性能比简单均值预测更差
|
|
627
|
+
- 样本量过小时可能不稳定
|
|
628
|
+
|
|
629
|
+
🔧 参数建议:
|
|
630
|
+
- alpha: 正则化强度,默认1.0
|
|
631
|
+
- 小alpha(0.01-0.1): 轻微正则化,保留更多特征
|
|
632
|
+
- 中等alpha(0.1-1.0): 平衡特征选择和模型拟合
|
|
633
|
+
- 大alpha(>1.0): 强正则化,压缩更多特征
|
|
634
|
+
|
|
635
|
+
📋 数据要求:
|
|
636
|
+
- 至少5个样本
|
|
637
|
+
- 数值型数据
|
|
638
|
+
- 建议特征数量不超过样本数量的80%""",
|
|
271
639
|
field_descriptions={
|
|
272
|
-
"file_path": "
|
|
273
|
-
"file_content": "
|
|
274
|
-
"file_format": "
|
|
275
|
-
"y_data": "
|
|
276
|
-
"x_data": "
|
|
277
|
-
"feature_names": "
|
|
278
|
-
"alpha": "
|
|
279
|
-
}
|
|
640
|
+
"file_path": "CSV/JSON文件路径。CSV格式: 最后一列为因变量,其余列为自变量",
|
|
641
|
+
"file_content": "文件内容字符串。JSON格式: {'y': [因变量], 'x1': [自变量1], ...}",
|
|
642
|
+
"file_format": "文件格式: csv/json/auto",
|
|
643
|
+
"y_data": "因变量数据列表,数值格式,如 [1.2, 3.4, 5.6, ...]",
|
|
644
|
+
"x_data": "自变量数据矩阵,二维列表格式,如 [[1, 2], [3, 4], [5, 6], ...]",
|
|
645
|
+
"feature_names": "自变量名称列表,如 ['GDP', 'Population', 'Investment']",
|
|
646
|
+
"alpha": "正则化强度参数,控制特征选择的严格程度,默认1.0。建议尝试多个值进行调优"
|
|
647
|
+
},
|
|
648
|
+
examples=[
|
|
649
|
+
"从100个经济指标中选择影响GDP增长的关键因素",
|
|
650
|
+
"在消费者行为数据中识别最重要的预测变量",
|
|
651
|
+
"处理高度相关的宏观经济变量进行预测建模"
|
|
652
|
+
],
|
|
653
|
+
use_cases=[
|
|
654
|
+
"高维数据特征选择",
|
|
655
|
+
"变量重要性排序",
|
|
656
|
+
"多重共线性处理",
|
|
657
|
+
"稀疏线性建模",
|
|
658
|
+
"可解释机器学习"
|
|
659
|
+
]
|
|
280
660
|
)
|
|
281
661
|
|
|
282
662
|
RIDGE_REGRESSION_ANALYSIS = ToolDescription(
|
|
@@ -228,28 +228,92 @@ async def handle_correlation_analysis(ctx, data: Dict[str, List[float]],
|
|
|
228
228
|
|
|
229
229
|
|
|
230
230
|
# 面板数据处理器
|
|
231
|
-
async def handle_panel_fixed_effects(ctx, y_data, x_data, entity_ids, time_periods,
|
|
231
|
+
async def handle_panel_fixed_effects(ctx, y_data, x_data, entity_ids, time_periods,
|
|
232
232
|
feature_names=None, entity_effects=True, time_effects=False, **kwargs):
|
|
233
|
+
"""处理固定效应模型 - 统一输出格式"""
|
|
233
234
|
result = fixed_effects_model(y_data, x_data, entity_ids, time_periods, feature_names, entity_effects, time_effects)
|
|
235
|
+
|
|
236
|
+
# 构建详细的结果文本
|
|
237
|
+
result_text = f"""📊 固定效应模型分析结果
|
|
238
|
+
|
|
239
|
+
🔍 模型拟合信息:
|
|
240
|
+
- R² = {result.rsquared:.4f}
|
|
241
|
+
- 调整R² = {result.rsquared_adj:.4f}
|
|
242
|
+
- F统计量 = {result.f_statistic:.4f} (p = {result.f_pvalue:.4f})
|
|
243
|
+
- AIC = {result.aic:.2f}, BIC = {result.bic:.2f}
|
|
244
|
+
- 观测数量 = {result.n_obs}
|
|
245
|
+
- 个体效应 = {'是' if result.entity_effects else '否'}
|
|
246
|
+
- 时间效应 = {'是' if result.time_effects else '否'}
|
|
247
|
+
|
|
248
|
+
📈 回归系数详情:"""
|
|
249
|
+
|
|
250
|
+
# 添加系数信息
|
|
251
|
+
for var_name, coef_info in result.coefficients.items():
|
|
252
|
+
significance = "***" if coef_info["p_value"] < 0.01 else "**" if coef_info["p_value"] < 0.05 else "*" if coef_info["p_value"] < 0.1 else ""
|
|
253
|
+
result_text += f"\n- {var_name}: {coef_info['coef']:.4f}{significance} (se={coef_info['std_err']:.4f}, p={coef_info['p_value']:.4f})"
|
|
254
|
+
|
|
255
|
+
result_text += "\n\n💡 模型说明:固定效应模型通过组内变换消除个体固定差异,适用于个体间存在不可观测固定特征的情况。"
|
|
256
|
+
|
|
234
257
|
return CallToolResult(
|
|
235
|
-
content=[TextContent(type="text", text=
|
|
258
|
+
content=[TextContent(type="text", text=result_text)],
|
|
236
259
|
structuredContent=result.model_dump()
|
|
237
260
|
)
|
|
238
261
|
|
|
239
262
|
|
|
240
263
|
async def handle_panel_random_effects(ctx, y_data, x_data, entity_ids, time_periods,
|
|
241
264
|
feature_names=None, entity_effects=True, time_effects=False, **kwargs):
|
|
265
|
+
"""处理随机效应模型 - 统一输出格式"""
|
|
242
266
|
result = random_effects_model(y_data, x_data, entity_ids, time_periods, feature_names, entity_effects, time_effects)
|
|
267
|
+
|
|
268
|
+
# 构建详细的结果文本
|
|
269
|
+
result_text = f"""📊 随机效应模型分析结果
|
|
270
|
+
|
|
271
|
+
🔍 模型拟合信息:
|
|
272
|
+
- R² = {result.rsquared:.4f}
|
|
273
|
+
- 调整R² = {result.rsquared_adj:.4f}
|
|
274
|
+
- F统计量 = {result.f_statistic:.4f} (p = {result.f_pvalue:.4f})
|
|
275
|
+
- AIC = {result.aic:.2f}, BIC = {result.bic:.2f}
|
|
276
|
+
- 观测数量 = {result.n_obs}
|
|
277
|
+
- 个体效应 = {'是' if result.entity_effects else '否'}
|
|
278
|
+
- 时间效应 = {'是' if result.time_effects else '否'}
|
|
279
|
+
|
|
280
|
+
📈 回归系数详情:"""
|
|
281
|
+
|
|
282
|
+
# 添加系数信息
|
|
283
|
+
for var_name, coef_info in result.coefficients.items():
|
|
284
|
+
significance = "***" if coef_info["p_value"] < 0.01 else "**" if coef_info["p_value"] < 0.05 else "*" if coef_info["p_value"] < 0.1 else ""
|
|
285
|
+
result_text += f"\n- {var_name}: {coef_info['coef']:.4f}{significance} (se={coef_info['std_err']:.4f}, p={coef_info['p_value']:.4f})"
|
|
286
|
+
|
|
287
|
+
result_text += "\n\n💡 模型说明:随机效应模型假设个体差异是随机的,比固定效应模型更有效率,但需要满足个体效应与解释变量不相关的假设。"
|
|
288
|
+
|
|
243
289
|
return CallToolResult(
|
|
244
|
-
content=[TextContent(type="text", text=
|
|
290
|
+
content=[TextContent(type="text", text=result_text)],
|
|
245
291
|
structuredContent=result.model_dump()
|
|
246
292
|
)
|
|
247
293
|
|
|
248
294
|
|
|
249
295
|
async def handle_panel_hausman_test(ctx, y_data, x_data, entity_ids, time_periods, feature_names=None, **kwargs):
|
|
296
|
+
"""处理Hausman检验 - 统一输出格式"""
|
|
250
297
|
result = hausman_test(y_data, x_data, entity_ids, time_periods, feature_names)
|
|
298
|
+
|
|
299
|
+
result_text = f"""📊 Hausman检验结果
|
|
300
|
+
|
|
301
|
+
🔍 检验信息:
|
|
302
|
+
- 检验统计量 = {result.statistic:.4f}
|
|
303
|
+
- p值 = {result.p_value:.4f}
|
|
304
|
+
- 显著性 = {'是' if result.significant else '否'} (5%水平)
|
|
305
|
+
|
|
306
|
+
💡 模型选择建议:
|
|
307
|
+
{result.recommendation}
|
|
308
|
+
|
|
309
|
+
📋 决策规则:
|
|
310
|
+
- p值 < 0.05: 拒绝原假设,选择固定效应模型
|
|
311
|
+
- p值 >= 0.05: 不能拒绝原假设,选择随机效应模型
|
|
312
|
+
|
|
313
|
+
🔬 检验原理:Hausman检验用于判断个体效应是否与解释变量相关。原假设为随机效应模型是一致的。"""
|
|
314
|
+
|
|
251
315
|
return CallToolResult(
|
|
252
|
-
content=[TextContent(type="text", text=
|
|
316
|
+
content=[TextContent(type="text", text=result_text)],
|
|
253
317
|
structuredContent=result.model_dump()
|
|
254
318
|
)
|
|
255
319
|
|
|
@@ -347,17 +411,81 @@ async def handle_gradient_boosting(ctx, y_data, x_data, feature_names=None,
|
|
|
347
411
|
|
|
348
412
|
|
|
349
413
|
async def handle_lasso_regression(ctx, y_data, x_data, feature_names=None, alpha=1.0, **kwargs):
|
|
414
|
+
"""处理Lasso回归 - 统一输出格式"""
|
|
350
415
|
result = lasso_regression(y_data, x_data, feature_names, alpha)
|
|
416
|
+
|
|
417
|
+
# 检查R²是否为负值
|
|
418
|
+
r2_warning = ""
|
|
419
|
+
if result.r2_score < 0:
|
|
420
|
+
r2_warning = f"\n⚠️ 警告:R²为负值({result.r2_score:.4f}),表明模型性能比简单均值预测更差。建议:1) 检查数据质量 2) 尝试更小的alpha值 3) 增加样本数量"
|
|
421
|
+
|
|
422
|
+
# 检查系数是否全为0
|
|
423
|
+
coef_warning = ""
|
|
424
|
+
if all(abs(coef) < 1e-10 for coef in result.coefficients.values()):
|
|
425
|
+
coef_warning = f"\n⚠️ 警告:所有系数都被压缩为0,正则化参数alpha={alpha}可能过大,建议减小alpha值"
|
|
426
|
+
|
|
427
|
+
# 构建详细的结果文本
|
|
428
|
+
result_text = f"""📊 Lasso回归分析结果
|
|
429
|
+
|
|
430
|
+
🔍 模型拟合信息:
|
|
431
|
+
- R² = {result.r2_score:.4f}
|
|
432
|
+
- 均方误差(MSE) = {result.mse:.4f}
|
|
433
|
+
- 平均绝对误差(MAE) = {result.mae:.4f}
|
|
434
|
+
- 样本数量 = {result.n_obs}
|
|
435
|
+
- 正则化参数(alpha) = {result.alpha}
|
|
436
|
+
{r2_warning}{coef_warning}
|
|
437
|
+
|
|
438
|
+
📈 回归系数详情:"""
|
|
439
|
+
|
|
440
|
+
# 添加系数信息,按绝对值排序
|
|
441
|
+
sorted_coefficients = sorted(result.coefficients.items(), key=lambda x: abs(x[1]), reverse=True)
|
|
442
|
+
for var_name, coef in sorted_coefficients:
|
|
443
|
+
if abs(coef) > 1e-10: # 只显示非零系数
|
|
444
|
+
result_text += f"\n- {var_name}: {coef:.4f}"
|
|
445
|
+
else:
|
|
446
|
+
result_text += f"\n- {var_name}: 0.0000 (被压缩)"
|
|
447
|
+
|
|
448
|
+
result_text += f"\n\n💡 模型说明:Lasso回归使用L1正则化进行特征选择,能够自动将不重要的特征系数压缩为0,适用于高维数据和特征选择场景。"
|
|
449
|
+
result_text += f"\n\n⚠️ 注意事项:由于数据标准化,系数大小需要谨慎解释。"
|
|
450
|
+
|
|
351
451
|
return CallToolResult(
|
|
352
|
-
content=[TextContent(type="text", text=
|
|
452
|
+
content=[TextContent(type="text", text=result_text)],
|
|
353
453
|
structuredContent=result.model_dump()
|
|
354
454
|
)
|
|
355
455
|
|
|
356
456
|
|
|
357
457
|
async def handle_ridge_regression(ctx, y_data, x_data, feature_names=None, alpha=1.0, **kwargs):
|
|
458
|
+
"""处理Ridge回归 - 统一输出格式"""
|
|
358
459
|
result = ridge_regression(y_data, x_data, feature_names, alpha)
|
|
460
|
+
|
|
461
|
+
# 检查R²是否为负值
|
|
462
|
+
r2_warning = ""
|
|
463
|
+
if result.r2_score < 0:
|
|
464
|
+
r2_warning = f"\n⚠️ 警告:R²为负值({result.r2_score:.4f}),表明模型性能比简单均值预测更差。建议:1) 检查数据质量 2) 尝试更小的alpha值 3) 增加样本数量"
|
|
465
|
+
|
|
466
|
+
# 构建详细的结果文本
|
|
467
|
+
result_text = f"""📊 Ridge回归分析结果
|
|
468
|
+
|
|
469
|
+
🔍 模型拟合信息:
|
|
470
|
+
- R² = {result.r2_score:.4f}
|
|
471
|
+
- 均方误差(MSE) = {result.mse:.4f}
|
|
472
|
+
- 平均绝对误差(MAE) = {result.mae:.4f}
|
|
473
|
+
- 样本数量 = {result.n_obs}
|
|
474
|
+
- 正则化参数(alpha) = {result.alpha}
|
|
475
|
+
{r2_warning}
|
|
476
|
+
|
|
477
|
+
📈 回归系数详情:"""
|
|
478
|
+
|
|
479
|
+
# 添加系数信息,按绝对值排序
|
|
480
|
+
sorted_coefficients = sorted(result.coefficients.items(), key=lambda x: abs(x[1]), reverse=True)
|
|
481
|
+
for var_name, coef in sorted_coefficients:
|
|
482
|
+
result_text += f"\n- {var_name}: {coef:.4f}"
|
|
483
|
+
|
|
484
|
+
result_text += f"\n\n💡 模型说明:Ridge回归使用L2正则化处理多重共线性问题,对所有系数进行收缩但不进行特征选择,适用于需要稳定估计的场景。"
|
|
485
|
+
result_text += f"\n\n⚠️ 注意事项:由于数据标准化,系数大小需要谨慎解释。"
|
|
486
|
+
|
|
359
487
|
return CallToolResult(
|
|
360
|
-
content=[TextContent(type="text", text=
|
|
488
|
+
content=[TextContent(type="text", text=result_text)],
|
|
361
489
|
structuredContent=result.model_dump()
|
|
362
490
|
)
|
|
363
491
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aigroup-econ-mcp
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: 专业计量经济学MCP工具 -
|
|
3
|
+
Version: 0.7.0
|
|
4
|
+
Summary: 专业计量经济学MCP工具 - 让大模型直接进行数据分析(优化版:增强工具描述,提升大模型调用体验)
|
|
5
5
|
Project-URL: Homepage, https://github.com/aigroup/aigroup-econ-mcp
|
|
6
6
|
Project-URL: Repository, https://github.com/aigroup/aigroup-econ-mcp.git
|
|
7
7
|
Project-URL: Issues, https://github.com/aigroup/aigroup-econ-mcp/issues
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
aigroup_econ_mcp/__init__.py,sha256
|
|
1
|
+
aigroup_econ_mcp/__init__.py,sha256=-mhTcro4v3VCeyT-6G6yFwfwcW15xLnKLigWSUdN7Ws,511
|
|
2
2
|
aigroup_econ_mcp/cli.py,sha256=7yeNXWNwMdpUswAO4LsqAvb0EmCO3S6Bs6sl483uSXI,3363
|
|
3
3
|
aigroup_econ_mcp/config.py,sha256=ab5X4-H8isIe2nma0c0AOqlyYgwhf5kfe9Zx5XRrzIo,18876
|
|
4
|
-
aigroup_econ_mcp/server.py,sha256=
|
|
4
|
+
aigroup_econ_mcp/server.py,sha256=pmE-n8NwU3xqzJBVdgXBTSSHmt_RDIG9lYMYi8rL9fM,30899
|
|
5
5
|
aigroup_econ_mcp/tools/__init__.py,sha256=WYrsZX3Emv09c8QikvtG2BouUFZCguYkQ7eDjuwarAg,396
|
|
6
6
|
aigroup_econ_mcp/tools/base.py,sha256=Mv_mcKVTIg9A2dsqBBiU74_Ai2nb5sn2S3U4CNOxLKw,15218
|
|
7
7
|
aigroup_econ_mcp/tools/cache.py,sha256=Urv2zuycp5dS7Qh-XQWEMrwszq9RZ-il8cz_-WniGgc,15311
|
|
@@ -11,20 +11,20 @@ aigroup_econ_mcp/tools/machine_learning.py,sha256=PpxrJVJw4eND95Wl0uGPEqUHXrIwTU
|
|
|
11
11
|
aigroup_econ_mcp/tools/ml_ensemble.py,sha256=XOL0PzCsx9LY_pFbKCAxjYdGny-HqEhlZyov2r1l3ww,6475
|
|
12
12
|
aigroup_econ_mcp/tools/ml_evaluation.py,sha256=hiwVW3-N0hnSAJfZW4luOCXt3sTh1W9Hj3CwZLRVaJk,8900
|
|
13
13
|
aigroup_econ_mcp/tools/ml_models.py,sha256=hJEUgARxkqYgJqu6_7eRc1WnD2HcTGxtXf8Jre_XO1U,2137
|
|
14
|
-
aigroup_econ_mcp/tools/ml_regularization.py,sha256=
|
|
14
|
+
aigroup_econ_mcp/tools/ml_regularization.py,sha256=qOWXiOZqB-IUvjHLrgKWWjNhuuxZm_both2aR-OBs1U,6124
|
|
15
15
|
aigroup_econ_mcp/tools/monitoring.py,sha256=-hcw5nu5Q91FmDz39mRBsKavrTmEqXsKfGzlXr_5f0c,16708
|
|
16
16
|
aigroup_econ_mcp/tools/optimized_example.py,sha256=tZVQ2jTzHY_zixTynm4Sq8gj5hz6eWg7MKqNwsxrPoQ,6784
|
|
17
|
-
aigroup_econ_mcp/tools/panel_data.py,sha256=
|
|
17
|
+
aigroup_econ_mcp/tools/panel_data.py,sha256=qFZICvt9Plt2bOvCCgAveVncb_QpHvWzDssdQntKf5M,22696
|
|
18
18
|
aigroup_econ_mcp/tools/regression.py,sha256=uMGRGUQo4mU1sb8fwpP2FpkCqt_e9AtqEtUpInACtJo,6443
|
|
19
19
|
aigroup_econ_mcp/tools/statistics.py,sha256=2cHgNSUXwPYPLxntVOEOL8yF-x92mrgjK-R8kkxDihg,4239
|
|
20
20
|
aigroup_econ_mcp/tools/time_series.py,sha256=LNCO0bYXLPilQ2kSVXA3woNp8ERVq7n3jaoQhWgTCJQ,21763
|
|
21
21
|
aigroup_econ_mcp/tools/timeout.py,sha256=vNnGsR0sXW1xvIbKCF-qPUU3QNDAn_MaQgSxbGxkfW4,8404
|
|
22
|
-
aigroup_econ_mcp/tools/tool_descriptions.py,sha256=
|
|
23
|
-
aigroup_econ_mcp/tools/tool_handlers.py,sha256=
|
|
22
|
+
aigroup_econ_mcp/tools/tool_descriptions.py,sha256=yJ6c9Ue3r9HAh3o2t2aGQUu6xfZwJE8B6wC6cqDypDI,28717
|
|
23
|
+
aigroup_econ_mcp/tools/tool_handlers.py,sha256=HZz_AvDtoMzqRmpu6ibZaEUEVUlqsLNifTdlVHEtInk,20613
|
|
24
24
|
aigroup_econ_mcp/tools/tool_registry.py,sha256=4SFpMnReZyGfEHCCDnojwHIUEpuQICS9M2u_9xuoUck,4413
|
|
25
25
|
aigroup_econ_mcp/tools/validation.py,sha256=F7LHwog5xtFIMjD9D48kd8jAF5MsZb7wjdrgaOg8EKo,16657
|
|
26
|
-
aigroup_econ_mcp-0.
|
|
27
|
-
aigroup_econ_mcp-0.
|
|
28
|
-
aigroup_econ_mcp-0.
|
|
29
|
-
aigroup_econ_mcp-0.
|
|
30
|
-
aigroup_econ_mcp-0.
|
|
26
|
+
aigroup_econ_mcp-0.7.0.dist-info/METADATA,sha256=_GY3y5qGca64s-WWHsdw59nT7aG0wUEZgpLdrnFKvzo,10866
|
|
27
|
+
aigroup_econ_mcp-0.7.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
28
|
+
aigroup_econ_mcp-0.7.0.dist-info/entry_points.txt,sha256=j5ZJYOc4lAZV-X3XkAuGhzHtIRcJtZ6Gz8ZKPY_QTrM,62
|
|
29
|
+
aigroup_econ_mcp-0.7.0.dist-info/licenses/LICENSE,sha256=DoyCJUWlDzKbqc5KRbFpsGYLwLh-XJRHKQDoITjb1yc,1083
|
|
30
|
+
aigroup_econ_mcp-0.7.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|