panda-data-tools 0.0.1__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.
Files changed (44) hide show
  1. panda_data_tools-0.0.1/.env +6 -0
  2. panda_data_tools-0.0.1/.gitignore +2 -0
  3. panda_data_tools-0.0.1/.idea/inspectionProfiles/profiles_settings.xml +6 -0
  4. panda_data_tools-0.0.1/.idea/misc.xml +7 -0
  5. panda_data_tools-0.0.1/.idea/panda-data.iml +15 -0
  6. panda_data_tools-0.0.1/.idea/vcs.xml +7 -0
  7. panda_data_tools-0.0.1/.idea/workspace.xml +232 -0
  8. panda_data_tools-0.0.1/CHANGELOG.md +63 -0
  9. panda_data_tools-0.0.1/PKG-INFO +15 -0
  10. panda_data_tools-0.0.1/README.md +184 -0
  11. panda_data_tools-0.0.1/build_and_push.sh +83 -0
  12. panda_data_tools-0.0.1/panda-data-skill/CHANGELOG.md +23 -0
  13. panda_data_tools-0.0.1/panda-data-skill/README.md +56 -0
  14. panda_data_tools-0.0.1/panda-data-skill/SKILL.md +200 -0
  15. panda_data_tools-0.0.1/panda-data-skill/api_reference.md +497 -0
  16. panda_data_tools-0.0.1/panda-data-skill/scripts/call_tool.py +63 -0
  17. panda_data_tools-0.0.1/panda_tools/__init__.py +3 -0
  18. panda_data_tools-0.0.1/panda_tools/cache.py +163 -0
  19. panda_data_tools-0.0.1/panda_tools/credential.py +135 -0
  20. panda_data_tools-0.0.1/panda_tools/exporter.py +77 -0
  21. panda_data_tools-0.0.1/panda_tools/formatter.py +70 -0
  22. panda_data_tools-0.0.1/panda_tools/registry.py +156 -0
  23. panda_data_tools-0.0.1/panda_tools/sdk.py +30 -0
  24. panda_data_tools-0.0.1/panda_tools/tools/__init__.py +24 -0
  25. panda_data_tools-0.0.1/panda_tools/tools/financial.py +363 -0
  26. panda_data_tools-0.0.1/panda_tools/tools/futures.py +179 -0
  27. panda_data_tools-0.0.1/panda_tools/tools/market_data.py +218 -0
  28. panda_data_tools-0.0.1/panda_tools/tools/market_ref.py +1079 -0
  29. panda_data_tools-0.0.1/panda_tools/tools/trade_tools.py +251 -0
  30. panda_data_tools-0.0.1/pyproject.toml +32 -0
  31. panda_data_tools-0.0.1/tests/__init__.py +1 -0
  32. panda_data_tools-0.0.1/tests/test.py +12 -0
  33. panda_data_tools-0.0.1/tests/test_all_apis.py +614 -0
  34. panda_data_tools-0.0.1/tests/test_cache.py +578 -0
  35. panda_data_tools-0.0.1/tests/test_changelog.py +142 -0
  36. panda_data_tools-0.0.1/tests/test_credential.py +158 -0
  37. panda_data_tools-0.0.1/tests/test_examples.py +74 -0
  38. panda_data_tools-0.0.1/tests/test_exporter.py +438 -0
  39. panda_data_tools-0.0.1/tests/test_formatter.py +165 -0
  40. panda_data_tools-0.0.1/tests/test_readme.py +178 -0
  41. panda_data_tools-0.0.1/tests/test_registry.py +187 -0
  42. panda_data_tools-0.0.1/tests/test_schema.py +347 -0
  43. panda_data_tools-0.0.1/tests/test_skill_content.py +566 -0
  44. panda_data_tools-0.0.1/uv.lock +314 -0
@@ -0,0 +1,6 @@
1
+ PANDA_DATA_USERNAME=""
2
+ PANDA_DATA_PASSWORD=""
3
+
4
+
5
+
6
+ PYPI_API_TOKEN="pypi-AgEIcHlwaS5vcmcCJDExOTRmOTRjLTMxZWEtNDk3NS1hYzYxLTEwYzk2MGUyNWM5YgACKlszLCI4MmIzNjM0Yi0wYjk3LTQxMDYtYTAwYi1hNDhmMjk5MTJhNTMiXQAABiDThZRNeuQCxEbUZUr0VfVU07sxyygLH6tZFD_RYn1Esw"
@@ -0,0 +1,2 @@
1
+ # 本地 API 凭证(全量接口测试)
2
+ tests/local_credentials.py
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="Python 3.9" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="panda-data" project-jdk-type="Python SDK" />
7
+ </project>
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="jdk" jdkName="panda-data" jdkType="Python SDK" />
6
+ <orderEntry type="sourceFolder" forTests="false" />
7
+ </component>
8
+ <component name="PyDocumentationSettings">
9
+ <option name="format" value="PLAIN" />
10
+ <option name="myDocStringFormat" value="Plain" />
11
+ </component>
12
+ <component name="TestRunnerService">
13
+ <option name="PROJECT_TEST_RUNNER" value="py.test" />
14
+ </component>
15
+ </module>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
6
+ </component>
7
+ </project>
@@ -0,0 +1,232 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="3b25ef23-4048-4dd2-8008-78f06b201660" name="Changes" comment="projection commit">
8
+ <change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
9
+ </list>
10
+ <option name="SHOW_DIALOG" value="false" />
11
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
12
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
13
+ <option name="LAST_RESOLUTION" value="IGNORE" />
14
+ </component>
15
+ <component name="FileTemplateManagerImpl">
16
+ <option name="RECENT_TEMPLATES">
17
+ <list>
18
+ <option value="Python Script" />
19
+ </list>
20
+ </option>
21
+ </component>
22
+ <component name="Git.Settings">
23
+ <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
24
+ </component>
25
+ <component name="GitHubPullRequestSearchHistory">{
26
+ &quot;lastFilter&quot;: {
27
+ &quot;state&quot;: &quot;OPEN&quot;,
28
+ &quot;assignee&quot;: &quot;S1mpleUser0618&quot;
29
+ }
30
+ }</component>
31
+ <component name="GithubPullRequestsUISettings">{
32
+ &quot;selectedUrlAndAccountId&quot;: {
33
+ &quot;url&quot;: &quot;https://github.com/PandaAI-Tech/panda-data.git&quot;,
34
+ &quot;accountId&quot;: &quot;67658ba6-4085-425d-8327-6bd147249138&quot;
35
+ }
36
+ }</component>
37
+ <component name="ProjectColorInfo">{
38
+ &quot;associatedIndex&quot;: 0
39
+ }</component>
40
+ <component name="ProjectId" id="3B9fQ2gGN5xDs6yQBheKBdShq8S" />
41
+ <component name="ProjectViewState">
42
+ <option name="hideEmptyMiddlePackages" value="true" />
43
+ <option name="showLibraryContents" value="true" />
44
+ </component>
45
+ <component name="PropertiesComponent">{
46
+ &quot;keyToString&quot;: {
47
+ &quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
48
+ &quot;Python tests.pytest in test_all_apis.py.executor&quot;: &quot;Run&quot;,
49
+ &quot;Python.call_tool.executor&quot;: &quot;Run&quot;,
50
+ &quot;Python.test.executor&quot;: &quot;Run&quot;,
51
+ &quot;Python.test_all_apis.executor&quot;: &quot;Run&quot;,
52
+ &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
53
+ &quot;RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252&quot;: &quot;true&quot;,
54
+ &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
55
+ &quot;git-widget-placeholder&quot;: &quot;main&quot;,
56
+ &quot;last_opened_file_path&quot;: &quot;/Users/lxh/PycharmProjects/panda-data&quot;
57
+ }
58
+ }</component>
59
+ <component name="RecentsManager">
60
+ <key name="CopyFile.RECENT_KEYS">
61
+ <recent name="$PROJECT_DIR$" />
62
+ </key>
63
+ </component>
64
+ <component name="RunManager" selected="Python.test">
65
+ <configuration name="call_tool" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
66
+ <module name="panda-data" />
67
+ <option name="ENV_FILES" value="" />
68
+ <option name="INTERPRETER_OPTIONS" value="" />
69
+ <option name="PARENT_ENVS" value="true" />
70
+ <envs>
71
+ <env name="PYTHONUNBUFFERED" value="1" />
72
+ </envs>
73
+ <option name="SDK_HOME" value="" />
74
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/panda-data-skill/scripts" />
75
+ <option name="IS_MODULE_SDK" value="true" />
76
+ <option name="ADD_CONTENT_ROOTS" value="true" />
77
+ <option name="ADD_SOURCE_ROOTS" value="true" />
78
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/panda-data-skill/scripts/call_tool.py" />
79
+ <option name="PARAMETERS" value="" />
80
+ <option name="SHOW_COMMAND_LINE" value="false" />
81
+ <option name="EMULATE_TERMINAL" value="false" />
82
+ <option name="MODULE_MODE" value="false" />
83
+ <option name="REDIRECT_INPUT" value="false" />
84
+ <option name="INPUT_FILE" value="" />
85
+ <method v="2" />
86
+ </configuration>
87
+ <configuration name="main" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
88
+ <module name="panda-data" />
89
+ <option name="ENV_FILES" value="" />
90
+ <option name="INTERPRETER_OPTIONS" value="" />
91
+ <option name="PARENT_ENVS" value="true" />
92
+ <envs>
93
+ <env name="PYTHONUNBUFFERED" value="1" />
94
+ </envs>
95
+ <option name="SDK_HOME" value="" />
96
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
97
+ <option name="IS_MODULE_SDK" value="true" />
98
+ <option name="ADD_CONTENT_ROOTS" value="true" />
99
+ <option name="ADD_SOURCE_ROOTS" value="true" />
100
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/main.py" />
101
+ <option name="PARAMETERS" value="" />
102
+ <option name="SHOW_COMMAND_LINE" value="false" />
103
+ <option name="EMULATE_TERMINAL" value="false" />
104
+ <option name="MODULE_MODE" value="false" />
105
+ <option name="REDIRECT_INPUT" value="false" />
106
+ <option name="INPUT_FILE" value="" />
107
+ <method v="2" />
108
+ </configuration>
109
+ <configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
110
+ <module name="panda-data" />
111
+ <option name="ENV_FILES" value="$PROJECT_DIR$/.env" />
112
+ <option name="INTERPRETER_OPTIONS" value="" />
113
+ <option name="PARENT_ENVS" value="true" />
114
+ <envs>
115
+ <env name="PYTHONUNBUFFERED" value="1" />
116
+ </envs>
117
+ <option name="SDK_HOME" value="" />
118
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests" />
119
+ <option name="IS_MODULE_SDK" value="true" />
120
+ <option name="ADD_CONTENT_ROOTS" value="true" />
121
+ <option name="ADD_SOURCE_ROOTS" value="true" />
122
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/tests/test.py" />
123
+ <option name="PARAMETERS" value="" />
124
+ <option name="SHOW_COMMAND_LINE" value="false" />
125
+ <option name="EMULATE_TERMINAL" value="false" />
126
+ <option name="MODULE_MODE" value="false" />
127
+ <option name="REDIRECT_INPUT" value="false" />
128
+ <option name="INPUT_FILE" value="" />
129
+ <method v="2" />
130
+ </configuration>
131
+ <configuration name="test_all_apis" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
132
+ <module name="panda-data" />
133
+ <option name="ENV_FILES" value="" />
134
+ <option name="INTERPRETER_OPTIONS" value="" />
135
+ <option name="PARENT_ENVS" value="true" />
136
+ <envs>
137
+ <env name="PYTHONUNBUFFERED" value="1" />
138
+ </envs>
139
+ <option name="SDK_HOME" value="" />
140
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests" />
141
+ <option name="IS_MODULE_SDK" value="true" />
142
+ <option name="ADD_CONTENT_ROOTS" value="true" />
143
+ <option name="ADD_SOURCE_ROOTS" value="true" />
144
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/tests/test_all_apis.py" />
145
+ <option name="PARAMETERS" value="" />
146
+ <option name="SHOW_COMMAND_LINE" value="false" />
147
+ <option name="EMULATE_TERMINAL" value="false" />
148
+ <option name="MODULE_MODE" value="false" />
149
+ <option name="REDIRECT_INPUT" value="false" />
150
+ <option name="INPUT_FILE" value="" />
151
+ <method v="2" />
152
+ </configuration>
153
+ <configuration name="pytest in test_all_apis.py" type="tests" factoryName="py.test" temporary="true" nameIsGenerated="true">
154
+ <module name="panda-data" />
155
+ <option name="ENV_FILES" value="" />
156
+ <option name="INTERPRETER_OPTIONS" value="" />
157
+ <option name="PARENT_ENVS" value="true" />
158
+ <option name="SDK_HOME" value="" />
159
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
160
+ <option name="IS_MODULE_SDK" value="true" />
161
+ <option name="ADD_CONTENT_ROOTS" value="true" />
162
+ <option name="ADD_SOURCE_ROOTS" value="true" />
163
+ <option name="_new_keywords" value="&quot;&quot;" />
164
+ <option name="_new_parameters" value="&quot;&quot;" />
165
+ <option name="_new_additionalArguments" value="&quot;&quot;" />
166
+ <option name="_new_target" value="&quot;$PROJECT_DIR$/tests/test_all_apis.py&quot;" />
167
+ <option name="_new_targetType" value="&quot;PATH&quot;" />
168
+ <method v="2" />
169
+ </configuration>
170
+ <list>
171
+ <item itemvalue="Python.main" />
172
+ <item itemvalue="Python.call_tool" />
173
+ <item itemvalue="Python.test" />
174
+ <item itemvalue="Python.test_all_apis" />
175
+ <item itemvalue="Python tests.pytest in test_all_apis.py" />
176
+ </list>
177
+ <recent_temporary>
178
+ <list>
179
+ <item itemvalue="Python.test" />
180
+ <item itemvalue="Python tests.pytest in test_all_apis.py" />
181
+ <item itemvalue="Python.call_tool" />
182
+ <item itemvalue="Python.test_all_apis" />
183
+ </list>
184
+ </recent_temporary>
185
+ </component>
186
+ <component name="SharedIndexes">
187
+ <attachedChunks>
188
+ <set>
189
+ <option value="bundled-python-sdk-4e2b1448bda8-9a97661f3031-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-252.27397.106" />
190
+ </set>
191
+ </attachedChunks>
192
+ </component>
193
+ <component name="TaskManager">
194
+ <task active="true" id="Default" summary="Default task">
195
+ <changelist id="3b25ef23-4048-4dd2-8008-78f06b201660" name="Changes" comment="" />
196
+ <created>1773906187094</created>
197
+ <option name="number" value="Default" />
198
+ <option name="presentableId" value="Default" />
199
+ <updated>1773906187094</updated>
200
+ </task>
201
+ <task id="LOCAL-00001" summary="projection commit">
202
+ <option name="closed" value="true" />
203
+ <created>1774338964054</created>
204
+ <option name="number" value="00001" />
205
+ <option name="presentableId" value="LOCAL-00001" />
206
+ <option name="project" value="LOCAL" />
207
+ <updated>1774338964054</updated>
208
+ </task>
209
+ <task id="LOCAL-00002" summary="projection commit">
210
+ <option name="closed" value="true" />
211
+ <created>1774342655433</created>
212
+ <option name="number" value="00002" />
213
+ <option name="presentableId" value="LOCAL-00002" />
214
+ <option name="project" value="LOCAL" />
215
+ <updated>1774342655433</updated>
216
+ </task>
217
+ <task id="LOCAL-00003" summary="projection commit">
218
+ <option name="closed" value="true" />
219
+ <created>1774345486028</created>
220
+ <option name="number" value="00003" />
221
+ <option name="presentableId" value="LOCAL-00003" />
222
+ <option name="project" value="LOCAL" />
223
+ <updated>1774345486028</updated>
224
+ </task>
225
+ <option name="localTasksCounter" value="4" />
226
+ <servers />
227
+ </component>
228
+ <component name="VcsManagerConfiguration">
229
+ <MESSAGE value="projection commit" />
230
+ <option name="LAST_COMMIT_MESSAGE" value="projection commit" />
231
+ </component>
232
+ </project>
@@ -0,0 +1,63 @@
1
+ # Changelog
2
+
3
+ 本文件记录 PandaAI 金融数据 Tool 层 (`panda-data-tools`) 的所有版本变更。
4
+
5
+ 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
6
+ 本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
7
+
8
+ ## [2.0.0] - 2025-07-18
9
+
10
+ ### Added
11
+
12
+ - 新增 DuckDB 本地数据缓存模块 (`panda_tools/cache.py`)
13
+ - `CacheManager` 类:支持 `save`、`read`(带过滤条件)、`clear`、`list_tables`、`close`
14
+ - 可配置数据库路径,默认 `./panda_data_cache.duckdb`
15
+ - DuckDB 未安装时优雅降级,记录警告日志
16
+ - 新增数据导出模块 (`panda_tools/exporter.py`)
17
+ - `export_data` 函数:支持 CSV、Excel、DuckDB 三种格式导出
18
+ - CSV 导出使用 UTF-8 with BOM 编码(`utf-8-sig`)
19
+ - Excel 导出基于 openpyxl 引擎
20
+ - DuckDB 导出为指定数据库文件的表
21
+ - 自动创建输出目录
22
+ - 统一错误消息格式:`"导出失败:{ErrorType}: {message}"`
23
+ - 新增属性基测试(Hypothesis)
24
+ - 缓存存取往返一致性测试 (Property 2)
25
+ - 缓存过滤查询正确性测试 (Property 3)
26
+ - 缓存清除有效性测试 (Property 4)
27
+ - 导出往返一致性测试 (Property 5)
28
+ - 导出成功消息验证测试 (Property 6)
29
+ - 导出失败消息格式测试 (Property 7)
30
+ - 导出自动创建目录测试 (Property 8)
31
+ - 新增 `CHANGELOG.md` 版本变更记录
32
+ - 新增 `duckdb` 为项目依赖
33
+
34
+ ### Changed
35
+
36
+ - `pyproject.toml` 添加 `duckdb` 到 dependencies
37
+ - `pyproject.toml` 添加 `[project.optional-dependencies]` test 组(pytest, hypothesis, duckdb, openpyxl)
38
+ - `README.md` 更新,补充 cache.py 和 exporter.py 模块文档
39
+
40
+ ## [1.0.0] - 2025-07-01
41
+
42
+ ### Added
43
+
44
+ - 初始发布,将 panda_data 包的 38 个金融数据查询 API 封装为 LLM function calling tools
45
+ - 凭证管理模块 (`panda_tools/credential.py`)
46
+ - `CredentialManager` 类:支持环境变量配置用户名和密码
47
+ - API 返回值格式化器 (`panda_tools/formatter.py`)
48
+ - `safe_call` 函数:统一 API 调用和错误处理
49
+ - 错误消息格式:`"API 调用失败:{ErrorType}: {message}"`
50
+ - Tool 注册中心 (`panda_tools/registry.py`)
51
+ - `ToolRegistry` 类:管理所有 tool 的注册和发现
52
+ - 6 个分类 Tool 模块,覆盖 38 个 API:
53
+ - `tools/market_data.py` — 行情数据
54
+ - `tools/market_ref.py` — 基础信息
55
+ - `tools/financial.py` — 财务数据
56
+ - `tools/futures.py` — 期货数据
57
+ - `tools/trade_tools.py` — 交易工具
58
+ - 测试套件:
59
+ - `tests/test_credential.py` — 凭证管理测试
60
+ - `tests/test_formatter.py` — 格式化器测试
61
+ - `tests/test_registry.py` — 注册中心测试
62
+ - `tests/test_schema.py` — Tool schema 验证测试
63
+ - `tests/test_all_apis.py` — 全量 API 测试
@@ -0,0 +1,15 @@
1
+ Metadata-Version: 2.4
2
+ Name: panda-data-tools
3
+ Version: 0.0.1
4
+ Summary: PandaAI 金融数据 API 的 LLM Tool 封装层,将 38 个数据查询方法封装为符合 function calling 规范的 tools。
5
+ Requires-Python: >=3.12
6
+ Requires-Dist: duckdb
7
+ Requires-Dist: panda-data
8
+ Requires-Dist: panda-data-tools
9
+ Requires-Dist: pandas
10
+ Requires-Dist: python-dotenv>=1.0.0
11
+ Provides-Extra: test
12
+ Requires-Dist: duckdb; extra == 'test'
13
+ Requires-Dist: hypothesis; extra == 'test'
14
+ Requires-Dist: openpyxl; extra == 'test'
15
+ Requires-Dist: pytest; extra == 'test'
@@ -0,0 +1,184 @@
1
+ # panda-data-tools
2
+
3
+ PandaAI 金融数据 API 的 LLM Tool 封装层,将 `panda_data` 包的 38 个数据查询方法封装为符合 LLM function calling 规范的 tools。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ # 本地安装(推荐使用 uv)
9
+ uv pip install .
10
+
11
+ # 或使用 pip
12
+ pip install .
13
+ ```
14
+
15
+ ### 依赖说明
16
+
17
+ 核心依赖:
18
+
19
+ - `pandas` — 数据处理
20
+ - `duckdb` — 本地数据缓存和 DuckDB 格式导出
21
+
22
+ 可选依赖:
23
+
24
+ - `openpyxl` — Excel 格式导出(未安装时 Excel 导出返回错误提示)
25
+
26
+ ## 构建分发包
27
+
28
+ ```bash
29
+ uv build
30
+ ```
31
+
32
+ ## 使用方式
33
+
34
+ ### 基本用法
35
+
36
+ ```python
37
+ from panda_tools.credential import CredentialManager
38
+ from panda_tools.registry import ToolRegistry
39
+
40
+ # 1. 认证初始化(从环境变量读取凭证)
41
+ CredentialManager.init_from_env()
42
+
43
+ # 2. 获取所有 tool 定义
44
+ registry = ToolRegistry()
45
+ tools = registry.get_all_tools()
46
+
47
+ # 3. 调用指定 tool
48
+ result = registry.call_tool("get_market_data", start_date="20250101", end_date="20250110", symbol="000001.SZ")
49
+ print(result)
50
+ ```
51
+
52
+ ### 数据缓存
53
+
54
+ 使用 `CacheManager` 将查询结果缓存到本地 DuckDB 数据库,避免重复调用远程 API:
55
+
56
+ ```python
57
+ from panda_tools.cache import CacheManager
58
+
59
+ # 初始化缓存管理器(可自定义数据库路径)
60
+ cache = CacheManager(db_path="./my_cache.duckdb")
61
+
62
+ # 缓存查询结果
63
+ cache.save("get_market_data", df)
64
+
65
+ # 读取缓存数据(支持过滤条件)
66
+ cached_df = cache.read("get_market_data", symbol="000001.SZ")
67
+
68
+ # 查看所有缓存表
69
+ tables = cache.list_tables()
70
+
71
+ # 清除指定表缓存
72
+ cache.clear("get_market_data")
73
+
74
+ # 清除所有缓存
75
+ cache.clear()
76
+
77
+ # 关闭连接
78
+ cache.close()
79
+ ```
80
+
81
+ ### 数据导出
82
+
83
+ 使用 `export_data` 将 DataFrame 导出为 CSV、Excel 或 DuckDB 格式:
84
+
85
+ ```python
86
+ from panda_tools.exporter import export_data
87
+
88
+ # 导出为 CSV(UTF-8 with BOM 编码,Excel 打开中文不乱码)
89
+ result = export_data(df, "output/data.csv", format="csv")
90
+
91
+ # 导出为 Excel
92
+ result = export_data(df, "output/data.xlsx", format="excel")
93
+
94
+ # 导出为 DuckDB 表
95
+ result = export_data(df, "output/data.duckdb", format="duckdb", table_name="market_data")
96
+ ```
97
+
98
+ 输出目录不存在时会自动创建。
99
+
100
+ ## 测试
101
+
102
+ ```bash
103
+ # 运行属性基测试和单元测试(不需要 API 凭证)
104
+ uv run pytest tests/ -v
105
+
106
+ # 运行 Hypothesis 属性基测试
107
+ uv run pytest tests/ -v -k "hypothesis or property"
108
+
109
+ # 运行全量接口批量测试(需要 API 凭证)
110
+ uv run --with ./panda_data-0.1.0-py3-none-any.whl pytest tests/test_all_apis.py -v
111
+
112
+ # 按类别测试
113
+ uv run --with ./panda_data-0.1.0-py3-none-any.whl pytest tests/test_all_apis.py -v --category market_data
114
+
115
+ # 测试单个方法
116
+ uv run --with ./panda_data-0.1.0-py3-none-any.whl pytest tests/test_all_apis.py -v --method get_market_data
117
+ ```
118
+
119
+ 测试依赖:`pytest`、`hypothesis`、`duckdb`、`openpyxl`
120
+
121
+ ## 项目结构
122
+
123
+ ```
124
+ panda-data/
125
+ ├── panda_tools/
126
+ │ ├── __init__.py # 包入口
127
+ │ ├── credential.py # 凭证管理
128
+ │ ├── registry.py # Tool 注册中心
129
+ │ ├── formatter.py # 返回值格式化
130
+ │ ├── cache.py # DuckDB 本地数据缓存(v2.0.0 新增)
131
+ │ ├── exporter.py # 数据导出 CSV/Excel/DuckDB(v2.0.0 新增)
132
+ │ └── tools/ # 按类别组织的 tool 定义
133
+ │ ├── __init__.py
134
+ │ ├── market_data.py # 行情数据(2个方法)
135
+ │ ├── market_ref.py # 市场参考数据(20个方法)
136
+ │ ├── financial.py # 财务与因子(5个方法)
137
+ │ ├── trade_tools.py # 交易工具(5个方法)
138
+ │ └── futures.py # 期货(3个方法)
139
+ ├── tests/
140
+ │ ├── __init__.py
141
+ │ ├── test_all_apis.py # 全量接口批量测试
142
+ │ ├── test_cache.py # 缓存模块测试(属性基 + 单元)
143
+ │ ├── test_exporter.py # 导出模块测试(属性基 + 单元)
144
+ │ ├── test_credential.py # 凭证管理测试
145
+ │ ├── test_formatter.py # 格式化器测试
146
+ │ ├── test_registry.py # 注册中心测试
147
+ │ ├── test_schema.py # Tool schema 验证测试
148
+ │ ├── test_changelog.py # CHANGELOG 格式测试
149
+ │ └── test_skill_content.py # SKILL.md 内容测试
150
+ ├── panda-data-skill/ # ClawHub 技能包(发布用)
151
+ │ ├── SKILL.md
152
+ │ ├── README.md
153
+ │ ├── CHANGELOG.md
154
+ │ ├── api_reference.md
155
+ │ └── scripts/
156
+ │ └── call_tool.py
157
+ ├── pyproject.toml
158
+ ├── CHANGELOG.md
159
+ └── README.md
160
+ ```
161
+
162
+ ## v2.0.0 新特性
163
+
164
+ ### DuckDB 本地数据缓存
165
+
166
+ - 基于 DuckDB 的查询结果本地持久化存储
167
+ - 支持按表名存取、过滤查询、单表/全量清除
168
+ - DuckDB 未安装时自动降级,不影响现有功能
169
+
170
+ ### 数据导出
171
+
172
+ - 支持 CSV(UTF-8 with BOM)、Excel(openpyxl)、DuckDB 三种格式
173
+ - 自动创建输出目录
174
+ - 统一的错误消息格式
175
+
176
+ ### 属性基测试
177
+
178
+ - 使用 Hypothesis 框架编写属性基测试
179
+ - 覆盖缓存存取往返、过滤查询、清除有效性
180
+ - 覆盖导出往返一致性、成功消息、失败消息、目录自动创建
181
+
182
+ ## 变更记录
183
+
184
+ 详见 [CHANGELOG.md](CHANGELOG.md)。
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env bash
2
+ # PyPI 发布脚本:构建 wheel/sdist 并上传到 Test PyPI 或正式 PyPI。
3
+ # 依赖:pip install build twine
4
+ #
5
+ # 令牌(勿提交到 git):
6
+ # - Test PyPI: 在 https://test.pypi.org/manage/account/token/ 创建,设置 TEST_PYPI_API_TOKEN
7
+ # - 正式 PyPI: 在 https://pypi.org/manage/account/token/ 创建,设置 PYPI_API_TOKEN
8
+ #
9
+ # 用法:
10
+ # ./build_and_push.sh build # 仅清理并构建 + twine check(默认)
11
+ # ./build_and_push.sh test # 构建并上传到 Test PyPI
12
+ # ./build_and_push.sh prod # 构建并上传到正式 PyPI
13
+ # ./build_and_push.sh clean # 仅删除 dist/ build/ 等
14
+ #
15
+ # 发布后用户安装(与 pyproject.toml [project] name 一致):
16
+ # pip install panda-data-tools
17
+ #
18
+ # 安装后 Python 中 import 的是包目录名 panda_tools(非 PyPI 项目名):
19
+ # from panda_tools.credential import CredentialManager
20
+ # from panda_tools.registry import ToolRegistry
21
+
22
+ set -euo pipefail
23
+
24
+ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25
+ cd "$ROOT"
26
+
27
+ # PyPI / pip 使用的发行版名称(与 pyproject.toml [project] name 一致)
28
+ DISTRIBUTION_NAME="panda-data-tools"
29
+
30
+ clean() {
31
+ rm -rf dist build *.egg-info
32
+ }
33
+
34
+ build_only() {
35
+ clean
36
+ python -m build
37
+ twine check dist/*
38
+ echo "构建完成: dist/"
39
+ }
40
+
41
+ upload_test() {
42
+ export TWINE_USERNAME=__token__
43
+ export TWINE_PASSWORD="${TEST_PYPI_API_TOKEN:?请设置环境变量 TEST_PYPI_API_TOKEN(Test PyPI API token)}"
44
+ twine upload --repository-url https://test.pypi.org/legacy/ dist/*
45
+ echo "已上传到 Test PyPI。本地验证安装示例:"
46
+ echo " pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ ${DISTRIBUTION_NAME}"
47
+ }
48
+
49
+ upload_prod() {
50
+ export TWINE_USERNAME=__token__
51
+ export TWINE_PASSWORD="${PYPI_API_TOKEN:?请设置环境变量 PYPI_API_TOKEN(PyPI API token)}"
52
+ twine upload dist/*
53
+ echo "已上传到 PyPI。用户安装:"
54
+ echo " pip install ${DISTRIBUTION_NAME}"
55
+ echo "验证导入示例:"
56
+ echo " python -c \"from panda_tools.credential import CredentialManager; from panda_tools.registry import ToolRegistry; print('ok')\""
57
+ }
58
+
59
+ case "${1:-build}" in
60
+ clean)
61
+ clean
62
+ echo "已清理 dist/、build/、*.egg-info"
63
+ ;;
64
+ build)
65
+ build_only
66
+ ;;
67
+ test)
68
+ build_only
69
+ upload_test
70
+ ;;
71
+ prod|publish)
72
+ build_only
73
+ read -r -p "确认上传到正式 PyPI?(y/N) " ans
74
+ case "$ans" in
75
+ y|Y|yes|YES) upload_prod ;;
76
+ *) echo "已取消"; exit 1 ;;
77
+ esac
78
+ ;;
79
+ *)
80
+ echo "用法: $0 {build|test|prod|clean}" >&2
81
+ exit 1
82
+ ;;
83
+ esac
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ 本文件记录 Panda Data Skill 的所有版本变更。
4
+
5
+ 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
6
+ 本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
7
+
8
+ ## [2.0.0] - 2025-07-18
9
+
10
+ ### Added
11
+
12
+ - 与 panda-data-tools v2.0.0 对齐
13
+ - 支持 DuckDB 本地数据缓存
14
+ - 支持数据导出(CSV、Excel、DuckDB)
15
+ - 完善 SKILL.md 结构,包含全部 35 个 API 方法说明
16
+
17
+ ## [1.0.0] - 2025-07-01
18
+
19
+ ### Added
20
+
21
+ - 初始发布
22
+ - 35 个金融数据 API 的 LLM Tool 封装
23
+ - 支持行情、市场参考、财务、交易、期货五大分类