bisheng-langchain 0.2.3.2__py3-none-any.whl → 0.3.0__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 (45) hide show
  1. bisheng_langchain/agents/llm_functions_agent/base.py +1 -1
  2. bisheng_langchain/chains/__init__.py +2 -1
  3. bisheng_langchain/chains/transform.py +85 -0
  4. bisheng_langchain/chat_models/host_llm.py +19 -5
  5. bisheng_langchain/chat_models/qwen.py +29 -8
  6. bisheng_langchain/document_loaders/custom_kv.py +1 -1
  7. bisheng_langchain/embeddings/host_embedding.py +9 -11
  8. bisheng_langchain/gpts/__init__.py +0 -0
  9. bisheng_langchain/gpts/agent_types/__init__.py +10 -0
  10. bisheng_langchain/gpts/agent_types/llm_functions_agent.py +220 -0
  11. bisheng_langchain/gpts/assistant.py +137 -0
  12. bisheng_langchain/gpts/auto_optimization.py +130 -0
  13. bisheng_langchain/gpts/auto_tool_selected.py +54 -0
  14. bisheng_langchain/gpts/load_tools.py +161 -0
  15. bisheng_langchain/gpts/message_types.py +11 -0
  16. bisheng_langchain/gpts/prompts/__init__.py +15 -0
  17. bisheng_langchain/gpts/prompts/assistant_prompt_opt.py +95 -0
  18. bisheng_langchain/gpts/prompts/base_prompt.py +1 -0
  19. bisheng_langchain/gpts/prompts/breif_description_prompt.py +104 -0
  20. bisheng_langchain/gpts/prompts/opening_dialog_prompt.py +118 -0
  21. bisheng_langchain/gpts/prompts/select_tools_prompt.py +29 -0
  22. bisheng_langchain/gpts/tools/__init__.py +0 -0
  23. bisheng_langchain/gpts/tools/api_tools/__init__.py +50 -0
  24. bisheng_langchain/gpts/tools/api_tools/base.py +90 -0
  25. bisheng_langchain/gpts/tools/api_tools/flow.py +59 -0
  26. bisheng_langchain/gpts/tools/api_tools/macro_data.py +397 -0
  27. bisheng_langchain/gpts/tools/api_tools/sina.py +221 -0
  28. bisheng_langchain/gpts/tools/api_tools/tianyancha.py +160 -0
  29. bisheng_langchain/gpts/tools/bing_search/__init__.py +0 -0
  30. bisheng_langchain/gpts/tools/bing_search/tool.py +55 -0
  31. bisheng_langchain/gpts/tools/calculator/__init__.py +0 -0
  32. bisheng_langchain/gpts/tools/calculator/tool.py +25 -0
  33. bisheng_langchain/gpts/tools/code_interpreter/__init__.py +0 -0
  34. bisheng_langchain/gpts/tools/code_interpreter/tool.py +261 -0
  35. bisheng_langchain/gpts/tools/dalle_image_generator/__init__.py +0 -0
  36. bisheng_langchain/gpts/tools/dalle_image_generator/tool.py +181 -0
  37. bisheng_langchain/gpts/tools/get_current_time/__init__.py +0 -0
  38. bisheng_langchain/gpts/tools/get_current_time/tool.py +23 -0
  39. bisheng_langchain/gpts/utils.py +197 -0
  40. bisheng_langchain/utils/requests.py +5 -1
  41. bisheng_langchain/vectorstores/milvus.py +1 -1
  42. {bisheng_langchain-0.2.3.2.dist-info → bisheng_langchain-0.3.0.dist-info}/METADATA +5 -2
  43. {bisheng_langchain-0.2.3.2.dist-info → bisheng_langchain-0.3.0.dist-info}/RECORD +45 -12
  44. {bisheng_langchain-0.2.3.2.dist-info → bisheng_langchain-0.3.0.dist-info}/WHEEL +0 -0
  45. {bisheng_langchain-0.2.3.2.dist-info → bisheng_langchain-0.3.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,397 @@
1
+ import json
2
+ import time
3
+ from typing import Any
4
+
5
+ import pandas as pd
6
+ import requests
7
+ from langchain.pydantic_v1 import BaseModel, Field
8
+ from langchain_core.tools import BaseTool
9
+
10
+ from .base import MultArgsSchemaTool
11
+
12
+
13
+ class QueryArg(BaseModel):
14
+ start_date: str = Field(default='', description='开始月份, 使用YYYY-MM-DD 方式表示', example='2023-01-01')
15
+ end_date: str = Field(default='', description='结束月份,使用YYYY-MM-DD 方式表示', example='2023-05-01')
16
+
17
+
18
+ class MacroData(BaseModel):
19
+
20
+ @classmethod
21
+ def china_shrzgm(cls, start_date: str = '', end_date: str = '') -> pd.DataFrame:
22
+ """中国社会融资规模增量月度统计数据。\
23
+ 返回月份,社会融资规模增量(单位:亿元),\
24
+ 以及社融分项包括:人民币贷款,外币贷款,委托贷款,\
25
+ 信托贷款,未贴现银行承兑汇票,企业债券,非金融企业境内股票融资
26
+ """
27
+ url = 'http://data.mofcom.gov.cn/datamofcom/front/gnmy/shrzgmQuery'
28
+ r = requests.post(url)
29
+ data_json = r.json()
30
+ temp_df = pd.DataFrame(data_json)
31
+ temp_df.columns = [
32
+ '月份',
33
+ '其中-未贴现银行承兑汇票',
34
+ '其中-委托贷款',
35
+ '其中-委托贷款外币贷款',
36
+ '其中-人民币贷款',
37
+ '其中-企业债券',
38
+ '社会融资规模增量',
39
+ '其中-非金融企业境内股票融资',
40
+ '其中-信托贷款',
41
+ ]
42
+ temp_df = temp_df[
43
+ [
44
+ '月份',
45
+ '社会融资规模增量',
46
+ '其中-人民币贷款',
47
+ '其中-委托贷款外币贷款',
48
+ '其中-委托贷款',
49
+ '其中-信托贷款',
50
+ '其中-未贴现银行承兑汇票',
51
+ '其中-企业债券',
52
+ '其中-非金融企业境内股票融资',
53
+ ]
54
+ ]
55
+ temp_df['社会融资规模增量'] = pd.to_numeric(temp_df['社会融资规模增量'], errors='coerce')
56
+ temp_df['其中-人民币贷款'] = pd.to_numeric(temp_df['其中-人民币贷款'], errors='coerce')
57
+ temp_df['其中-委托贷款外币贷款'] = pd.to_numeric(temp_df['其中-委托贷款外币贷款'], errors='coerce')
58
+ temp_df['其中-委托贷款'] = pd.to_numeric(temp_df['其中-委托贷款'], errors='coerce')
59
+ temp_df['其中-信托贷款'] = pd.to_numeric(temp_df['其中-信托贷款'], errors='coerce')
60
+ temp_df['其中-未贴现银行承兑汇票'] = pd.to_numeric(temp_df['其中-未贴现银行承兑汇票'], errors='coerce')
61
+ temp_df['其中-企业债券'] = pd.to_numeric(temp_df['其中-企业债券'], errors='coerce')
62
+ temp_df['其中-非金融企业境内股票融资'] = pd.to_numeric(temp_df['其中-非金融企业境内股票融资'], errors='coerce')
63
+ temp_df.sort_values(['月份'], inplace=True)
64
+ if start_date and end_date:
65
+ start = start_date.split('-')[0] + start_date.split('-')[1]
66
+ end = end_date.split('-')[0] + end_date.split('-')[1]
67
+ temp_df = temp_df[(temp_df['月份'] >= start) & (temp_df['月份'] <= end)]
68
+
69
+ temp_df.reset_index(drop=True, inplace=True)
70
+ return temp_df.to_markdown()
71
+
72
+ # 金十数据中心-经济指标-中国-国民经济运行状况-经济状况-中国GDP年率报告
73
+ @classmethod
74
+ def china_gdp_yearly(cls, start_date: str = '', end_date: str = '') -> pd.DataFrame:
75
+ """中国国内生产总值(GDP)季度统计数据。\
76
+ 返回当年累计季度,GDP 绝对值(单位:亿元),同比增长(单位:%),\
77
+ 第一产业 GDP 绝对值,(单位:亿元),第一产业同比增长(单位:%),\
78
+ 第二产业 GDP 绝对值,(单位:亿元),第二产业同比增长(单位:%),\
79
+ 第三产业 GDP 绝对值,(单位:亿元),第三产业同比增长(单位:%)
80
+ """
81
+ JS_CHINA_GDP_YEARLY_URL = 'https://cdn.jin10.com/dc/reports/dc_chinese_gdp_yoy_all.js?v={}&_={}'
82
+ t = time.time()
83
+ r = requests.get(JS_CHINA_GDP_YEARLY_URL.format(str(int(round(t * 1000))), str(int(round(t * 1000)) + 90)))
84
+ json_data = json.loads(r.text[r.text.find('{') : r.text.rfind('}') + 1])
85
+ date_list = [item['date'] for item in json_data['list']]
86
+ value_list = [item['datas']['中国GDP年率报告'] for item in json_data['list']]
87
+ value_df = pd.DataFrame(value_list)
88
+ value_df.columns = json_data['kinds']
89
+ value_df.index = pd.to_datetime(date_list)
90
+ temp_df = value_df['今值(%)']
91
+ url = 'https://datacenter-api.jin10.com/reports/list_v2'
92
+ params = {
93
+ 'max_date': '',
94
+ 'category': 'ec',
95
+ 'attr_id': '57',
96
+ '_': str(int(round(t * 1000))),
97
+ }
98
+ headers = {
99
+ 'accept': '*/*',
100
+ 'accept-encoding': 'gzip, deflate, br',
101
+ 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
102
+ 'cache-control': 'no-cache',
103
+ 'origin': 'https://datacenter.jin10.com',
104
+ 'pragma': 'no-cache',
105
+ 'referer': 'https://datacenter.jin10.com/reportType/dc_usa_michigan_consumer_sentiment',
106
+ 'sec-fetch-dest': 'empty',
107
+ 'sec-fetch-mode': 'cors',
108
+ 'sec-fetch-site': 'same-site',
109
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', # noqa
110
+ 'x-app-id': 'rU6QIu7JHe2gOUeR',
111
+ 'x-csrf-token': '',
112
+ 'x-version': '1.0.0',
113
+ }
114
+ r = requests.get(url, params=params, headers=headers)
115
+ temp_se = pd.DataFrame(r.json()['data']['values']).iloc[:, :2]
116
+ temp_se.index = pd.to_datetime(temp_se.iloc[:, 0])
117
+ temp_se = temp_se.iloc[:, 1]
118
+ temp_df = pd.concat([temp_df, temp_se])
119
+ temp_df.dropna(inplace=True)
120
+ temp_df.sort_index(inplace=True)
121
+ temp_df = temp_df.reset_index()
122
+ temp_df.columns = ['date', 'value']
123
+ # temp_df['date'] = pd.to_datetime(temp_df['date']).dt.date
124
+ temp_df['value'] = pd.to_numeric(temp_df['value'])
125
+ temp_df = temp_df.drop_duplicates()
126
+ if start_date and end_date:
127
+ temp_df = temp_df[(temp_df['date'] >= start_date) & (temp_df['date'] <= end_date)]
128
+ return temp_df.to_markdown()
129
+
130
+ @classmethod
131
+ def china_cpi(cls, start_date: str = '', end_date: str = '') -> pd.DataFrame:
132
+ """中国居民消费价格指数(CPI,上年同月=100)月度统计数据。\
133
+ 返回月份,全国当月 CPI,全国当月同比增长,全国当月环比增长,全国当年 CPI 累计值;\
134
+ 城市当月 CPI,城市当月同比增长,城市当月环比增长,城市当年 CPI 累计值;\
135
+ 农村当月 CPI,农村当月同比增长,农村当月环比增长,农村当年 CPI 累计值。
136
+ """
137
+ url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'
138
+ params = {
139
+ 'columns': 'REPORT_DATE,TIME,NATIONAL_SAME,NATIONAL_BASE,NATIONAL_SEQUENTIAL,NATIONAL_ACCUMULATE,CITY_SAME,CITY_BASE,CITY_SEQUENTIAL,CITY_ACCUMULATE,RURAL_SAME,RURAL_BASE,RURAL_SEQUENTIAL,RURAL_ACCUMULATE', # noqa
140
+ 'pageNumber': '1',
141
+ 'pageSize': '2000',
142
+ 'sortColumns': 'REPORT_DATE',
143
+ 'sortTypes': '-1',
144
+ 'source': 'WEB',
145
+ 'client': 'WEB',
146
+ 'reportName': 'RPT_ECONOMY_CPI',
147
+ 'p': '1',
148
+ 'pageNo': '1',
149
+ 'pageNum': '1',
150
+ '_': '1669047266881',
151
+ }
152
+ r = requests.get(url, params=params)
153
+ data_json = r.json()
154
+ temp_df = pd.DataFrame(data_json['result']['data'])
155
+ temp_df.columns = [
156
+ '-',
157
+ '月份',
158
+ '全国-同比增长',
159
+ '全国-当月',
160
+ '全国-环比增长',
161
+ '全国-累计',
162
+ '城市-同比增长',
163
+ '城市-当月',
164
+ '城市-环比增长',
165
+ '城市-累计',
166
+ '农村-同比增长',
167
+ '农村-当月',
168
+ '农村-环比增长',
169
+ '农村-累计',
170
+ ]
171
+ temp_df = temp_df[
172
+ [
173
+ '月份',
174
+ '全国-当月',
175
+ '全国-同比增长',
176
+ '全国-环比增长',
177
+ '全国-累计',
178
+ '城市-当月',
179
+ '城市-同比增长',
180
+ '城市-环比增长',
181
+ '城市-累计',
182
+ '农村-当月',
183
+ '农村-同比增长',
184
+ '农村-环比增长',
185
+ '农村-累计',
186
+ ]
187
+ ]
188
+ temp_df['全国-当月'] = pd.to_numeric(temp_df['全国-当月'], errors='coerce')
189
+ temp_df['全国-同比增长'] = pd.to_numeric(temp_df['全国-同比增长'], errors='coerce')
190
+ temp_df['全国-环比增长'] = pd.to_numeric(temp_df['全国-环比增长'], errors='coerce')
191
+ temp_df['全国-累计'] = pd.to_numeric(temp_df['全国-累计'], errors='coerce')
192
+ temp_df['城市-当月'] = pd.to_numeric(temp_df['城市-当月'], errors='coerce')
193
+ temp_df['城市-同比增长'] = pd.to_numeric(temp_df['城市-同比增长'], errors='coerce')
194
+ temp_df['城市-环比增长'] = pd.to_numeric(temp_df['城市-环比增长'], errors='coerce')
195
+ temp_df['城市-累计'] = pd.to_numeric(temp_df['城市-累计'], errors='coerce')
196
+ temp_df['农村-当月'] = pd.to_numeric(temp_df['农村-当月'], errors='coerce')
197
+ temp_df['农村-同比增长'] = pd.to_numeric(temp_df['农村-同比增长'], errors='coerce')
198
+ temp_df['农村-环比增长'] = pd.to_numeric(temp_df['农村-环比增长'], errors='coerce')
199
+ temp_df['农村-累计'] = pd.to_numeric(temp_df['农村-累计'], errors='coerce')
200
+ if start_date and end_date:
201
+ start = start_date.split('-')[0] + '年' + start_date.split('-')[1] + '月份'
202
+ end = end_date.split('-')[0] + '年' + end_date.split('-')[1] + '月份'
203
+ temp_df = temp_df[(temp_df['月份'] >= start) & (temp_df['月份'] <= end)]
204
+
205
+ return temp_df.to_markdown()
206
+
207
+ @classmethod
208
+ def china_ppi(cls, start_date: str = '', end_date: str = '') -> pd.DataFrame:
209
+ """中国工业品出厂价格指数(PPI)月度统计数据。返回月份,当月 PPI,当月同比增长,当年 CPI 累计值。"""
210
+ url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'
211
+ params = {
212
+ 'columns': 'REPORT_DATE,TIME,BASE,BASE_SAME,BASE_ACCUMULATE',
213
+ 'pageNumber': '1',
214
+ 'pageSize': '2000',
215
+ 'sortColumns': 'REPORT_DATE',
216
+ 'sortTypes': '-1',
217
+ 'source': 'WEB',
218
+ 'client': 'WEB',
219
+ 'reportName': 'RPT_ECONOMY_PPI',
220
+ 'p': '1',
221
+ 'pageNo': '1',
222
+ 'pageNum': '1',
223
+ '_': '1669047266881',
224
+ }
225
+ r = requests.get(url, params=params)
226
+ data_json = r.json()
227
+ temp_df = pd.DataFrame(data_json['result']['data'])
228
+ temp_df.columns = [
229
+ '-',
230
+ '月份',
231
+ '当月',
232
+ '当月同比增长',
233
+ '累计',
234
+ ]
235
+ temp_df = temp_df[
236
+ [
237
+ '月份',
238
+ '当月',
239
+ '当月同比增长',
240
+ '累计',
241
+ ]
242
+ ]
243
+ temp_df['当月'] = pd.to_numeric(temp_df['当月'], errors='coerce')
244
+ temp_df['当月同比增长'] = pd.to_numeric(temp_df['当月同比增长'], errors='coerce')
245
+ temp_df['累计'] = pd.to_numeric(temp_df['累计'], errors='coerce')
246
+ if start_date and end_date:
247
+ start = start_date.split('-')[0] + '年' + start_date.split('-')[1] + '月份'
248
+ end = end_date.split('-')[0] + '年' + end_date.split('-')[1] + '月份'
249
+ temp_df = temp_df[(temp_df['月份'] >= start) & (temp_df['月份'] <= end)]
250
+ return temp_df.to_markdown()
251
+
252
+ @classmethod
253
+ def china_money_supply(cls, start_date: str = '', end_date: str = '') -> pd.DataFrame:
254
+ """中国货币供应量(M2,M1,M0)月度统计数据。\
255
+ 返回月份,M2 数量(单位:亿元),M2 同比(单位:%),\
256
+ M2 环比(单位:%), M1 数量(单位:亿元),\
257
+ M1 同比(单位:%),M1 环比(单位:%), \
258
+ M0数量(单位:亿元),M0 同比(单位:%),M0 环比(单位:%)
259
+ """
260
+ url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'
261
+ params = {
262
+ 'columns': 'REPORT_DATE,TIME,BASIC_CURRENCY,BASIC_CURRENCY_SAME,BASIC_CURRENCY_SEQUENTIAL,CURRENCY,CURRENCY_SAME,CURRENCY_SEQUENTIAL,FREE_CASH,FREE_CASH_SAME,FREE_CASH_SEQUENTIAL', # noqa
263
+ 'pageNumber': '1',
264
+ 'pageSize': '2000',
265
+ 'sortColumns': 'REPORT_DATE',
266
+ 'sortTypes': '-1',
267
+ 'source': 'WEB',
268
+ 'client': 'WEB',
269
+ 'reportName': 'RPT_ECONOMY_CURRENCY_SUPPLY',
270
+ 'p': '1',
271
+ 'pageNo': '1',
272
+ 'pageNum': '1',
273
+ '_': '1669047266881',
274
+ }
275
+ r = requests.get(url, params=params)
276
+ data_json = r.json()
277
+ temp_df = pd.DataFrame(data_json['result']['data'])
278
+ temp_df.columns = [
279
+ '-',
280
+ '月份',
281
+ '货币和准货币(M2)-数量(亿元)',
282
+ '货币和准货币(M2)-同比增长',
283
+ '货币和准货币(M2)-环比增长',
284
+ '货币(M1)-数量(亿元)',
285
+ '货币(M1)-同比增长',
286
+ '货币(M1)-环比增长',
287
+ '流通中的现金(M0)-数量(亿元)',
288
+ '流通中的现金(M0)-同比增长',
289
+ '流通中的现金(M0)-环比增长',
290
+ ]
291
+ temp_df = temp_df[
292
+ [
293
+ '月份',
294
+ '货币和准货币(M2)-数量(亿元)',
295
+ '货币和准货币(M2)-同比增长',
296
+ '货币和准货币(M2)-环比增长',
297
+ '货币(M1)-数量(亿元)',
298
+ '货币(M1)-同比增长',
299
+ '货币(M1)-环比增长',
300
+ '流通中的现金(M0)-数量(亿元)',
301
+ '流通中的现金(M0)-同比增长',
302
+ '流通中的现金(M0)-环比增长',
303
+ ]
304
+ ]
305
+
306
+ temp_df['货币和准货币(M2)-数量(亿元)'] = pd.to_numeric(temp_df['货币和准货币(M2)-数量(亿元)'])
307
+ temp_df['货币和准货币(M2)-同比增长'] = pd.to_numeric(temp_df['货币和准货币(M2)-同比增长'])
308
+ temp_df['货币和准货币(M2)-环比增长'] = pd.to_numeric(temp_df['货币和准货币(M2)-环比增长'])
309
+ temp_df['货币(M1)-数量(亿元)'] = pd.to_numeric(temp_df['货币(M1)-数量(亿元)'])
310
+ temp_df['货币(M1)-同比增长'] = pd.to_numeric(temp_df['货币(M1)-同比增长'])
311
+ temp_df['货币(M1)-环比增长'] = pd.to_numeric(temp_df['货币(M1)-环比增长'])
312
+ temp_df['流通中的现金(M0)-数量(亿元)'] = pd.to_numeric(temp_df['流通中的现金(M0)-数量(亿元)'])
313
+ temp_df['流通中的现金(M0)-同比增长'] = pd.to_numeric(temp_df['流通中的现金(M0)-同比增长'])
314
+ temp_df['流通中的现金(M0)-环比增长'] = pd.to_numeric(temp_df['流通中的现金(M0)-环比增长'])
315
+ if start_date and end_date:
316
+ start = start_date.split('-')[0] + '年' + start_date.split('-')[1] + '月份'
317
+ end = end_date.split('-')[0] + '年' + end_date.split('-')[1] + '月份'
318
+ temp_df = temp_df[(temp_df['月份'] >= start) & (temp_df['月份'] <= end)]
319
+ return temp_df.to_markdown()
320
+
321
+ @classmethod
322
+ def china_consumer_goods_retail(cls, start_date: str = '', end_date: str = '') -> pd.DataFrame:
323
+ """中国社会消费品零售总额月度统计数据。\
324
+ 返回月份,当月总额(单位:亿元),同比增长(单位:%),\
325
+ 环比增长(单位:%),当年累计(单位:亿元),累计同比增长(单位:%)
326
+ """
327
+ url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'
328
+ headers = {
329
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', # noqa
330
+ }
331
+ params = {
332
+ 'columns': 'REPORT_DATE,TIME,RETAIL_TOTAL,RETAIL_TOTAL_SAME,RETAIL_TOTAL_SEQUENTIAL,RETAIL_TOTAL_ACCUMULATE,RETAIL_ACCUMULATE_SAME', # noqa
333
+ 'pageNumber': '1',
334
+ 'pageSize': '1000',
335
+ 'sortColumns': 'REPORT_DATE',
336
+ 'sortTypes': '-1',
337
+ 'source': 'WEB',
338
+ 'client': 'WEB',
339
+ 'reportName': 'RPT_ECONOMY_TOTAL_RETAIL',
340
+ 'p': '1',
341
+ 'pageNo': '1',
342
+ 'pageNum': '1',
343
+ '_': '1660718498421',
344
+ }
345
+ r = requests.get(url, params=params, headers=headers)
346
+ data_json = r.json()
347
+ temp_df = pd.DataFrame(data_json['result']['data'])
348
+ temp_df.columns = [
349
+ '-',
350
+ '月份',
351
+ '当月',
352
+ '同比增长',
353
+ '环比增长',
354
+ '累计',
355
+ '累计-同比增长',
356
+ ]
357
+ temp_df = temp_df[
358
+ [
359
+ '月份',
360
+ '当月',
361
+ '同比增长',
362
+ '环比增长',
363
+ '累计',
364
+ '累计-同比增长',
365
+ ]
366
+ ]
367
+ temp_df['当月'] = pd.to_numeric(temp_df['当月'], errors='coerce')
368
+ temp_df['同比增长'] = pd.to_numeric(temp_df['同比增长'], errors='coerce')
369
+ temp_df['环比增长'] = pd.to_numeric(temp_df['环比增长'], errors='coerce')
370
+ temp_df['累计'] = pd.to_numeric(temp_df['累计'], errors='coerce')
371
+ temp_df['累计-同比增长'] = pd.to_numeric(temp_df['累计-同比增长'], errors='coerce')
372
+ if start_date and end_date:
373
+ start = start_date.split('-')[0] + '年' + start_date.split('-')[1] + '月份'
374
+ end = end_date.split('-')[0] + '年' + end_date.split('-')[1] + '月份'
375
+ temp_df = temp_df[(temp_df['月份'] >= start) & (temp_df['月份'] <= end)]
376
+
377
+ return temp_df.to_markdown()
378
+
379
+ @classmethod
380
+ def get_api_tool(cls, name: str, **kwargs: Any) -> BaseTool:
381
+ attr_name = name.split('_', 1)[-1]
382
+ class_method = getattr(cls, attr_name)
383
+
384
+ return MultArgsSchemaTool(name=name, description=class_method.__doc__, func=class_method, args_schema=QueryArg)
385
+
386
+
387
+ if __name__ == '__main__':
388
+ start_date = '2023-01-01'
389
+ end_date = '2023-05-01'
390
+ # start_date = ''
391
+ # end_date = ''
392
+ # print(MacroData.china_ppi(start_date=start_date, end_date=end_date))
393
+ # print(MacroData.china_shrzgm(start_date=start_date, end_date=end_date))
394
+ # print(MacroData.china_consumer_goods_retail(start_date=start_date, end_date=end_date))
395
+ # print(MacroData.china_cpi(start_date=start_date, end_date=end_date))
396
+ # print(MacroData.china_money_supply(start_date=start_date, end_date=end_date))
397
+ print(MacroData.china_gdp_yearly(start_date=start_date, end_date=end_date))
@@ -0,0 +1,221 @@
1
+ """tianyancha api"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import re
7
+ from datetime import datetime
8
+ from typing import List, Type
9
+
10
+ from langchain_core.pydantic_v1 import BaseModel, Field
11
+
12
+ from .base import APIToolBase
13
+
14
+ asciiPattern = re.compile(r'[A-Z0-9* ]')
15
+
16
+
17
+ # 实时数据Class
18
+ class Stock(BaseModel):
19
+ name: str
20
+ todayStart: float
21
+ yesterdayEnd: float
22
+ current: float
23
+ changeAmount: float
24
+ changeRate: float
25
+ vol: float
26
+ turnover: float
27
+ highest: float
28
+ lowest: float
29
+ buyPercent: float
30
+
31
+ def __init__(self,
32
+ name,
33
+ todayStart,
34
+ yesterdayEnd,
35
+ current,
36
+ highest='0',
37
+ lowest='0',
38
+ vol='0',
39
+ turnover='0'):
40
+ super().__init__(
41
+ name=name,
42
+ todayStart=float(todayStart),
43
+ yesterdayEnd=float(yesterdayEnd),
44
+ current=float(current),
45
+ changeAmount=round(float(current) - float(yesterdayEnd), 3),
46
+ changeRate=round((float(current) - float(yesterdayEnd)) / float(yesterdayEnd) * 100,
47
+ 3),
48
+ vol=float(vol),
49
+ turnover=float(turnover),
50
+ highest=float(highest),
51
+ lowest=float(lowest),
52
+ buyPercent=0.0,
53
+ )
54
+
55
+ self.buyPercent = 0.0 # 买卖盘五档委比
56
+
57
+
58
+ class StockArg(BaseModel):
59
+ prefix: str = Field(
60
+ description='前缀。如果是"stock_symbol"传入的为股票代码,则需要传入s_;\
61
+ 如果"stock_symbol"传入的为指数代码,则为空。',
62
+ default='',
63
+ )
64
+ stock_exchange: str = Field(
65
+ description='交易所简写。股票上市的交易所,或者发布行情指数的交易所。可选项有"sh"(上海证券交易所)、" sz"( 深圳证券交易所)、"bj"( 北京证券交易所)',
66
+ )
67
+ stock_symbol: str = Field(
68
+ description="""6位数字的股票或者指数代码。
69
+ 参考信息:
70
+ - 如果问题中未给出,可能需要上网查询。
71
+ - 上交所股票通常以 6 开头,深交所股票通常以 0、3 开头,北交所股票通常以 8 开头。
72
+ - 上交所行情指数通常以 000 开头,深交所指数通常以 399 开头。同一个指数可能会同时在两个交易所发布,例如沪深 300 有"sh000300"和"sz399300"两个代码。"""
73
+ )
74
+
75
+
76
+ stockPattern = re.compile(r'var hq_str_s[hz]\d{6}="([^,"]+),([^,"]+),([^,"]+),([^,"]+),[^"]+";')
77
+ kLinePattern = re.compile(r'var _s[hz]\d{6}_\d+_\d+=\((\[.*?\])\)')
78
+
79
+
80
+ # 计算买卖委比
81
+ class StockInfo(APIToolBase):
82
+ 'sina stock information'
83
+ args_schema: Type[BaseModel] = StockArg
84
+
85
+ def validate_stockNumber(self, stocks: List[str]):
86
+ stockList = []
87
+ for stockNumber in stocks:
88
+ if len(stockNumber) == 8:
89
+ # 8位长度的代码必须以sh或者sz开头,后面6位是数字
90
+ if (stockNumber.startswith('sh') or stockNumber.startswith('sz')) and stockNumber[2:8].isdecimal():
91
+ stockList.append(stockNumber)
92
+ elif len(stockNumber) == 6:
93
+ # 6位长度的代码必须全是数字
94
+ if stockNumber.isdecimal():
95
+ # 0开头自动补sz,6开头补sh,3开头补sz,否则无效
96
+ if stockNumber.startswith('0'):
97
+ stockList.append('sz' + stockNumber)
98
+ elif stockNumber.startswith('6'):
99
+ stockList.append('sh' + stockNumber)
100
+ elif stockNumber.startswith('3'):
101
+ stockList.append('sz' + stockNumber)
102
+ elif stockNumber == 'sh':
103
+ stockList.append('sh000001')
104
+ elif stockNumber == 'sz':
105
+ stockList.append('sz399001')
106
+ elif stockNumber == 'zx':
107
+ stockList.append('sz399005')
108
+ elif stockNumber == 'cy':
109
+ stockList.append('sz399006')
110
+ elif stockNumber == '300':
111
+ stockList.append('sh000300')
112
+
113
+ return list(map(lambda x: f's_{x}', stockList))
114
+
115
+ def devideStock(self, content: str) -> List[Stock]:
116
+ match = stockPattern.search(content)
117
+ stock = []
118
+ if match:
119
+ while match:
120
+ stock.append(Stock(match.group(1), match.group(2), match.group(3), match.group(4)),
121
+ match.group(5), match.group(6), match.group(9), match.group(10)))
122
+ match = stockPattern.search(content, match.end())
123
+ else:
124
+ stock = [content]
125
+ return stock
126
+
127
+ def run(self, **kwargs):
128
+ prefix = 's_' if kwargs.get('prefix', '') == 's_' else ''
129
+ stock_symbol = kwargs.get('stock_symbol', '')
130
+ stock_exchange = kwargs.get('stock_exchange', '')
131
+ stock_number = ''.join([prefix, stock_exchange, stock_symbol])
132
+
133
+ if self.input_key == 'kLine':
134
+ date_format = '%Y-%m-%d'
135
+ date = kwargs.get('date')
136
+ date_obj = datetime.strptime(date, date_format)
137
+ ts = int(datetime.timestamp(date_obj) * 1000)
138
+ stock = f'{stock_number}_240_{ts}'
139
+ count = datetime.today() - date_obj
140
+ self.url = self.url.format(stockName=stock_number, stock=stock, count=count.days)
141
+
142
+ k_data = super().run('')
143
+ data_array = json.loads(kLinePattern.search(k_data).group(1))
144
+ for item in data_array:
145
+ if item.get('day') == date:
146
+ return json.dumps(item)
147
+ return '{}'
148
+
149
+ resp = super().run(query=stock_number)
150
+ stock = self.devideStock(resp)[0]
151
+ if isinstance(stock, Stock):
152
+ return json.dumps(stock.__dict__)
153
+ else:
154
+ return stock
155
+
156
+ async def arun(self, **kwargs) -> str:
157
+ prefix = 's_' if kwargs.get('prefix', '') == 's_' else ''
158
+ stock_symbol = kwargs.get('stock_symbol', '')
159
+ stock_exchange = kwargs.get('stock_exchange', '')
160
+ stock_number = ''.join([prefix, stock_exchange, stock_symbol])
161
+
162
+ if self.input_key == 'kLine':
163
+ date_format = '%Y-%m-%d'
164
+ date = kwargs.get('date')
165
+ date_obj = datetime.strptime(date, date_format)
166
+ ts = int(datetime.timestamp(date_obj) * 1000)
167
+ stock = f'{stock_number}_240_{ts}'
168
+ count = datetime.today() - date_obj
169
+ self.url = self.url.format(stockName=stock_number, stock=stock, count=count.days)
170
+ k_data = await super().arun('')
171
+
172
+ data_array = json.loads(kLinePattern.search(k_data).group(1))
173
+ for item in data_array:
174
+ if item.get('day') == date:
175
+ return json.dumps(item)
176
+
177
+ return '{}'
178
+ else:
179
+ resp = await super().arun(query=stock_number)
180
+ stock = self.devideStock(resp)[0]
181
+ if isinstance(stock, Stock):
182
+ return json.dumps(stock.__dict__)
183
+ else:
184
+ return stock
185
+
186
+ @classmethod
187
+ def realtime_info(cls) -> StockInfo:
188
+ """查询中国A股(沪深北交易所)股票或指数的实时行情数据,返回收盘价、涨跌额、涨跌幅、成交量、成交额"""
189
+ url = 'https://hq.sinajs.cn'
190
+ input_key = 'list'
191
+ headers = {'Referer': 'http://finance.sina.com.cn'}
192
+ return cls(url=url, input_key=input_key, headers=headers)
193
+
194
+ @classmethod
195
+ def history_KLine(cls) -> StockInfo:
196
+ """查询中国A股(沪深北交易所)股票或指数的的历史行情数据,返回时间、开盘价、最高价、最低价、收盘价、成交量(股)"""
197
+ url = 'https://quotes.sina.cn/cn/api/jsonp_v2.php/var%20_{stock}=/CN_MarketDataService.getKLineData?symbol={stockName}&scale=240&ma=no&datalen={count}' # noqa
198
+ input_key = 'kLine'
199
+ header = {'Referer': 'http://finance.sina.com.cn'}
200
+
201
+ class stockK(BaseModel):
202
+ stock_symbol: str = Field(
203
+ description="""6位数字的股票或者指数代码。
204
+ 参考信息:
205
+ - 如果问题中未给出,可能需要上网查询。
206
+ - 上交所股票通常以 6 开头,深交所股票通常以 0、3 开头,北交所股票通常以 8 开头。
207
+ - 上交所行情指数通常以 000 开头,深交所指数通常以 399 开头。同一个指数可能会同时在两个交易所发布,例如沪深 300 有"sh000300"和"sz399300"两个代码。"""
208
+ )
209
+ stock_exchange: str = Field(
210
+ description='交易所简写。股票上市的交易所,或者发布行情指数的交易所。可选项有"sh"(上海证券交易所)、" sz"( 深圳证券交易所)、"bj"( 北京证券交易所)',
211
+ )
212
+ date: str = Field(description='需要查询的时间,按照”2024-03-26“格式,传入日期')
213
+
214
+ return cls(url=url, input_key=input_key, headers=header, args_schema=stockK)
215
+
216
+ # @classmethod
217
+ # def history_KLine(cls, stockid: str) -> StockInfo:
218
+ # url = 'http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData'
219
+ # input_key = 'list'
220
+ # header = {'Referer': 'http://finance.sina.com.cn'}
221
+ # return cls(url=url, input_key=input_key, header=header)