aigroup-econ-mcp 0.4.0__py3-none-any.whl → 0.4.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.

Potentially problematic release.


This version of aigroup-econ-mcp might be problematic. Click here for more details.

@@ -1,259 +0,0 @@
1
- """
2
- AIGroup 计量经济学 MCP 服务器 - 支持CSV文件路径输入
3
- 使用最新的MCP特性提供专业计量经济学分析工具
4
- """
5
-
6
- from typing import List, Dict, Any, Optional, Annotated, Union
7
- from collections.abc import AsyncIterator
8
- from contextlib import asynccontextmanager
9
- from dataclasses import dataclass
10
- import json
11
- from pathlib import Path
12
-
13
- import pandas as pd
14
- import numpy as np
15
- import statsmodels.api as sm
16
- from statsmodels.tsa import stattools
17
- from scipy import stats
18
- from pydantic import BaseModel, Field
19
-
20
- from mcp.server.fastmcp import FastMCP, Context
21
- from mcp.server.session import ServerSession
22
- from mcp.types import CallToolResult, TextContent
23
-
24
-
25
- # 数据模型定义
26
- class DescriptiveStatsResult(BaseModel):
27
- """描述性统计结果"""
28
- count: int = Field(description="样本数量")
29
- mean: float = Field(description="均值")
30
- std: float = Field(description="标准差")
31
- min: float = Field(description="最小值")
32
- max: float = Field(description="最大值")
33
- median: float = Field(description="中位数")
34
- skewness: float = Field(description="偏度")
35
- kurtosis: float = Field(description="峰度")
36
-
37
-
38
- # 应用上下文
39
- @dataclass
40
- class AppContext:
41
- """应用上下文,包含共享资源"""
42
- config: Dict[str, Any]
43
- version: str = "0.2.0"
44
-
45
-
46
- @asynccontextmanager
47
- async def lifespan(server: FastMCP) -> AsyncIterator[AppContext]:
48
- """服务器生命周期管理"""
49
- config = {
50
- "max_sample_size": 10000,
51
- "default_significance_level": 0.05,
52
- "supported_tests": ["t_test", "f_test", "chi_square", "adf"],
53
- "data_types": ["cross_section", "time_series", "panel"]
54
- }
55
- try:
56
- yield AppContext(config=config, version="0.2.0")
57
- finally:
58
- pass
59
-
60
-
61
- # 创建MCP服务器实例
62
- mcp = FastMCP(
63
- name="aigroup-econ-mcp",
64
- instructions="Econometrics MCP Server with CSV file path support",
65
- lifespan=lifespan
66
- )
67
-
68
-
69
- # 辅助函数:加载CSV文件
70
- async def load_data_from_path(file_path: str, ctx: Context) -> Dict[str, List[float]]:
71
- """从CSV文件路径加载数据"""
72
- await ctx.info(f"正在从文件加载数据: {file_path}")
73
-
74
- try:
75
- # 读取CSV文件
76
- df = pd.read_csv(file_path)
77
-
78
- # 转换为字典格式
79
- data = {col: df[col].tolist() for col in df.columns}
80
-
81
- await ctx.info(f"✅ 文件加载成功:{len(df.columns)}个变量,{len(df)}个观测")
82
- return data
83
-
84
- except FileNotFoundError:
85
- raise ValueError(f"文件不存在: {file_path}")
86
- except Exception as e:
87
- raise ValueError(f"文件读取失败: {str(e)}")
88
-
89
-
90
- @mcp.tool()
91
- async def descriptive_statistics(
92
- ctx: Context[ServerSession, AppContext],
93
- data: Annotated[
94
- Union[Dict[str, List[float]], str],
95
- Field(
96
- description="""数据输入,支持两种格式:
97
-
98
- 📊 格式1:数据字典
99
- {
100
- "GDP增长率": [3.2, 2.8, 3.5, 2.9],
101
- "通货膨胀率": [2.1, 2.3, 1.9, 2.4],
102
- "失业率": [4.5, 4.2, 4.0, 4.3]
103
- }
104
-
105
- 📁 格式2:CSV文件路径(推荐)
106
- "d:/data/economic_data.csv"
107
-
108
- "./test_data.csv"
109
-
110
- CSV文件要求:
111
- - 第一行为变量名(表头)
112
- - 后续行为数值数据
113
- - 所有列必须为数值类型"""
114
- )
115
- ]
116
- ) -> CallToolResult:
117
- """计算描述性统计量
118
-
119
- 📊 功能说明:
120
- 对输入数据进行全面的描述性统计分析,包括集中趋势、离散程度、分布形状等指标。
121
-
122
- 💡 使用场景:
123
- - 初步了解数据的分布特征
124
- - 检查数据质量和异常值
125
- - 为后续建模提供基础信息
126
- """
127
- try:
128
- # 检测输入类型并加载数据
129
- if isinstance(data, str):
130
- # 文件路径输入
131
- data_dict = await load_data_from_path(data, ctx)
132
- else:
133
- # 字典输入
134
- data_dict = data
135
-
136
- await ctx.info(f"开始计算描述性统计,处理 {len(data_dict)} 个变量")
137
-
138
- # 数据验证
139
- if not data_dict:
140
- raise ValueError("数据不能为空")
141
-
142
- df = pd.DataFrame(data_dict)
143
-
144
- # 基础统计量
145
- result = DescriptiveStatsResult(
146
- count=len(df),
147
- mean=df.mean().mean(),
148
- std=df.std().mean(),
149
- min=df.min().min(),
150
- max=df.max().max(),
151
- median=df.median().mean(),
152
- skewness=df.skew().mean(),
153
- kurtosis=df.kurtosis().mean()
154
- )
155
-
156
- # 计算相关系数矩阵
157
- correlation_matrix = df.corr().round(4)
158
-
159
- await ctx.info(f"描述性统计计算完成,样本大小: {len(df)}")
160
-
161
- return CallToolResult(
162
- content=[
163
- TextContent(
164
- type="text",
165
- text=f"描述性统计结果:\n"
166
- f"样本数: {result.count}\n"
167
- f"均值: {result.mean:.4f}\n"
168
- f"标准差: {result.std:.4f}\n"
169
- f"最小值: {result.min:.4f}\n"
170
- f"最大值: {result.max:.4f}\n"
171
- f"中位数: {result.median:.4f}\n"
172
- f"偏度: {result.skewness:.4f}\n"
173
- f"峰度: {result.kurtosis:.4f}\n\n"
174
- f"相关系数矩阵:\n{correlation_matrix.to_string()}"
175
- )
176
- ],
177
- structuredContent=result.model_dump()
178
- )
179
-
180
- except Exception as e:
181
- await ctx.error(f"计算描述性统计时出错: {str(e)}")
182
- return CallToolResult(
183
- content=[TextContent(type="text", text=f"错误: {str(e)}")],
184
- isError=True
185
- )
186
-
187
-
188
- @mcp.tool()
189
- async def correlation_analysis(
190
- ctx: Context[ServerSession, AppContext],
191
- data: Annotated[
192
- Union[Dict[str, List[float]], str],
193
- Field(
194
- description="""数据输入,支持两种格式:
195
-
196
- 📊 格式1:数据字典
197
- {
198
- "销售额": [12000, 13500, 11800, 14200],
199
- "广告支出": [800, 900, 750, 1000],
200
- "价格": [99, 95, 102, 98]
201
- }
202
-
203
- 📁 格式2:CSV文件路径
204
- "d:/data/marketing_data.csv"
205
-
206
- 要求:
207
- - 至少包含2个变量
208
- - 所有变量的数据点数量必须相同"""
209
- )
210
- ],
211
- method: Annotated[
212
- str,
213
- Field(
214
- default="pearson",
215
- description="相关系数类型:pearson/spearman/kendall"
216
- )
217
- ] = "pearson"
218
- ) -> CallToolResult:
219
- """变量间相关性分析"""
220
- try:
221
- # 检测输入类型并加载数据
222
- if isinstance(data, str):
223
- data_dict = await load_data_from_path(data, ctx)
224
- else:
225
- data_dict = data
226
-
227
- await ctx.info(f"开始相关性分析: {method}")
228
-
229
- # 数据验证
230
- if not data_dict:
231
- raise ValueError("数据不能为空")
232
- if len(data_dict) < 2:
233
- raise ValueError("至少需要2个变量进行相关性分析")
234
-
235
- df = pd.DataFrame(data_dict)
236
- correlation_matrix = df.corr(method=method)
237
-
238
- await ctx.info("相关性分析完成")
239
-
240
- return CallToolResult(
241
- content=[
242
- TextContent(
243
- type="text",
244
- text=f"{method.title()}相关系数矩阵:\n{correlation_matrix.round(4).to_string()}"
245
- )
246
- ]
247
- )
248
-
249
- except Exception as e:
250
- await ctx.error(f"相关性分析出错: {str(e)}")
251
- return CallToolResult(
252
- content=[TextContent(type="text", text=f"错误: {str(e)}")],
253
- isError=True
254
- )
255
-
256
-
257
- def create_mcp_server() -> FastMCP:
258
- """创建并返回MCP服务器实例"""
259
- return mcp