aigroup-econ-mcp 1.3.3__py3-none-any.whl → 2.0.1__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.
Files changed (198) hide show
  1. .gitignore +253 -0
  2. PKG-INFO +732 -0
  3. README.md +687 -0
  4. __init__.py +14 -0
  5. aigroup_econ_mcp-2.0.1.dist-info/METADATA +732 -0
  6. aigroup_econ_mcp-2.0.1.dist-info/RECORD +170 -0
  7. aigroup_econ_mcp-2.0.1.dist-info/entry_points.txt +2 -0
  8. aigroup_econ_mcp-2.0.1.dist-info/licenses/LICENSE +21 -0
  9. cli.py +32 -0
  10. econometrics/README.md +18 -0
  11. econometrics/__init__.py +191 -0
  12. econometrics/advanced_methods/modern_computing_machine_learning/__init__.py +30 -0
  13. econometrics/advanced_methods/modern_computing_machine_learning/causal_forest.py +253 -0
  14. econometrics/advanced_methods/modern_computing_machine_learning/double_ml.py +268 -0
  15. econometrics/advanced_methods/modern_computing_machine_learning/gradient_boosting.py +249 -0
  16. econometrics/advanced_methods/modern_computing_machine_learning/hierarchical_clustering.py +243 -0
  17. econometrics/advanced_methods/modern_computing_machine_learning/kmeans_clustering.py +293 -0
  18. econometrics/advanced_methods/modern_computing_machine_learning/neural_network.py +264 -0
  19. econometrics/advanced_methods/modern_computing_machine_learning/random_forest.py +195 -0
  20. econometrics/advanced_methods/modern_computing_machine_learning/support_vector_machine.py +226 -0
  21. econometrics/advanced_methods/modern_computing_machine_learning/test_all_modules.py +329 -0
  22. econometrics/advanced_methods/modern_computing_machine_learning/test_report.md +107 -0
  23. econometrics/basic_parametric_estimation/__init__.py +31 -0
  24. econometrics/basic_parametric_estimation/gmm/__init__.py +13 -0
  25. econometrics/basic_parametric_estimation/gmm/gmm_model.py +256 -0
  26. econometrics/basic_parametric_estimation/mle/__init__.py +13 -0
  27. econometrics/basic_parametric_estimation/mle/mle_model.py +241 -0
  28. econometrics/basic_parametric_estimation/ols/__init__.py +13 -0
  29. econometrics/basic_parametric_estimation/ols/ols_model.py +141 -0
  30. econometrics/causal_inference/__init__.py +66 -0
  31. econometrics/causal_inference/causal_identification_strategy/__init__.py +104 -0
  32. econometrics/causal_inference/causal_identification_strategy/control_function.py +112 -0
  33. econometrics/causal_inference/causal_identification_strategy/difference_in_differences.py +107 -0
  34. econometrics/causal_inference/causal_identification_strategy/event_study.py +119 -0
  35. econometrics/causal_inference/causal_identification_strategy/first_difference.py +89 -0
  36. econometrics/causal_inference/causal_identification_strategy/fixed_effects.py +103 -0
  37. econometrics/causal_inference/causal_identification_strategy/hausman_test.py +69 -0
  38. econometrics/causal_inference/causal_identification_strategy/instrumental_variables.py +145 -0
  39. econometrics/causal_inference/causal_identification_strategy/mediation_analysis.py +121 -0
  40. econometrics/causal_inference/causal_identification_strategy/moderation_analysis.py +109 -0
  41. econometrics/causal_inference/causal_identification_strategy/propensity_score_matching.py +140 -0
  42. econometrics/causal_inference/causal_identification_strategy/random_effects.py +100 -0
  43. econometrics/causal_inference/causal_identification_strategy/regression_discontinuity.py +98 -0
  44. econometrics/causal_inference/causal_identification_strategy/synthetic_control.py +111 -0
  45. econometrics/causal_inference/causal_identification_strategy/triple_difference.py +86 -0
  46. econometrics/distribution_analysis/__init__.py +28 -0
  47. econometrics/distribution_analysis/oaxaca_blinder.py +184 -0
  48. econometrics/distribution_analysis/time_series_decomposition.py +152 -0
  49. econometrics/distribution_analysis/variance_decomposition.py +179 -0
  50. econometrics/missing_data/__init__.py +18 -0
  51. econometrics/missing_data/imputation_methods.py +219 -0
  52. econometrics/missing_data/missing_data_measurement_error/__init__.py +0 -0
  53. econometrics/model_specification_diagnostics_robust_inference/README.md +173 -0
  54. econometrics/model_specification_diagnostics_robust_inference/__init__.py +78 -0
  55. econometrics/model_specification_diagnostics_robust_inference/diagnostic_tests/__init__.py +20 -0
  56. econometrics/model_specification_diagnostics_robust_inference/diagnostic_tests/diagnostic_tests_model.py +149 -0
  57. econometrics/model_specification_diagnostics_robust_inference/generalized_least_squares/__init__.py +15 -0
  58. econometrics/model_specification_diagnostics_robust_inference/generalized_least_squares/gls_model.py +130 -0
  59. econometrics/model_specification_diagnostics_robust_inference/model_selection/__init__.py +18 -0
  60. econometrics/model_specification_diagnostics_robust_inference/model_selection/model_selection_model.py +286 -0
  61. econometrics/model_specification_diagnostics_robust_inference/regularization/__init__.py +15 -0
  62. econometrics/model_specification_diagnostics_robust_inference/regularization/regularization_model.py +177 -0
  63. econometrics/model_specification_diagnostics_robust_inference/robust_errors/__init__.py +15 -0
  64. econometrics/model_specification_diagnostics_robust_inference/robust_errors/robust_errors_model.py +122 -0
  65. econometrics/model_specification_diagnostics_robust_inference/simultaneous_equations/__init__.py +15 -0
  66. econometrics/model_specification_diagnostics_robust_inference/simultaneous_equations/simultaneous_equations_model.py +246 -0
  67. econometrics/model_specification_diagnostics_robust_inference/weighted_least_squares/__init__.py +15 -0
  68. econometrics/model_specification_diagnostics_robust_inference/weighted_least_squares/wls_model.py +127 -0
  69. econometrics/nonparametric/__init__.py +35 -0
  70. econometrics/nonparametric/gam_model.py +117 -0
  71. econometrics/nonparametric/kernel_regression.py +161 -0
  72. econometrics/nonparametric/nonparametric_semiparametric_methods/__init__.py +0 -0
  73. econometrics/nonparametric/quantile_regression.py +249 -0
  74. econometrics/nonparametric/spline_regression.py +100 -0
  75. econometrics/spatial_econometrics/__init__.py +68 -0
  76. econometrics/spatial_econometrics/geographically_weighted_regression.py +211 -0
  77. econometrics/spatial_econometrics/gwr_simple.py +154 -0
  78. econometrics/spatial_econometrics/spatial_autocorrelation.py +356 -0
  79. econometrics/spatial_econometrics/spatial_durbin_model.py +177 -0
  80. econometrics/spatial_econometrics/spatial_econometrics_new/__init__.py +0 -0
  81. econometrics/spatial_econometrics/spatial_regression.py +315 -0
  82. econometrics/spatial_econometrics/spatial_weights.py +226 -0
  83. econometrics/specific_data_modeling/micro_discrete_limited_data/README.md +164 -0
  84. econometrics/specific_data_modeling/micro_discrete_limited_data/__init__.py +40 -0
  85. econometrics/specific_data_modeling/micro_discrete_limited_data/count_data_models.py +311 -0
  86. econometrics/specific_data_modeling/micro_discrete_limited_data/discrete_choice_models.py +294 -0
  87. econometrics/specific_data_modeling/micro_discrete_limited_data/limited_dependent_variable_models.py +282 -0
  88. econometrics/specific_data_modeling/survival_duration_data/__init__.py +0 -0
  89. econometrics/specific_data_modeling/time_series_panel_data/__init__.py +143 -0
  90. econometrics/specific_data_modeling/time_series_panel_data/arima_model.py +104 -0
  91. econometrics/specific_data_modeling/time_series_panel_data/cointegration_vecm.py +334 -0
  92. econometrics/specific_data_modeling/time_series_panel_data/dynamic_panel_models.py +653 -0
  93. econometrics/specific_data_modeling/time_series_panel_data/exponential_smoothing.py +176 -0
  94. econometrics/specific_data_modeling/time_series_panel_data/garch_model.py +198 -0
  95. econometrics/specific_data_modeling/time_series_panel_data/panel_diagnostics.py +125 -0
  96. econometrics/specific_data_modeling/time_series_panel_data/panel_var.py +60 -0
  97. econometrics/specific_data_modeling/time_series_panel_data/structural_break_tests.py +87 -0
  98. econometrics/specific_data_modeling/time_series_panel_data/time_varying_parameter_models.py +106 -0
  99. econometrics/specific_data_modeling/time_series_panel_data/unit_root_tests.py +204 -0
  100. econometrics/specific_data_modeling/time_series_panel_data/var_svar_model.py +372 -0
  101. econometrics/statistical_inference/__init__.py +21 -0
  102. econometrics/statistical_inference/bootstrap_methods.py +162 -0
  103. econometrics/statistical_inference/permutation_test.py +177 -0
  104. econometrics/statistical_inference/statistical_inference_techniques/__init__.py +0 -0
  105. econometrics/statistics/distribution_decomposition_methods/__init__.py +0 -0
  106. econometrics/survival_analysis/__init__.py +18 -0
  107. econometrics/survival_analysis/survival_models.py +259 -0
  108. econometrics/tests/basic_parametric_estimation_tests/__init__.py +3 -0
  109. econometrics/tests/basic_parametric_estimation_tests/test_gmm.py +128 -0
  110. econometrics/tests/basic_parametric_estimation_tests/test_mle.py +127 -0
  111. econometrics/tests/basic_parametric_estimation_tests/test_ols.py +100 -0
  112. econometrics/tests/causal_inference_tests/__init__.py +3 -0
  113. econometrics/tests/causal_inference_tests/detailed_test.py +441 -0
  114. econometrics/tests/causal_inference_tests/test_all_methods.py +418 -0
  115. econometrics/tests/causal_inference_tests/test_causal_identification_strategy.py +202 -0
  116. econometrics/tests/causal_inference_tests/test_difference_in_differences.py +53 -0
  117. econometrics/tests/causal_inference_tests/test_instrumental_variables.py +44 -0
  118. econometrics/tests/model_specification_diagnostics_tests/__init__.py +3 -0
  119. econometrics/tests/model_specification_diagnostics_tests/test_diagnostic_tests.py +86 -0
  120. econometrics/tests/model_specification_diagnostics_tests/test_robust_errors.py +89 -0
  121. econometrics/tests/specific_data_modeling_tests/__init__.py +3 -0
  122. econometrics/tests/specific_data_modeling_tests/test_arima.py +98 -0
  123. econometrics/tests/specific_data_modeling_tests/test_dynamic_panel.py +198 -0
  124. econometrics/tests/specific_data_modeling_tests/test_exponential_smoothing.py +105 -0
  125. econometrics/tests/specific_data_modeling_tests/test_garch.py +118 -0
  126. econometrics/tests/specific_data_modeling_tests/test_micro_discrete_limited_data.py +189 -0
  127. econometrics/tests/specific_data_modeling_tests/test_unit_root.py +156 -0
  128. econometrics/tests/specific_data_modeling_tests/test_var.py +124 -0
  129. econometrics//321/206/320/254/320/272/321/205/342/225/235/320/220/321/205/320/237/320/241/321/205/320/264/320/267/321/207/342/226/222/342/225/227/321/204/342/225/235/320/250/321/205/320/225/320/230/321/207/342/225/221/320/267/321/205/320/230/320/226/321/206/320/256/320/240.md +544 -0
  130. prompts/__init__.py +0 -0
  131. prompts/analysis_guides.py +43 -0
  132. pyproject.toml +85 -0
  133. resources/MCP_MASTER_GUIDE.md +422 -0
  134. resources/MCP_TOOLS_DATA_FORMAT_GUIDE.md +185 -0
  135. resources/__init__.py +0 -0
  136. server.py +97 -0
  137. tools/README.md +88 -0
  138. tools/__init__.py +119 -0
  139. tools/causal_inference_adapter.py +658 -0
  140. tools/data_loader.py +213 -0
  141. tools/decorators.py +38 -0
  142. tools/distribution_analysis_adapter.py +121 -0
  143. tools/econometrics_adapter.py +286 -0
  144. tools/gwr_simple_adapter.py +54 -0
  145. tools/machine_learning_adapter.py +567 -0
  146. tools/mcp_tool_groups/__init__.py +15 -0
  147. tools/mcp_tool_groups/basic_parametric_tools.py +173 -0
  148. tools/mcp_tool_groups/causal_inference_tools.py +643 -0
  149. tools/mcp_tool_groups/distribution_analysis_tools.py +169 -0
  150. tools/mcp_tool_groups/machine_learning_tools.py +422 -0
  151. tools/mcp_tool_groups/microecon_tools.py +325 -0
  152. tools/mcp_tool_groups/missing_data_tools.py +117 -0
  153. tools/mcp_tool_groups/model_specification_tools.py +402 -0
  154. tools/mcp_tool_groups/nonparametric_tools.py +225 -0
  155. tools/mcp_tool_groups/spatial_econometrics_tools.py +323 -0
  156. tools/mcp_tool_groups/statistical_inference_tools.py +131 -0
  157. tools/mcp_tool_groups/time_series_tools.py +494 -0
  158. tools/mcp_tools_registry.py +124 -0
  159. tools/microecon_adapter.py +412 -0
  160. tools/missing_data_adapter.py +73 -0
  161. tools/model_specification_adapter.py +369 -0
  162. tools/nonparametric_adapter.py +190 -0
  163. tools/output_formatter.py +563 -0
  164. tools/spatial_econometrics_adapter.py +318 -0
  165. tools/statistical_inference_adapter.py +90 -0
  166. tools/survival_analysis_adapter.py +46 -0
  167. tools/time_series_panel_data_adapter.py +858 -0
  168. tools/time_series_panel_data_tools.py +65 -0
  169. aigroup_econ_mcp/__init__.py +0 -19
  170. aigroup_econ_mcp/cli.py +0 -82
  171. aigroup_econ_mcp/config.py +0 -561
  172. aigroup_econ_mcp/server.py +0 -452
  173. aigroup_econ_mcp/tools/__init__.py +0 -19
  174. aigroup_econ_mcp/tools/base.py +0 -470
  175. aigroup_econ_mcp/tools/cache.py +0 -533
  176. aigroup_econ_mcp/tools/data_loader.py +0 -195
  177. aigroup_econ_mcp/tools/file_parser.py +0 -1027
  178. aigroup_econ_mcp/tools/machine_learning.py +0 -60
  179. aigroup_econ_mcp/tools/ml_ensemble.py +0 -210
  180. aigroup_econ_mcp/tools/ml_evaluation.py +0 -272
  181. aigroup_econ_mcp/tools/ml_models.py +0 -54
  182. aigroup_econ_mcp/tools/ml_regularization.py +0 -186
  183. aigroup_econ_mcp/tools/monitoring.py +0 -555
  184. aigroup_econ_mcp/tools/optimized_example.py +0 -229
  185. aigroup_econ_mcp/tools/panel_data.py +0 -619
  186. aigroup_econ_mcp/tools/regression.py +0 -214
  187. aigroup_econ_mcp/tools/statistics.py +0 -154
  188. aigroup_econ_mcp/tools/time_series.py +0 -698
  189. aigroup_econ_mcp/tools/timeout.py +0 -283
  190. aigroup_econ_mcp/tools/tool_descriptions.py +0 -410
  191. aigroup_econ_mcp/tools/tool_handlers.py +0 -1016
  192. aigroup_econ_mcp/tools/tool_registry.py +0 -478
  193. aigroup_econ_mcp/tools/validation.py +0 -482
  194. aigroup_econ_mcp-1.3.3.dist-info/METADATA +0 -525
  195. aigroup_econ_mcp-1.3.3.dist-info/RECORD +0 -30
  196. aigroup_econ_mcp-1.3.3.dist-info/entry_points.txt +0 -2
  197. /aigroup_econ_mcp-1.3.3.dist-info/licenses/LICENSE → /LICENSE +0 -0
  198. {aigroup_econ_mcp-1.3.3.dist-info → aigroup_econ_mcp-2.0.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,325 @@
1
+ """
2
+ 微观计量模型工具组
3
+ 包含离散选择、计数数据和受限因变量模型的MCP工具
4
+ """
5
+
6
+ from typing import List, Optional, Union, Dict, Any
7
+ from mcp.server.fastmcp import Context
8
+ from mcp.server.session import ServerSession
9
+
10
+ from ..mcp_tools_registry import ToolGroup
11
+ from ..microecon_adapter import (
12
+ logit_adapter,
13
+ probit_adapter,
14
+ multinomial_logit_adapter,
15
+ poisson_adapter,
16
+ negative_binomial_adapter,
17
+ tobit_adapter,
18
+ heckman_adapter
19
+ )
20
+
21
+
22
+ class MicroeconometricsTools(ToolGroup):
23
+ """微观计量模型工具组"""
24
+
25
+ name = "MICROECONOMETRICS"
26
+ description = "微观计量模型工具"
27
+ version = "1.0.0"
28
+
29
+ @classmethod
30
+ def get_tools(cls) -> List[Dict[str, Any]]:
31
+ """返回工具列表"""
32
+ return [
33
+ {
34
+ "name": "micro_logit",
35
+ "handler": cls.logit_tool,
36
+ "description": "Logistic Regression Model"
37
+ },
38
+ {
39
+ "name": "micro_probit",
40
+ "handler": cls.probit_tool,
41
+ "description": "Probit Regression Model"
42
+ },
43
+ {
44
+ "name": "micro_multinomial_logit",
45
+ "handler": cls.multinomial_logit_tool,
46
+ "description": "Multinomial Logit Model"
47
+ },
48
+ {
49
+ "name": "micro_poisson",
50
+ "handler": cls.poisson_tool,
51
+ "description": "Poisson Regression Model"
52
+ },
53
+ {
54
+ "name": "micro_negative_binomial",
55
+ "handler": cls.negative_binomial_tool,
56
+ "description": "Negative Binomial Regression Model"
57
+ },
58
+ {
59
+ "name": "micro_tobit",
60
+ "handler": cls.tobit_tool,
61
+ "description": "Tobit Model (Censored Regression)"
62
+ },
63
+ {
64
+ "name": "micro_heckman",
65
+ "handler": cls.heckman_tool,
66
+ "description": "Heckman Selection Model"
67
+ }
68
+ ]
69
+
70
+ @classmethod
71
+ def get_help_text(cls) -> str:
72
+ """返回帮助文档"""
73
+ return """
74
+ 微观计量模型工具组 - 7种模型
75
+
76
+ 离散选择模型:
77
+ 1. Logit Model - micro_logit
78
+ - 二元Logistic回归
79
+ - 适用于二元因变量
80
+
81
+ 2. Probit Model - micro_probit
82
+ - Probit回归
83
+ - 基于正态分布假设
84
+
85
+ 3. Multinomial Logit - micro_multinomial_logit
86
+ - 多项Logit模型
87
+ - 适用于多分类问题
88
+
89
+ 计数数据模型:
90
+ 4. Poisson Model - micro_poisson
91
+ - 泊松回归
92
+ - 适用于计数数据
93
+
94
+ 5. Negative Binomial - micro_negative_binomial
95
+ - 负二项回归
96
+ - 处理过度离散问题
97
+
98
+ 受限因变量模型:
99
+ 6. Tobit Model - micro_tobit
100
+ - Tobit模型(截断回归)
101
+ - 适用于受限因变量
102
+
103
+ 7. Heckman Model - micro_heckman
104
+ - Heckman样本选择模型
105
+ - 处理样本选择偏差
106
+ """
107
+
108
+ @staticmethod
109
+ async def logit_tool(
110
+ X_data: Optional[List] = None,
111
+ y_data: Optional[List[int]] = None,
112
+ file_path: Optional[str] = None,
113
+ feature_names: Optional[List[str]] = None,
114
+ output_format: str = 'json',
115
+ save_path: Optional[str] = None,
116
+ ctx: Context[ServerSession, None] = None
117
+ ) -> str:
118
+ """Logit回归分析"""
119
+ try:
120
+ if ctx:
121
+ await ctx.info("Starting Logit regression analysis...")
122
+
123
+ result = logit_adapter(
124
+ X_data=X_data, y_data=y_data, file_path=file_path,
125
+ feature_names=feature_names, output_format=output_format,
126
+ save_path=save_path
127
+ )
128
+
129
+ if ctx:
130
+ await ctx.info("Logit analysis complete")
131
+
132
+ return result
133
+ except Exception as e:
134
+ if ctx:
135
+ await ctx.error(f"Error: {str(e)}")
136
+ raise
137
+
138
+ @staticmethod
139
+ async def probit_tool(
140
+ X_data: Optional[List] = None,
141
+ y_data: Optional[List[int]] = None,
142
+ file_path: Optional[str] = None,
143
+ feature_names: Optional[List[str]] = None,
144
+ output_format: str = 'json',
145
+ save_path: Optional[str] = None,
146
+ ctx: Context[ServerSession, None] = None
147
+ ) -> str:
148
+ """Probit回归分析"""
149
+ try:
150
+ if ctx:
151
+ await ctx.info("Starting Probit regression analysis...")
152
+
153
+ result = probit_adapter(
154
+ X_data=X_data, y_data=y_data, file_path=file_path,
155
+ feature_names=feature_names, output_format=output_format,
156
+ save_path=save_path
157
+ )
158
+
159
+ if ctx:
160
+ await ctx.info("Probit analysis complete")
161
+
162
+ return result
163
+ except Exception as e:
164
+ if ctx:
165
+ await ctx.error(f"Error: {str(e)}")
166
+ raise
167
+
168
+ @staticmethod
169
+ async def multinomial_logit_tool(
170
+ X_data: Optional[List] = None,
171
+ y_data: Optional[List[int]] = None,
172
+ file_path: Optional[str] = None,
173
+ feature_names: Optional[List[str]] = None,
174
+ output_format: str = 'json',
175
+ save_path: Optional[str] = None,
176
+ ctx: Context[ServerSession, None] = None
177
+ ) -> str:
178
+ """多项Logit分析"""
179
+ try:
180
+ if ctx:
181
+ await ctx.info("Starting Multinomial Logit analysis...")
182
+
183
+ result = multinomial_logit_adapter(
184
+ X_data=X_data, y_data=y_data, file_path=file_path,
185
+ feature_names=feature_names, output_format=output_format,
186
+ save_path=save_path
187
+ )
188
+
189
+ if ctx:
190
+ await ctx.info("Multinomial Logit analysis complete")
191
+
192
+ return result
193
+ except Exception as e:
194
+ if ctx:
195
+ await ctx.error(f"Error: {str(e)}")
196
+ raise
197
+
198
+ @staticmethod
199
+ async def poisson_tool(
200
+ X_data: Optional[List] = None,
201
+ y_data: Optional[List[int]] = None,
202
+ file_path: Optional[str] = None,
203
+ feature_names: Optional[List[str]] = None,
204
+ output_format: str = 'json',
205
+ save_path: Optional[str] = None,
206
+ ctx: Context[ServerSession, None] = None
207
+ ) -> str:
208
+ """泊松回归分析"""
209
+ try:
210
+ if ctx:
211
+ await ctx.info("Starting Poisson regression analysis...")
212
+
213
+ result = poisson_adapter(
214
+ X_data=X_data, y_data=y_data, file_path=file_path,
215
+ feature_names=feature_names, output_format=output_format,
216
+ save_path=save_path
217
+ )
218
+
219
+ if ctx:
220
+ await ctx.info("Poisson analysis complete")
221
+
222
+ return result
223
+ except Exception as e:
224
+ if ctx:
225
+ await ctx.error(f"Error: {str(e)}")
226
+ raise
227
+
228
+ @staticmethod
229
+ async def negative_binomial_tool(
230
+ X_data: Optional[List] = None,
231
+ y_data: Optional[List[int]] = None,
232
+ file_path: Optional[str] = None,
233
+ feature_names: Optional[List[str]] = None,
234
+ distr: str = 'nb2',
235
+ output_format: str = 'json',
236
+ save_path: Optional[str] = None,
237
+ ctx: Context[ServerSession, None] = None
238
+ ) -> str:
239
+ """负二项回归分析"""
240
+ try:
241
+ if ctx:
242
+ await ctx.info("Starting Negative Binomial regression analysis...")
243
+
244
+ result = negative_binomial_adapter(
245
+ X_data=X_data, y_data=y_data, file_path=file_path,
246
+ feature_names=feature_names, distr=distr,
247
+ output_format=output_format, save_path=save_path
248
+ )
249
+
250
+ if ctx:
251
+ await ctx.info("Negative Binomial analysis complete")
252
+
253
+ return result
254
+ except Exception as e:
255
+ if ctx:
256
+ await ctx.error(f"Error: {str(e)}")
257
+ raise
258
+
259
+ @staticmethod
260
+ async def tobit_tool(
261
+ X_data: Optional[List] = None,
262
+ y_data: Optional[List[float]] = None,
263
+ file_path: Optional[str] = None,
264
+ feature_names: Optional[List[str]] = None,
265
+ lower_bound: float = 0.0,
266
+ upper_bound: Optional[float] = None,
267
+ output_format: str = 'json',
268
+ save_path: Optional[str] = None,
269
+ ctx: Context[ServerSession, None] = None
270
+ ) -> str:
271
+ """Tobit模型分析"""
272
+ try:
273
+ if ctx:
274
+ await ctx.info("Starting Tobit model analysis...")
275
+
276
+ result = tobit_adapter(
277
+ X_data=X_data, y_data=y_data, file_path=file_path,
278
+ feature_names=feature_names, lower_bound=lower_bound,
279
+ upper_bound=upper_bound, output_format=output_format,
280
+ save_path=save_path
281
+ )
282
+
283
+ if ctx:
284
+ await ctx.info("Tobit analysis complete")
285
+
286
+ return result
287
+ except Exception as e:
288
+ if ctx:
289
+ await ctx.error(f"Error: {str(e)}")
290
+ raise
291
+
292
+ @staticmethod
293
+ async def heckman_tool(
294
+ X_select_data: Optional[List] = None,
295
+ Z_data: Optional[List] = None,
296
+ y_data: Optional[List[float]] = None,
297
+ s_data: Optional[List[int]] = None,
298
+ file_path: Optional[str] = None,
299
+ selection_feature_names: Optional[List[str]] = None,
300
+ outcome_feature_names: Optional[List[str]] = None,
301
+ output_format: str = 'json',
302
+ save_path: Optional[str] = None,
303
+ ctx: Context[ServerSession, None] = None
304
+ ) -> str:
305
+ """Heckman样本选择模型分析"""
306
+ try:
307
+ if ctx:
308
+ await ctx.info("Starting Heckman selection model analysis...")
309
+
310
+ result = heckman_adapter(
311
+ X_select_data=X_select_data, Z_data=Z_data,
312
+ y_data=y_data, s_data=s_data, file_path=file_path,
313
+ selection_feature_names=selection_feature_names,
314
+ outcome_feature_names=outcome_feature_names,
315
+ output_format=output_format, save_path=save_path
316
+ )
317
+
318
+ if ctx:
319
+ await ctx.info("Heckman analysis complete")
320
+
321
+ return result
322
+ except Exception as e:
323
+ if ctx:
324
+ await ctx.error(f"Error: {str(e)}")
325
+ raise
@@ -0,0 +1,117 @@
1
+ """
2
+ 缺失数据处理工具组
3
+ """
4
+
5
+ from typing import List, Optional, Dict, Any
6
+ from mcp.server.fastmcp import Context
7
+ from mcp.server.session import ServerSession
8
+
9
+ from ..mcp_tools_registry import ToolGroup
10
+ from ..missing_data_adapter import (
11
+ simple_imputation_adapter,
12
+ multiple_imputation_adapter
13
+ )
14
+
15
+
16
+ class MissingDataTools(ToolGroup):
17
+ """缺失数据处理工具组"""
18
+
19
+ name = "MISSING DATA HANDLING"
20
+ description = "缺失数据插补和处理工具"
21
+ version = "1.0.0"
22
+
23
+ @classmethod
24
+ def get_tools(cls) -> List[Dict[str, Any]]:
25
+ """返回工具列表"""
26
+ return [
27
+ {
28
+ "name": "missing_data_simple_imputation",
29
+ "handler": cls.simple_imputation_tool,
30
+ "description": "Simple Imputation (Mean/Median/Mode/Constant)"
31
+ },
32
+ {
33
+ "name": "missing_data_multiple_imputation",
34
+ "handler": cls.multiple_imputation_tool,
35
+ "description": "Multiple Imputation (MICE)"
36
+ }
37
+ ]
38
+
39
+ @classmethod
40
+ def get_help_text(cls) -> str:
41
+ return """
42
+ 缺失数据处理工具组 - 2个工具
43
+
44
+ 1. Simple Imputation (missing_data_simple_imputation)
45
+ - 简单插补方法
46
+ - 均值/中位数/众数/常数填充
47
+ - 基于: sklearn.impute
48
+
49
+ 2. Multiple Imputation (missing_data_multiple_imputation)
50
+ - 多重插补 (MICE)
51
+ - 迭代插补算法
52
+ - 基于: sklearn.impute
53
+ """
54
+
55
+ @staticmethod
56
+ async def simple_imputation_tool(
57
+ data: List[List[float]],
58
+ strategy: str = "mean",
59
+ fill_value: Optional[float] = None,
60
+ output_format: str = "json",
61
+ save_path: Optional[str] = None,
62
+ ctx: Context[ServerSession, None] = None
63
+ ) -> str:
64
+ """简单插补"""
65
+ try:
66
+ if ctx:
67
+ await ctx.info(f"Starting simple imputation ({strategy})...")
68
+
69
+ result = simple_imputation_adapter(
70
+ data=data,
71
+ strategy=strategy,
72
+ fill_value=fill_value,
73
+ output_format=output_format,
74
+ save_path=save_path
75
+ )
76
+
77
+ if ctx:
78
+ await ctx.info("Simple imputation complete")
79
+
80
+ return result
81
+ except Exception as e:
82
+ if ctx:
83
+ await ctx.error(f"Error: {str(e)}")
84
+ raise
85
+
86
+ @staticmethod
87
+ async def multiple_imputation_tool(
88
+ data: List[List[float]],
89
+ n_imputations: int = 5,
90
+ max_iter: int = 10,
91
+ random_state: Optional[int] = None,
92
+ output_format: str = "json",
93
+ save_path: Optional[str] = None,
94
+ ctx: Context[ServerSession, None] = None
95
+ ) -> str:
96
+ """多重插补(MICE)"""
97
+ try:
98
+ if ctx:
99
+ await ctx.info(f"Starting multiple imputation (n={n_imputations})...")
100
+
101
+ result = multiple_imputation_adapter(
102
+ data=data,
103
+ n_imputations=n_imputations,
104
+ max_iter=max_iter,
105
+ random_state=random_state,
106
+ output_format=output_format,
107
+ save_path=save_path
108
+ )
109
+
110
+ if ctx:
111
+ await ctx.info("Multiple imputation complete")
112
+
113
+ return result
114
+ except Exception as e:
115
+ if ctx:
116
+ await ctx.error(f"Error: {str(e)}")
117
+ raise