Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
81 changes: 81 additions & 0 deletions PANDAS_DISPLAY_FIX.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Pandas DataFrame 显示问题修复

## 问题描述

在返回pandas DataFrame时,默认的显示设置会导致数据被折叠,只显示前几行和后几行,中间的行用省略号表示。这影响了数据的完整性和可读性。

## 解决方案

### 1. 创建了统一的pandas显示配置工具

在 `src/findata/utils/pandas_config.py` 中创建了 `set_pandas_display_options()` 函数:

```python
import pandas as pd

def set_pandas_display_options():
"""
设置pandas显示选项,确保DataFrame完整显示,不会被折叠
"""
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('display.max_colwidth', None)
pd.set_option('display.expand_frame_repr', False)
```

### 2. 修改的文件列表

以下文件中的所有返回DataFrame的函数都已更新:

#### financialData.py
- `income()` - 利润表数据
- `balancesheet()` - 资产负债表数据
- `cashflow()` - 现金流量表数据

#### marketData.py
- `daily()` - 日线行情数据

#### fundamentalData.py
- `stock_basic()` - 股票基础信息
- `stock_company()` - 上市公司基本信息

#### macroeconomicData.py
- `shibor_lpr()` - LPR贷款基础利率
- `cn_gdp()` - GDP数据
- `cn_cpi()` - CPI居民消费价格指数
- `cn_ppi()` - PPI工业生产者出厂价格指数
- `cn_m()` - 货币供应量
- `sf_month()` - 社融数据
- `cn_pmi()` - PMI采购经理人指数

### 3. 修改方式

在每个函数的DataFrame返回之前,添加了:

```python
# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df
```

## 效果

修改后,所有返回的DataFrame都会完整显示所有行和列,不会被折叠。这确保了:

1. **数据完整性** - 用户可以看到所有数据行
2. **可读性** - 没有省略号,数据更易读
3. **一致性** - 所有数据接口都使用相同的显示标准

## 测试验证

通过测试脚本验证了修改的有效性,确认:
- `display.max_rows` 设置为 `None`(显示所有行)
- `display.max_columns` 设置为 `None`(显示所有列)
- `display.width` 设置为 `None`(不限制显示宽度)
- `display.max_colwidth` 设置为 `None`(不限制列宽)
- `display.expand_frame_repr` 设置为 `False`(不换行显示)

测试结果显示50行数据全部完整显示,没有任何折叠。
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ Set the environment variables `DATA_API_TOKEN` and `PROVIDER` on the server host
Then, start the MCP Server:

```bash
uv run server.py --transport sse
uv run python src/findata/server.py --transport sse
```

- Optional Arguments:
Expand Down
2 changes: 1 addition & 1 deletion README_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ https://github.com/user-attachments/assets/1a6d02af-22a3-44a0-ada7-a771a1c4818d
然后启动MCP Server:

```bash
uv run server.py --transport sse
uv run python src/findata/server.py --transport sse
```

- 可选参数
Expand Down
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@ dependencies = [
"pandas>=2.2.3",
"tushare>=1.4.21",
]

[project.scripts]
server = "findata.server:run"
Binary file added src/.DS_Store
Binary file not shown.
Binary file added src/findata/.DS_Store
Binary file not shown.
Binary file added src/findata/providers/.DS_Store
Binary file not shown.
19 changes: 16 additions & 3 deletions src/findata/providers/_tushare/financialData.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from typing import Optional
from utils.date_processor import standardize_date
from utils.auth import login
from utils.pandas_config import set_pandas_display_options


# 利润表
Expand Down Expand Up @@ -160,7 +161,11 @@ async def income(
fields = list(set(fields))

df = tsObj.income(ts_code=ts_code, ann_date=ann_date, f_ann_date=f_ann_date, start_date=start_date, end_date=end_date, period=period, report_type=report_type, comp_type=comp_type, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df

except Exception as e:
Expand Down Expand Up @@ -382,7 +387,11 @@ async def balancesheet(
fields = list(set(fields))

df = tsObj.balancesheet(ts_code=ts_code, ann_date=ann_date, start_date=start_date, end_date=end_date, period=period, report_type=report_type, comp_type=comp_type, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df

except Exception as e:
Expand Down Expand Up @@ -551,7 +560,11 @@ async def cashflow(
fields = list(set(fields))

df = tsObj.cashflow(ts_code=ts_code, ann_date=ann_date, f_ann_date=f_ann_date, start_date=start_date, end_date=end_date, period=period, report_type=report_type, comp_type=comp_type, is_calc=is_calc, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df

except Exception as e:
Expand Down
13 changes: 11 additions & 2 deletions src/findata/providers/_tushare/fundamentalData.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from .common import get_trade_dates
from utils.auth import login
from utils.findata_log import setup_logger
from utils.pandas_config import set_pandas_display_options

logger = setup_logger()

Expand Down Expand Up @@ -62,7 +63,11 @@ async def stock_basic(
#TODO 股票代码 标准化

df = tsObj.stock_basic(ts_code=ts_code, name=name, market=market, list_status=list_status, exchange=exchange, is_hs=is_hs, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df

except Exception as e:
Expand Down Expand Up @@ -117,7 +122,11 @@ async def stock_company(
#TODO 股票代码 标准化

df = tsObj.stock_company(ts_code=ts_code, exchange=exchange, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df

except Exception as e:
Expand Down
43 changes: 36 additions & 7 deletions src/findata/providers/_tushare/macroeconomicData.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from typing import Optional
from utils.date_processor import standardize_date
from utils.auth import login
from utils.pandas_config import set_pandas_display_options


# LPR
Expand Down Expand Up @@ -48,7 +49,11 @@ async def shibor_lpr(


df = tsObj.shibor_lpr(start_date=start_date, end_date=end_date, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df
except Exception as e:
raise Exception(f"获取LPR贷款基础利率失败!\n {str(e)}") from e
Expand Down Expand Up @@ -99,7 +104,11 @@ async def cn_gdp(
fields = list(set(fields))

df = tsObj.cn_gdp(q=q, start_q=start_q, end_q=end_q, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df
except Exception as e:
raise Exception(f"获取GDP数据失败!\n {str(e)}") from e
Expand Down Expand Up @@ -151,7 +160,11 @@ async def cn_cpi(
fields = list(set(fields))

df = tsObj.cn_cpi(m=m, start_m=start_m, end_m=end_m, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df
except Exception as e:
raise Exception(f"获取CPI数据失败!\n {str(e)}") from e
Expand Down Expand Up @@ -224,7 +237,11 @@ async def cn_ppi(
fields = list(set(fields))

df = tsObj.cn_ppi(m=m, start_m=start_m, end_m=end_m, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df
except Exception as e:
raise Exception(f"获取PPI数据失败!\n {str(e)}") from e
Expand Down Expand Up @@ -274,7 +291,11 @@ async def cn_m(
fields = list(set(fields))

df = tsObj.cn_m(m=m, start_m=start_m, end_m=end_m, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df
except Exception as e:
raise Exception(f"获取货币供应量数据失败!\n {str(e)}") from e
Expand Down Expand Up @@ -318,7 +339,11 @@ async def sf_month(
fields = list(set(fields))

df = tsObj.sf_month(m=m, start_m=start_m, end_m=end_m, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df
except Exception as e:
raise Exception(f"获取社融数据数据失败!\n {str(e)}") from e
Expand Down Expand Up @@ -418,7 +443,11 @@ async def cn_pmi(
fields = list(set(fields))

df = tsObj.cn_pmi(m=m, start_m=start_m, end_m=end_m, fields=fields)
# return df.to_json()

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df
except Exception as e:
raise Exception(f"获取PMI数据失败!\n {str(e)}") from e
Expand Down
6 changes: 6 additions & 0 deletions src/findata/providers/_tushare/marketData.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from typing import Optional
from utils.date_processor import standardize_date
from utils.auth import login
from utils.pandas_config import set_pandas_display_options


async def daily(
Expand Down Expand Up @@ -68,6 +69,11 @@ async def daily(


df = tsObj.daily(ts_code=ts_code, trade_date=trade_date, start_date=start_date, end_date=end_date, fields=fields)

# 设置pandas显示选项,确保完整显示
set_pandas_display_options()

# 返回完整的DataFrame,不会被折叠
return df
# return df.to_json()
except Exception as e:
Expand Down
13 changes: 8 additions & 5 deletions src/findata/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,15 @@ def run(args):
logger.info("Init finData MCP Server")

# 获取数据供应商
data_provider = os.getenv("PROVIDER").lower()
logger.debug("data provider: " + data_provider)

data_provider = os.getenv("PROVIDER")

if not data_provider:
logger.error("请设置环境变量 PROVIDER 来指定数据供应商")
raise ValueError("请设置环境变量 PROVIDER 来指定数据供应商")
logger.warning("环境变量 PROVIDER 未设置,使用默认值 'tushare'")
data_provider = "tushare"
else:
data_provider = data_provider.lower()

logger.debug("data provider: " + data_provider)

module = importlib.import_module("providers._"+data_provider)

Expand Down
12 changes: 12 additions & 0 deletions src/findata/utils/pandas_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import pandas as pd

def set_pandas_display_options():
"""
设置pandas显示选项,确保DataFrame完整显示,不会被折叠
"""
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('display.max_colwidth', None)
pd.set_option('display.expand_frame_repr', False)

1 change: 1 addition & 0 deletions start_server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@