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.
- panda_data_tools-0.0.1/.env +6 -0
- panda_data_tools-0.0.1/.gitignore +2 -0
- panda_data_tools-0.0.1/.idea/inspectionProfiles/profiles_settings.xml +6 -0
- panda_data_tools-0.0.1/.idea/misc.xml +7 -0
- panda_data_tools-0.0.1/.idea/panda-data.iml +15 -0
- panda_data_tools-0.0.1/.idea/vcs.xml +7 -0
- panda_data_tools-0.0.1/.idea/workspace.xml +232 -0
- panda_data_tools-0.0.1/CHANGELOG.md +63 -0
- panda_data_tools-0.0.1/PKG-INFO +15 -0
- panda_data_tools-0.0.1/README.md +184 -0
- panda_data_tools-0.0.1/build_and_push.sh +83 -0
- panda_data_tools-0.0.1/panda-data-skill/CHANGELOG.md +23 -0
- panda_data_tools-0.0.1/panda-data-skill/README.md +56 -0
- panda_data_tools-0.0.1/panda-data-skill/SKILL.md +200 -0
- panda_data_tools-0.0.1/panda-data-skill/api_reference.md +497 -0
- panda_data_tools-0.0.1/panda-data-skill/scripts/call_tool.py +63 -0
- panda_data_tools-0.0.1/panda_tools/__init__.py +3 -0
- panda_data_tools-0.0.1/panda_tools/cache.py +163 -0
- panda_data_tools-0.0.1/panda_tools/credential.py +135 -0
- panda_data_tools-0.0.1/panda_tools/exporter.py +77 -0
- panda_data_tools-0.0.1/panda_tools/formatter.py +70 -0
- panda_data_tools-0.0.1/panda_tools/registry.py +156 -0
- panda_data_tools-0.0.1/panda_tools/sdk.py +30 -0
- panda_data_tools-0.0.1/panda_tools/tools/__init__.py +24 -0
- panda_data_tools-0.0.1/panda_tools/tools/financial.py +363 -0
- panda_data_tools-0.0.1/panda_tools/tools/futures.py +179 -0
- panda_data_tools-0.0.1/panda_tools/tools/market_data.py +218 -0
- panda_data_tools-0.0.1/panda_tools/tools/market_ref.py +1079 -0
- panda_data_tools-0.0.1/panda_tools/tools/trade_tools.py +251 -0
- panda_data_tools-0.0.1/pyproject.toml +32 -0
- panda_data_tools-0.0.1/tests/__init__.py +1 -0
- panda_data_tools-0.0.1/tests/test.py +12 -0
- panda_data_tools-0.0.1/tests/test_all_apis.py +614 -0
- panda_data_tools-0.0.1/tests/test_cache.py +578 -0
- panda_data_tools-0.0.1/tests/test_changelog.py +142 -0
- panda_data_tools-0.0.1/tests/test_credential.py +158 -0
- panda_data_tools-0.0.1/tests/test_examples.py +74 -0
- panda_data_tools-0.0.1/tests/test_exporter.py +438 -0
- panda_data_tools-0.0.1/tests/test_formatter.py +165 -0
- panda_data_tools-0.0.1/tests/test_readme.py +178 -0
- panda_data_tools-0.0.1/tests/test_registry.py +187 -0
- panda_data_tools-0.0.1/tests/test_schema.py +347 -0
- panda_data_tools-0.0.1/tests/test_skill_content.py +566 -0
- panda_data_tools-0.0.1/uv.lock +314 -0
|
@@ -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,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
|
+
"lastFilter": {
|
|
27
|
+
"state": "OPEN",
|
|
28
|
+
"assignee": "S1mpleUser0618"
|
|
29
|
+
}
|
|
30
|
+
}</component>
|
|
31
|
+
<component name="GithubPullRequestsUISettings">{
|
|
32
|
+
"selectedUrlAndAccountId": {
|
|
33
|
+
"url": "https://github.com/PandaAI-Tech/panda-data.git",
|
|
34
|
+
"accountId": "67658ba6-4085-425d-8327-6bd147249138"
|
|
35
|
+
}
|
|
36
|
+
}</component>
|
|
37
|
+
<component name="ProjectColorInfo">{
|
|
38
|
+
"associatedIndex": 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
|
+
"keyToString": {
|
|
47
|
+
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
|
48
|
+
"Python tests.pytest in test_all_apis.py.executor": "Run",
|
|
49
|
+
"Python.call_tool.executor": "Run",
|
|
50
|
+
"Python.test.executor": "Run",
|
|
51
|
+
"Python.test_all_apis.executor": "Run",
|
|
52
|
+
"RunOnceActivity.ShowReadmeOnStart": "true",
|
|
53
|
+
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
|
|
54
|
+
"RunOnceActivity.git.unshallow": "true",
|
|
55
|
+
"git-widget-placeholder": "main",
|
|
56
|
+
"last_opened_file_path": "/Users/lxh/PycharmProjects/panda-data"
|
|
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="""" />
|
|
164
|
+
<option name="_new_parameters" value="""" />
|
|
165
|
+
<option name="_new_additionalArguments" value="""" />
|
|
166
|
+
<option name="_new_target" value=""$PROJECT_DIR$/tests/test_all_apis.py"" />
|
|
167
|
+
<option name="_new_targetType" value=""PATH"" />
|
|
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
|
+
- 支持行情、市场参考、财务、交易、期货五大分类
|