aigroup-econ-mcp 0.8.0__tar.gz → 1.0.0__tar.gz

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.

Files changed (30) hide show
  1. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/PKG-INFO +1 -1
  2. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/pyproject.toml +1 -1
  3. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/__init__.py +1 -1
  4. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/server.py +2 -2
  5. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/tool_handlers.py +119 -45
  6. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/.gitignore +0 -0
  7. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/LICENSE +0 -0
  8. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/README.md +0 -0
  9. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/cli.py +0 -0
  10. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/config.py +0 -0
  11. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/__init__.py +0 -0
  12. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/base.py +0 -0
  13. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/cache.py +0 -0
  14. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/data_loader.py +0 -0
  15. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/file_parser.py +0 -0
  16. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/machine_learning.py +0 -0
  17. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/ml_ensemble.py +0 -0
  18. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/ml_evaluation.py +0 -0
  19. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/ml_models.py +0 -0
  20. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/ml_regularization.py +0 -0
  21. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/monitoring.py +0 -0
  22. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/optimized_example.py +0 -0
  23. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/panel_data.py +0 -0
  24. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/regression.py +0 -0
  25. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/statistics.py +0 -0
  26. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/time_series.py +0 -0
  27. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/timeout.py +0 -0
  28. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/tool_descriptions.py +0 -0
  29. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/tool_registry.py +0 -0
  30. {aigroup_econ_mcp-0.8.0 → aigroup_econ_mcp-1.0.0}/src/aigroup_econ_mcp/tools/validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aigroup-econ-mcp
3
- Version: 0.8.0
3
+ Version: 1.0.0
4
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "aigroup-econ-mcp"
7
- version = "0.8.0"
7
+ version = "1.0.0"
8
8
  description = "专业计量经济学MCP工具 - 让大模型直接进行数据分析(优化版:统一输出格式,增强模型说明)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -10,7 +10,7 @@ AIGroup 计量经济学 MCP 服务
10
10
  - 模型诊断
11
11
  """
12
12
 
13
- __version__ = "0.7.0"
13
+ __version__ = "0.9.0"
14
14
  __author__ = "AIGroup"
15
15
  __description__ = "专业计量经济学MCP工具 - 让大模型直接进行数据分析(重构版:工具描述模块化)"
16
16
 
@@ -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.6.0"
73
+ version: str = "1.0.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.6.0")
86
+ yield AppContext(config=config, version="1.0.0")
87
87
  finally:
88
88
  pass
89
89
 
@@ -167,11 +167,28 @@ async def handle_hypothesis_testing(ctx, data1: List[float], data2: Optional[Lis
167
167
 
168
168
 
169
169
  async def handle_time_series_analysis(ctx, data: List[float], **kwargs) -> CallToolResult:
170
- """处理时间序列分析"""
170
+ """处理时间序列分析 - 增强版"""
171
171
  if not data or len(data) < 5:
172
172
  raise ValueError("时间序列数据至少需要5个观测点")
173
173
 
174
+ # 基本统计量
175
+ series = pd.Series(data)
176
+ basic_stats = {
177
+ "count": len(series),
178
+ "mean": float(series.mean()),
179
+ "std": float(series.std()),
180
+ "min": float(series.min()),
181
+ "max": float(series.max()),
182
+ "median": float(series.median()),
183
+ "skewness": float(series.skew()),
184
+ "kurtosis": float(series.kurtosis())
185
+ }
186
+
187
+ # 平稳性检验
174
188
  adf_result = stattools.adfuller(data)
189
+ kpss_result = stattools.kpss(data, regression='c', nlags='auto')
190
+
191
+ # 自相关分析
175
192
  max_nlags = min(20, len(data) - 1, len(data) // 2)
176
193
  if max_nlags < 1:
177
194
  max_nlags = 1
@@ -184,26 +201,68 @@ async def handle_time_series_analysis(ctx, data: List[float], **kwargs) -> CallT
184
201
  pacf_values = np.zeros(max_nlags + 1)
185
202
  acf_values[0] = pacf_values[0] = 1.0
186
203
 
204
+ # 构建详细的结果文本
205
+ result_text = f"""📊 时间序列分析结果
206
+
207
+ 🔍 基本统计信息:
208
+ - 观测数量 = {basic_stats['count']}
209
+ - 均值 = {basic_stats['mean']:.4f}
210
+ - 标准差 = {basic_stats['std']:.4f}
211
+ - 最小值 = {basic_stats['min']:.4f}
212
+ - 最大值 = {basic_stats['max']:.4f}
213
+ - 中位数 = {basic_stats['median']:.4f}
214
+ - 偏度 = {basic_stats['skewness']:.4f}
215
+ - 峰度 = {basic_stats['kurtosis']:.4f}
216
+
217
+ 📈 平稳性检验:
218
+ - ADF检验统计量 = {adf_result[0]:.4f}
219
+ - ADF检验p值 = {adf_result[1]:.4f}
220
+ - KPSS检验统计量 = {kpss_result[0]:.4f}
221
+ - KPSS检验p值 = {kpss_result[1]:.4f}
222
+ - 平稳性判断 = {'平稳' if adf_result[1] < 0.05 and kpss_result[1] > 0.05 else '非平稳'}
223
+
224
+ 🔬 自相关分析:
225
+ - ACF前5阶: {[f'{x:.4f}' for x in acf_values[:5]]}
226
+ - PACF前5阶: {[f'{x:.4f}' for x in pacf_values[:5]]}"""
227
+
228
+ # 添加模型建议
229
+ if adf_result[1] < 0.05: # 平稳序列
230
+ result_text += f"\n\n💡 模型建议:数据为平稳序列,可考虑ARMA、ARIMA(p,d,q)等模型。"
231
+ # 根据ACF/PACF模式给出建议
232
+ acf_decay = abs(acf_values[1]) > 0.5
233
+ pacf_cutoff = abs(pacf_values[1]) > 0.5 and all(abs(x) < 0.3 for x in pacf_values[2:5])
234
+
235
+ if acf_decay and pacf_cutoff:
236
+ result_text += f"\n- ACF缓慢衰减,PACF在1阶截尾,建议尝试AR(1)模型"
237
+ elif not acf_decay and not pacf_cutoff:
238
+ result_text += f"\n- ACF和PACF均缓慢衰减,建议尝试ARMA模型"
239
+ else: # 非平稳序列
240
+ result_text += f"\n\n💡 模型建议:数据为非平稳序列,建议进行差分处理后再建模。"
241
+ result_text += f"\n- 可尝试ARIMA(p,d,q)模型,其中d为差分阶数"
242
+ result_text += f"\n- 如果存在趋势和季节模式,可考虑SARIMA模型"
243
+
244
+ result_text += f"\n\n⚠️ 注意事项:"
245
+ result_text += f"\n- 平稳性是时间序列建模的重要前提"
246
+ result_text += f"\n- ACF和PACF模式有助于识别合适的模型阶数"
247
+ result_text += f"\n- 建议结合信息准则(AIC/BIC)进行模型选择"
248
+
187
249
  result_data = {
250
+ "basic_statistics": basic_stats,
188
251
  "adf_statistic": float(adf_result[0]),
189
252
  "adf_pvalue": float(adf_result[1]),
190
- "stationary": bool(adf_result[1] < 0.05),
253
+ "kpss_statistic": float(kpss_result[0]),
254
+ "kpss_pvalue": float(kpss_result[1]),
255
+ "stationary": bool(adf_result[1] < 0.05 and kpss_result[1] > 0.05),
191
256
  "acf": [float(x) for x in acf_values.tolist()],
192
- "pacf": [float(x) for x in pacf_values.tolist()]
257
+ "pacf": [float(x) for x in pacf_values.tolist()],
258
+ "model_suggestions": {
259
+ "is_stationary": adf_result[1] < 0.05,
260
+ "suggested_models": ["ARMA", "ARIMA"] if adf_result[1] < 0.05 else ["ARIMA", "SARIMA"]
261
+ }
193
262
  }
194
263
 
195
264
  return CallToolResult(
196
- content=[
197
- TextContent(
198
- type="text",
199
- text=f"时间序列分析结果:\n"
200
- f"ADF检验统计量 = {result_data['adf_statistic']:.4f}\n"
201
- f"ADF检验p值 = {result_data['adf_pvalue']:.4f}\n"
202
- f"{'平稳' if result_data['stationary'] else '非平稳'}序列\n"
203
- f"ACF前5阶: {result_data['acf'][:5]}\n"
204
- f"PACF前5阶: {result_data['pacf'][:5]}"
205
- )
206
- ],
265
+ content=[TextContent(type="text", text=result_text)],
207
266
  structuredContent=result_data
208
267
  )
209
268
 
@@ -502,27 +561,32 @@ async def handle_state_space_model(ctx, data, state_dim=1, observation_dim=1,
502
561
  result_text = f"""📊 状态空间模型分析结果
503
562
 
504
563
  🔍 模型结构信息:
505
- - 状态维度 = {result.state_dim}
506
- - 观测维度 = {result.observation_dim}
507
- - 趋势项 = {'包含' if result.trend else '不包含'}
508
- - 季节项 = {'包含' if result.seasonal else '不包含'}
509
- - 季节周期 = {result.period if result.seasonal else 'N/A'}
564
+ - 状态维度 = {state_dim}
565
+ - 观测维度 = {observation_dim}
566
+ - 趋势项 = {'包含' if trend else '不包含'}
567
+ - 季节项 = {'包含' if seasonal else '不包含'}
568
+ - 季节周期 = {period if seasonal else 'N/A'}
510
569
  - AIC = {result.aic:.2f}
511
- - BIC = {getattr(result, 'bic', 'N/A')}
570
+ - BIC = {result.bic:.2f}
571
+ - 对数似然值 = {result.log_likelihood:.2f}
512
572
 
513
- 📈 模型拟合信息:"""
514
-
515
- # 添加模型拟合信息
516
- if hasattr(result, 'log_likelihood'):
517
- result_text += f"\n- 对数似然值: {result.log_likelihood:.2f}"
518
- if hasattr(result, 'converged'):
519
- result_text += f"\n- 收敛状态: {'已收敛' if result.converged else '未收敛'}"
520
- if hasattr(result, 'smoothing_error'):
521
- result_text += f"\n- 平滑误差: {result.smoothing_error:.4f}"
522
-
523
- result_text += f"\n\n💡 模型说明:状态空间模型用于分析时间序列的潜在状态和观测关系,能够处理复杂的动态系统。"
524
- result_text += f"\n\n⚠️ 注意事项:状态空间模型适用于分析具有潜在状态的时间序列,参数估计可能对初始值敏感。"
573
+ 📈 状态分析:"""
574
+
575
+ # 添加状态信息
576
+ if result.state_names:
577
+ result_text += f"\n- 状态变量: {', '.join(result.state_names)}"
578
+ if result.observation_names:
579
+ result_text += f"\n- 观测变量: {', '.join(result.observation_names)}"
525
580
 
581
+ # 添加状态估计信息
582
+ if result.filtered_state:
583
+ result_text += f"\n- 滤波状态估计: 已计算"
584
+ if result.smoothed_state:
585
+ result_text += f"\n- 平滑状态估计: 已计算"
586
+
587
+ result_text += f"\n\n💡 模型说明:状态空间模型用于分析时间序列的潜在状态和观测关系,能够处理复杂的动态系统,特别适用于具有不可观测状态的时间序列建模。"
588
+ result_text += f"\n\n⚠️ 注意事项:状态空间模型参数估计可能对初始值敏感,建议进行多次初始化尝试以获得稳定结果。"
589
+
526
590
  return CallToolResult(
527
591
  content=[TextContent(type="text", text=result_text)],
528
592
  structuredContent=result.model_dump()
@@ -539,25 +603,35 @@ async def handle_variance_decomposition(ctx, data, periods=10, max_lags=5, **kwa
539
603
  🔍 分析设置:
540
604
  - 分解期数 = {periods}
541
605
  - 最大滞后阶数 = {max_lags}
542
- - 变量数量 = {len(result) if isinstance(result, dict) else '未知'}
606
+ - 变量数量 = {len(data) if data else '未知'}
543
607
 
544
608
  📈 方差分解结果:"""
545
-
609
+
546
610
  # 添加方差分解结果
547
- if isinstance(result, dict):
548
- for var_name, decomposition in result.items():
611
+ if isinstance(result, dict) and "variance_decomposition" in result:
612
+ variance_decomp = result["variance_decomposition"]
613
+ horizon = result.get("horizon", periods)
614
+
615
+ result_text += f"\n- 分析期数: {horizon}期"
616
+
617
+ for var_name, decomposition in variance_decomp.items():
618
+ result_text += f"\n\n🔬 变量 '{var_name}' 的方差来源:"
549
619
  if isinstance(decomposition, dict):
550
- result_text += f"\n\n🔬 变量 '{var_name}' 的方差来源:"
551
- for source, percentage in decomposition.items():
552
- result_text += f"\n- {source}: {percentage:.1f}%"
620
+ for source, percentages in decomposition.items():
621
+ if isinstance(percentages, list) and len(percentages) > 0:
622
+ # 显示最后一期的贡献度
623
+ final_percentage = percentages[-1] * 100 if isinstance(percentages[-1], (int, float)) else 0
624
+ result_text += f"\n- {source}: {final_percentage:.1f}%"
625
+ else:
626
+ result_text += f"\n- {source}: {percentages:.1f}%"
553
627
  else:
554
- result_text += f"\n- {var_name}: {decomposition}"
628
+ result_text += f"\n- 总方差: {decomposition:.1f}%"
555
629
  else:
556
- result_text += f"\n- 结果: {result}"
557
-
558
- result_text += f"\n\n💡 分析说明:方差分解用于分析多变量系统中各变量对预测误差方差的贡献程度。"
559
- result_text += f"\n\n⚠️ 注意事项:方差分解结果依赖于模型的滞后阶数选择,不同期数的分解结果可能不同。"
560
-
630
+ result_text += f"\n- 结果格式异常,无法解析方差分解结果"
631
+
632
+ result_text += f"\n\n💡 分析说明:方差分解用于分析多变量系统中各变量对预测误差方差的贡献程度,反映变量间的动态影响关系。"
633
+ result_text += f"\n\n⚠️ 注意事项:方差分解结果依赖于VAR模型的滞后阶数选择,不同期数的分解结果反映短期和长期影响。"
634
+
561
635
  return CallToolResult(
562
636
  content=[TextContent(type="text", text=result_text)],
563
637
  structuredContent=result