├── src
└── findata
│ ├── __init__.py
│ ├── providers
│ ├── _wind
│ │ ├── __init__.py
│ │ └── getData.py
│ └── _tushare
│ │ ├── __init__.py
│ │ ├── common.py
│ │ ├── marketData.py
│ │ ├── fundamentalData.py
│ │ ├── macroeconomicData.py
│ │ └── financialData.py
│ ├── utils
│ ├── auth.py
│ ├── findata_log.py
│ └── date_processor.py
│ └── server.py
├── .python-version
├── assets
└── logo.png
├── .gitignore
├── pyproject.toml
├── README_zh.md
├── README.md
├── LICENSE
└── uv.lock
/src/findata/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.python-version:
--------------------------------------------------------------------------------
1 | 3.11
2 |
--------------------------------------------------------------------------------
/src/findata/providers/_wind/__init__.py:
--------------------------------------------------------------------------------
1 | from .getData import sayHiWind
--------------------------------------------------------------------------------
/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zlinzzzz/finData-mcp-server/HEAD/assets/logo.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Python-generated files
2 | __pycache__/
3 | *.py[oc]
4 | build/
5 | dist/
6 | wheels/
7 | *.egg-info
8 | *.log
9 |
10 | # Virtual environments
11 | .venv
12 |
--------------------------------------------------------------------------------
/src/findata/providers/_wind/getData.py:
--------------------------------------------------------------------------------
1 | async def sayHiWind() -> str:
2 | """
3 | Name:
4 | 打招呼专用
5 |
6 | Description:
7 | 礼貌的回应用户的打招呼
8 | """
9 |
10 | return "欢迎使用Wind!"
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [project]
2 | name = "findata"
3 | version = "0.1.0"
4 | description = "Add your description here"
5 | readme = "README.md"
6 | requires-python = ">=3.11"
7 | dependencies = [
8 | "mcp[cli]>=1.6.0",
9 | "pandas>=2.2.3",
10 | "tushare>=1.4.21",
11 | ]
12 |
--------------------------------------------------------------------------------
/src/findata/providers/_tushare/__init__.py:
--------------------------------------------------------------------------------
1 | from .fundamentalData import stock_basic
2 | from .fundamentalData import stock_company
3 | from .fundamentalData import bak_basic
4 |
5 | from .marketData import daily
6 |
7 | from .macroeconomicData import shibor_lpr
8 | from .macroeconomicData import cn_gdp
9 | from .macroeconomicData import cn_cpi
10 | from .macroeconomicData import cn_ppi
11 | from .macroeconomicData import cn_m
12 | from .macroeconomicData import sf_month
13 | from .macroeconomicData import cn_pmi
14 |
15 | from .financialData import income
16 | from .financialData import balancesheet
17 | from .financialData import cashflow
--------------------------------------------------------------------------------
/src/findata/providers/_tushare/common.py:
--------------------------------------------------------------------------------
1 | from utils.date_processor import standardize_date
2 | from utils.auth import login
3 |
4 | def get_trade_dates(
5 | start_date: str = "",
6 | end_date: str = "" ,
7 | exchange: str = "",
8 | is_open: str = "1"
9 | ) -> dict:
10 | """
11 | 获取各大交易所交易日历数据,默认提取的是上交所
12 | """
13 | # 登录tushare
14 | try:
15 | tsObj = login()
16 |
17 | # 日期标准化
18 | if start_date:
19 | start_date = standardize_date(start_date)
20 |
21 | if end_date:
22 | end_date = standardize_date(end_date)
23 |
24 | df = tsObj.trade_cal(exchange=exchange, start_date=start_date, end_date=end_date, is_open=is_open)
25 |
26 | return df['cal_date'].dropna().unique().tolist()
27 |
28 | except Exception as e:
29 | raise Exception(f"获取交易日列表失败!\n {str(e)}") from e
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/src/findata/utils/auth.py:
--------------------------------------------------------------------------------
1 | import os
2 | from abc import ABC, abstractmethod
3 | from typing import Dict, Type
4 | import tushare as ts
5 | from utils.findata_log import setup_logger
6 |
7 | logger = setup_logger()
8 |
9 | class LoginHandler(ABC):
10 | @abstractmethod
11 | def login(self):
12 | pass
13 |
14 | class TushareLoginHandler(LoginHandler):
15 | """Tushare 登录处理器"""
16 | def login(self,):
17 | api_token = os.getenv("DATA_API_TOKEN")
18 | ts.set_token(api_token)
19 | pro = ts.pro_api()
20 |
21 | return pro
22 |
23 |
24 | class LoginFactory:
25 | """登录工厂类,负责创建合适的登录处理器"""
26 |
27 | _handlers = {
28 | "tushare": TushareLoginHandler,
29 | }
30 |
31 | @classmethod
32 | def get_handler(cls, provider: str) -> LoginHandler:
33 | """获取适合指定平台的登录处理器"""
34 | provider = provider.lower()
35 | if provider not in cls._handlers:
36 | logger.error(f"不支持的登录平台:{provider}")
37 | raise ValueError(f"不支持的登录平台: {provider}")
38 | return cls._handlers[provider]()
39 |
40 |
41 | def login() -> object:
42 | """
43 | 登录函数
44 | """
45 | # 从环境变量获取平台设置
46 | provider = os.getenv("PROVIDER").lower()
47 | if not provider:
48 | logger.error(f"请设置环境变量 PROVIDER 来指定数据供应商")
49 | raise ValueError("请设置环境变量 PROVIDER 来指定数据供应商")
50 |
51 | try:
52 | handler = LoginFactory.get_handler(provider)
53 | return handler.login()
54 | except Exception as e:
55 | logger.error(f"登录失败!\n ", exc_info=True)
56 | return False
57 |
58 |
--------------------------------------------------------------------------------
/src/findata/utils/findata_log.py:
--------------------------------------------------------------------------------
1 | import logging
2 | import logging.handlers
3 | import os
4 | from datetime import datetime
5 |
6 | def setup_logger(log_dir='logs', log_name='findata', max_days=7, level='INFO'):
7 | """
8 | 设置日志记录器
9 |
10 | 参数:
11 | log_dir (str): 日志目录
12 | log_name (str): 日志文件名前缀
13 | max_days (int): 最大保存天数
14 | """
15 | # 确保日志目录存在
16 | if not os.path.exists(log_dir):
17 | os.makedirs(log_dir)
18 |
19 | # 创建日志文件名,格式为: 日志名_年月日.log
20 | log_filename = f"{log_name}_{datetime.now().strftime('%Y%m%d')}.log"
21 | log_path = os.path.join(log_dir, log_filename)
22 |
23 | # 创建日志记录器
24 | logger = logging.getLogger(log_name)
25 | logger.setLevel(level)
26 |
27 | # 如果已经有处理器,先清除(避免重复添加)
28 | if logger.handlers:
29 | logger.handlers = []
30 |
31 | # 创建文件处理器,使用TimedRotatingFileHandler实现按日期滚动
32 | file_handler = logging.handlers.TimedRotatingFileHandler(
33 | filename=log_path,
34 | when='midnight', # 每天午夜滚动
35 | interval=1, # 每天
36 | backupCount=max_days, # 最多保留7天
37 | encoding='utf-8'
38 | )
39 | file_handler.suffix = "%Y%m%d.log" # 设置滚动文件的后缀
40 |
41 | # 创建控制台处理器
42 | console_handler = logging.StreamHandler()
43 |
44 | # 设置日志格式
45 | formatter = logging.Formatter(
46 | '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',
47 | datefmt='%Y-%m-%d %H:%M:%S'
48 | )
49 | file_handler.setFormatter(formatter)
50 | console_handler.setFormatter(formatter)
51 |
52 | # 添加处理器到记录器
53 | logger.addHandler(file_handler)
54 | logger.addHandler(console_handler)
55 |
56 | return logger
57 |
--------------------------------------------------------------------------------
/src/findata/utils/date_processor.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime
2 | import re
3 |
4 |
5 | # 标准化日期
6 | def standardize_date(input_date):
7 | """
8 | 将各种格式的日期标准化为 YYYYMMDD 格式
9 |
10 | 参数:
11 | input_date (str): 输入的日期字符串,可以是各种格式
12 |
13 | 返回:
14 | str: 标准化后的日期,格式为 YYYYMMDD
15 | """
16 | if len(input_date) == 8:
17 |
18 | input_date = str(input_date)
19 |
20 | # 尝试常见日期格式
21 | common_formats = [
22 | '%Y-%m-%d', # 2023-04-15
23 | '%Y/%m/%d', # 2023/04/15
24 | '%m/%d/%Y', # 04/15/2023
25 | '%d-%m-%Y', # 15-04-2023
26 | '%d.%m.%Y', # 15.04.2023
27 | '%Y%m%d', # 20230415 (已经是目标格式)
28 | '%b %d, %Y', # Apr 15, 2023
29 | '%B %d, %Y', # April 15, 2023
30 | '%d %b %Y', # 15 Apr 2023
31 | '%d %B %Y', # 15 April 2023
32 | ]
33 |
34 | # 尝试解析日期
35 | for fmt in common_formats:
36 | try:
37 | dt = datetime.strptime(input_date, fmt)
38 | return dt.strftime('%Y%m%d')
39 | except ValueError:
40 | continue
41 |
42 |
43 | # 尝试处理中文日期(如2023年4月15日)
44 | cn_match = re.match(r'(\d{4})年(\d{1,2})月(\d{1,2})日', input_date)
45 | if cn_match:
46 | year = cn_match.group(1)
47 | month = cn_match.group(2).zfill(2)
48 | day = cn_match.group(3).zfill(2)
49 | try:
50 | datetime.strptime(f"{year}{month}{day}", '%Y%m%d')
51 | return f"{year}{month}{day}"
52 | except ValueError:
53 | pass
54 |
55 | # 如果所有尝试都失败,抛出异常
56 | raise ValueError(f"无法解析日期: {input_date}")
--------------------------------------------------------------------------------
/src/findata/providers/_tushare/marketData.py:
--------------------------------------------------------------------------------
1 | import os
2 | import pandas as pd
3 | from typing import Optional
4 | from utils.date_processor import standardize_date
5 | from utils.auth import login
6 |
7 |
8 | async def daily(
9 | ts_code: Optional[str] = "",
10 | trade_date: Optional[str] = "",
11 | start_date: Optional[str] = "",
12 | end_date: Optional[str] = "",
13 | fields: Optional[list] = [],
14 | ) -> dict:
15 |
16 | """
17 | Name:
18 | A股日线行情。
19 |
20 | Description:
21 | 获取股票未复权的日线行情数据。
22 |
23 | Args:
24 | | 名称 | 类型 | 必填 | 描述 |
25 | |------------|-------|------|----------------------------------------|
26 | | ts_code | str | 否 | 股票代码(支持多个股票同时提取,逗号分隔) |
27 | | trade_date | str | 否 | 交易日期(YYYYMMDD),不与start_date和end_date同时出现 |
28 | | start_date | str | 否 | 开始日期(YYYYMMDD),与end_date同时出现 |
29 | | end_date | str | 否 | 结束日期(YYYYMMDD),与start_date同时出现 |
30 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
31 |
32 | Fields:
33 | - ts_code: 股票代码
34 | - trade_date: 交易日期
35 | - open: 开盘价
36 | - high: 最高价
37 | - low: 最低价
38 | - close: 收盘价
39 | - pre_close: 昨收价【除权价,前复权】
40 | - change: 涨跌额
41 | - pct_chg: 涨跌幅 【基于除权后的昨收计算的涨跌幅:(今收-除权昨收)/除权昨收】
42 | - vol: 成交量 (手)
43 | - amount: 成交额 (千元)
44 |
45 | """
46 | try:
47 | # 登录tushare
48 | tsObj = login()
49 |
50 | # 日期标准化
51 | if trade_date:
52 | trade_date = standardize_date(trade_date)
53 |
54 | if start_date:
55 | start_date = standardize_date(start_date)
56 |
57 | if end_date:
58 | end_date = standardize_date(end_date)
59 |
60 |
61 | #TODO 股票代码 标准化
62 |
63 |
64 | # 添加交易日
65 | if fields:
66 | fields.append('trade_date')
67 | fields = list(set(fields))
68 |
69 |
70 | df = tsObj.daily(ts_code=ts_code, trade_date=trade_date, start_date=start_date, end_date=end_date, fields=fields)
71 | return df
72 | # return df.to_json()
73 | except Exception as e:
74 | raise Exception(f"获取股票日线行情数据失败!\n {str(e)}") from e
75 |
76 |
--------------------------------------------------------------------------------
/src/findata/server.py:
--------------------------------------------------------------------------------
1 | import os
2 | import importlib
3 | import argparse
4 | import inspect
5 | from types import ModuleType
6 | from mcp.server.fastmcp import FastMCP
7 | from utils.findata_log import setup_logger
8 |
9 | logger = setup_logger()
10 |
11 | def decorate_async_functions(module: ModuleType, tool_decorator):
12 | for name, func in inspect.getmembers(module, inspect.iscoroutinefunction):
13 | setattr(module, name, tool_decorator(func))
14 |
15 |
16 | def run(args):
17 | try:
18 | logger.info("Init finData MCP Server")
19 |
20 | # 获取数据供应商
21 | data_provider = os.getenv("PROVIDER").lower()
22 | logger.debug("data provider: " + data_provider)
23 |
24 | if not data_provider:
25 | logger.error("请设置环境变量 PROVIDER 来指定数据供应商")
26 | raise ValueError("请设置环境变量 PROVIDER 来指定数据供应商")
27 |
28 | module = importlib.import_module("providers._"+data_provider)
29 |
30 | if args.transport == 'stdio':
31 | # 创建MCP服务器实例
32 | mcp = FastMCP("finData")
33 | # 添加MCP装饰器
34 | decorate_async_functions(module, mcp.tool())
35 | mcp.run(transport="stdio")
36 |
37 |
38 | elif args.transport == 'sse':
39 | # 创建MCP服务器实例
40 | mcp = FastMCP(
41 | "finDatta",
42 | host=args.sse_host,
43 | port=args.sse_port,
44 | )
45 | # 添加MCP装饰器
46 | decorate_async_functions(module, mcp.tool())
47 | mcp.run(transport='sse')
48 |
49 | except Exception as e:
50 | logger.error(f"初始化失败!\n ", exc_info=True)
51 | raise Exception(f"初始化失败!\n {str(e)}") from e
52 |
53 |
54 | if __name__ == "__main__":
55 |
56 | parser = argparse.ArgumentParser(description="finData MCP Server")
57 |
58 | parser.add_argument(
59 | "--transport",
60 | type=str,
61 | choices=["stdio", "sse"],
62 | default="stdio",
63 | help="Select MCP transport: stdio (default) or sse",
64 | )
65 |
66 | parser.add_argument(
67 | "--sse-host",
68 | type=str,
69 | default="localhost",
70 | help="Host to bind SSE server to (default: localhost)",
71 | )
72 |
73 | parser.add_argument(
74 | "--sse-port",
75 | type=int,
76 | default=8000,
77 | help="Port for SSE server (default: 8000)",
78 | )
79 |
80 | args = parser.parse_args()
81 |
82 | logger.info(f"Running MCP Server with parameters: {args}")
83 |
84 | run(args)
85 |
--------------------------------------------------------------------------------
/README_zh.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | [](README.md)
10 | [](README_zh.md)
11 | [](LICENSE)
12 | []()
13 | []()
14 |
15 |
16 |
17 |
18 |
25 |
26 |
27 | # 概述
28 |
29 | **finData**是一个开源的金融数据查询**Model Context Protocol(MCP) Server**,向大模型提供专业级金融数据访问的能力。支持**Tushare**、**Wind**、**通联**等多种数据供应商接口,助力用户在AI应用中快速获取金融数据。
30 |
31 | 全面支持**Stdio**和**SSE**两种通信模式,灵活满足本地部署与远程调用等多样化的使用需求。
32 |
33 | # 演示
34 |
35 | https://github.com/user-attachments/assets/1a6d02af-22a3-44a0-ada7-a771a1c4818d
36 |
37 | # 快速开始
38 |
39 | ## 环境准备
40 |
41 | 开始前,请先安装下列工具包:
42 |
43 | - python => 3.11
44 | - mcp[cli]>=1.6.0
45 | - pandas>=2.2.3
46 | - [uv](https://docs.astral.sh/uv/getting-started/installation/)
47 |
48 | 根据所使用的数据供应商,请自行选择安装
49 | - tushare>=1.4.21
50 |
51 | ## 配置MCP Server
52 |
53 | ### Stdio模式
54 |
55 | 将下面的内容添加到MCP client的配置文件中来调用MCP Server。
56 |
57 | ```JSON
58 | {
59 | "mcpServers": {
60 | "finData": {
61 | "command": "uv",
62 | "args": [
63 | "--directory",
64 | "/ABSOLUTE/PATH/TO/PARENT/FOLDER/finData-mcp-server/src/findata", // finData MCP Server所在目录
65 | "run",
66 | "server.py"
67 | ],
68 | "env": {
69 | "DATA_API_TOKEN": "", // 访问数据供应商的API Token
70 | "PROVIDER": "tushare" // 指定数据供应商
71 | }
72 | }
73 | }
74 | }
75 | ```
76 |
77 | ### SSE模式
78 |
79 | 在运行MCP Server的服务器上,设置数据供应商相关的环境变量`DATA_API_TOKEN`和`PROVIDER`:
80 |
81 | **Windows**
82 | ```bash
83 | set DATA_API_TOKEN=<访问数据供应商的API Token>
84 | set PROVIDER=<指定数据供应商>
85 | ```
86 |
87 | **Linux**
88 | ```bash
89 | export DATA_API_TOKEN=<访问数据供应商的API Token>
90 | export PROVIDER=<指定数据供应商>
91 | ```
92 |
93 | 然后启动MCP Server:
94 |
95 | ```bash
96 | uv run server.py --transport sse
97 | ```
98 |
99 | - 可选参数
100 |
101 | `--sse-host` SSE服务绑定的主机,默认为localhost
102 |
103 | `--sse-port` SSE服务端口,默认为8000
104 |
105 |
106 | MCP Server启动成功后,将下面的内容添加到MCP client的配置文件中来调用MCP Server。不同client配置文件中的变量名会有细微的差异,请根据client的说明进行调整。
107 |
108 | ```JSON
109 | {
110 | "mcpServers": {
111 | "finData": {
112 | "name": "finData",
113 | "type": "sse",
114 | "baseUrl": "http://localhost:8000/sse"
115 | }
116 | }
117 | }
118 | ```
119 |
120 |
121 | # 已支持的数据供应商
122 |
123 | 通过环境变量`PROVIDER`使用指定的供应商
124 |
125 | - tushare
126 |
127 | # 工具列表
128 |
129 | ## Tushare
130 |
131 | ### 行情数据
132 |
133 | - `daily` 获取股票未复权的日线行情数据。
134 |
135 | ### 基础数据
136 |
137 | - `stock_basic` 获取股票的名称、代码等基础信息。
138 | - `stock_company` 获取上市公司基础信息。
139 | - `bak_basic` 获取某支股票在指定时间范围内的基本面数据。
140 |
141 | ### 财务数据
142 |
143 | - `income` 获取上市公司利润表数据。
144 | - `balancesheet` 获取上市公司资产负债表数据。
145 | - `cashflow` 获取上市公司现金流量表数据。
146 |
147 | ### 宏观数据
148 |
149 | - `shibor_lpr` 获取LPR贷款基础利率。
150 | - `cn_gdp` 获取GDP数据。
151 | - `cn_cpi` 获取CPI居民消费价格数据。
152 | - `cn_ppi` 获取PPI工业生产者出厂价格指数数据。
153 | - `cn_m` 获取货币供应量数据。
154 | - `sf_month` 获取社会融资数据。
155 | - `cn_pmi` 获取采购经理人指数(PMI)数据。
156 |
157 | # DataCanvas
158 |
159 |
160 |
161 | 
162 |
163 | 本项目由[DataCanvas](https://datacanvas.com/)开源
164 |
165 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | [](README.md)
9 | [](README_zh.md)
10 | [](LICENSE)
11 | []()
12 | []()
13 |
14 |
15 |
16 |
23 |
24 |
25 | # Overview
26 |
27 | **FinData** is an open-source **Model Context Protocol(MCP) Server** that provides professional financial data access capabilities for LLM. It supports various data providers such as **Tushare**, **Wind**, **DataYes**, etc. This enables AI applications to quickly retrieve financial data.
28 |
29 | Fully supports both **Stdio** and **SSE** transports, offering flexibility for different environments.
30 |
31 |
32 | # Demonstration
33 |
34 | https://github.com/user-attachments/assets/1a6d02af-22a3-44a0-ada7-a771a1c4818d
35 |
36 | # Quick Start
37 |
38 | ## Prerequisites
39 |
40 | Before getting started, please complete the following preparations:
41 |
42 | - python => 3.11
43 | - mcp[cli]>=1.6.0
44 | - pandas>=2.2.3
45 | - [uv](https://docs.astral.sh/uv/getting-started/installation/)
46 |
47 | Depending on your data provider, install optional packages such as:
48 |
49 | - tushare>=1.4.21
50 |
51 | ## Configuration
52 |
53 | ### Stdio Transport
54 |
55 | You will need to edit the MCP client configuration file to add finData:
56 |
57 | ```JSON
58 | {
59 | "mcpServers": {
60 | "finData": {
61 | "command": "uv",
62 | "args": [
63 | "--directory",
64 | "/ABSOLUTE/PATH/TO/PARENT/FOLDER/finData-mcp-server/src/findata",
65 | "run",
66 | "server.py"
67 | ],
68 | "env": {
69 | "DATA_API_TOKEN": "", // API Token for accessing data provider
70 | "PROVIDER": "tushare" // Specified data provider
71 | }
72 | }
73 | }
74 | }
75 | ```
76 |
77 | ### SSE Transport
78 |
79 | Set the environment variables `DATA_API_TOKEN` and `PROVIDER` on the server hosting the MCP Server:
80 |
81 | **Windows**
82 | ```bash
83 | set DATA_API_TOKEN=
84 | set PROVIDER=
85 | ```
86 |
87 | **Linux**
88 | ```bash
89 | export DATA_API_TOKEN=
90 | export PROVIDER=
91 | ```
92 |
93 | Then, start the MCP Server:
94 |
95 | ```bash
96 | uv run server.py --transport sse
97 | ```
98 |
99 | - Optional Arguments:
100 |
101 | `--sse-host` Host to bind SSE server to (default: localhost)
102 |
103 | `--sse-port` Port for SSE server (default: 8000)
104 |
105 |
106 | Once the MCP Server is running, update your MCP client's configuration with the following settings to connect to it.
107 |
108 | ```JSON
109 | {
110 | "mcpServers": {
111 | "finData": {
112 | "name": "finData",
113 | "type": "sse",
114 | "baseUrl": "http://localhost:8000/sse"
115 | }
116 | }
117 | }
118 | ```
119 |
120 | **Note:** Variable names in configuration files may vary slightly between MCP clients. Refer to each client's documentation for proper configuration.
121 |
122 | # Supported Data Providers
123 |
124 | Set the `PROVIDER` environment variable to specify your provider:
125 |
126 | - tushare
127 |
128 | # Tools
129 |
130 | ## Tushare
131 |
132 | ### Market Data
133 |
134 | - `daily` Get unadjusted daily stock market data.
135 |
136 | ### Fundamental Data
137 |
138 | - `stock_basic` Get stock basic information including name, code, etc.
139 | - `stock_company` Get listed company basic information.
140 | - `bak_basic` Get fundamental data for specific stocks within a given time range.
141 |
142 | ### Financial Data
143 |
144 | - `income` Get company income statement data.
145 | - `balancesheet` Get company balance sheet data.
146 | - `cashflow` Get company cash flow statement data.
147 |
148 | ### Macroeconomic Data
149 |
150 | - `shibor_lpr` Get Loan Prime Rate (LPR) data.
151 | - `cn_gdp` Get Gross Domestic Product (GDP) data.
152 | - `cn_cpi` Get Consumer Price Index (CPI) data.
153 | - `cn_ppi` Get Producer Price Index (PPI) data.
154 | - `cn_m` Get Money Supply data.
155 | - `sf_month` Get Social Financing data.
156 | - `cn_pmi` Get Purchasing Managers' Index (PMI) data.
157 |
158 | # DataCanvas
159 |
160 |
161 | 
162 |
163 | This project is open-sourced by [DataCanvas](https://datacanvas.com/)
164 |
165 |
166 |
--------------------------------------------------------------------------------
/src/findata/providers/_tushare/fundamentalData.py:
--------------------------------------------------------------------------------
1 | import os
2 | import pandas as pd
3 | from typing import Optional
4 | from utils.date_processor import standardize_date
5 | from .common import get_trade_dates
6 | from utils.auth import login
7 | from utils.findata_log import setup_logger
8 |
9 | logger = setup_logger()
10 |
11 | async def stock_basic(
12 | ts_code: Optional[str] = "",
13 | name: Optional[str] = "",
14 | market: Optional[str] = "",
15 | list_status: Optional[str] = "",
16 | exchange: Optional[str] = "",
17 | is_hs: Optional[str] = "",
18 | fields: Optional[list] = [],
19 | ) -> dict:
20 | """
21 | Name:
22 | 股票基础信息。
23 |
24 | Description:
25 | 获取股票的名称、代码等基础信息。
26 |
27 | Args:
28 | | 名称 | 类型 | 必填 | 描述 |
29 | |------------|-------|------|----------------------------------------|
30 | | ts_code | str | 否 | 股票代码,每次只能查询一支股票 |
31 | | name | str | 否 | 股票名称 |
32 | | market | str | 否 | 市场类别 (主板/创业板/科创板/CDR/北交所) |
33 | | list_status | str | 否 | 上市状态(L:上市,D:退市,P:暂停上市。默认是L) |
34 | | exchange | str | 否 | 交易所代码 (上交所:SSE, 深交所:SZSE 北交所:BSE) |
35 | | is_hs | str | 否 | 是否沪深港通标的(N:否,H:沪股通,S:深股通) |
36 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
37 |
38 | Fields:
39 | - ts_code: TS代码
40 | - symbol: 股票代码
41 | - name: 股票名称
42 | - area: 地域
43 | - industry: 所属行业
44 | - fullname: 股票全称
45 | - enname: 英文全称
46 | - cnspell: 拼音缩写
47 | - market: 市场类型(主板/创业板/科创板/CDR)
48 | - exchange: 交易所代码
49 | - curr_type: 交易货币
50 | - list_status: 上市状态 L上市 D退市 P暂停上市
51 | - list_date: 上市日期
52 | - delist_date: 退市日期
53 | - is_hs: 是否沪深港通标的,N否 H沪股通 S深股通
54 | - act_name: 实控人名称
55 | - act_ent_type: 实控人企业性质
56 | """
57 | try:
58 | logger.debug("call stock basic!")
59 | # 登录tushare
60 | tsObj = login()
61 |
62 | #TODO 股票代码 标准化
63 |
64 | df = tsObj.stock_basic(ts_code=ts_code, name=name, market=market, list_status=list_status, exchange=exchange, is_hs=is_hs, fields=fields)
65 | # return df.to_json()
66 | return df
67 |
68 | except Exception as e:
69 | logger.error(f"获取股票基本信息失败!\n ", exc_info=True)
70 | raise Exception(f"获取股票基本信息失败!\n {str(e)}") from e
71 |
72 |
73 | async def stock_company(
74 | ts_code: Optional[str] = "",
75 | exchange: Optional[str] = "",
76 | fields: Optional[list] = [],
77 | ) -> dict:
78 | """
79 | Name:
80 | 上市公司基本信息。
81 |
82 | Description:
83 | 获取上市公司基础信息。
84 |
85 | Args:
86 | | 名称 | 类型 | 必填 | 描述 |
87 | |------------|-------|------|----------------------------------------|
88 | | ts_code | str | 否 | 股票代码,每次只能查询一家公司 |
89 | | exchange | str | 否 | 交易所代码 (上交所:SSE, 深交所:SZSE 北交所:BSE) |
90 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
91 |
92 | Fields:
93 | - ts_code:股票代码
94 | - com_name:公司全称
95 | - com_id:统一社会信用代码
96 | - exchange:交易所代码
97 | - chairman:法人代表
98 | - manager:总经理
99 | - secretary:董秘
100 | - reg_capital:注册资本(万元)
101 | - setup_date:注册日期
102 | - province:所在省份
103 | - city:所在城市
104 | - introduction:公司介绍
105 | - website:公司主页
106 | - email:电子邮件
107 | - office:办公室
108 | - employees:员工人数
109 | - main_business:主要业务及产品
110 | - business_scope:经营范围
111 |
112 | """
113 | try:
114 | # 登录tushare
115 | tsObj = login()
116 |
117 | #TODO 股票代码 标准化
118 |
119 | df = tsObj.stock_company(ts_code=ts_code, exchange=exchange, fields=fields)
120 | # return df.to_json()
121 | return df
122 |
123 | except Exception as e:
124 | logger.error(f"获取上市公司基本信息数据失败!\n ", exc_info=True)
125 | raise Exception(f"获取上市公司基本信息数据失败!\n {str(e)}") from e
126 |
127 |
128 |
129 |
130 | async def bak_basic(
131 | ts_code: str,
132 | start_date: str,
133 | end_date: str,
134 | fields: Optional[list] = [],
135 | ) -> dict:
136 | """
137 | Name:
138 | 股票基本面信息。
139 |
140 | Description:
141 | 获取某支股票在指定时间范围内的基本面数据,数据从2016年开始。
142 |
143 | Args:
144 | | 名称 | 类型 | 必填 | 描述 |
145 | |------------|-------|------|----------------------------------------|
146 | | ts_code | str | 是 | 股票代码,每次只能查询一支股票 |
147 | | start_date | str | 是 | 开始日期(YYYYMMDD) |
148 | | end_date | str | 是 | 开始日期(YYYYMMDD) |
149 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
150 |
151 | Fields:
152 | - trade_date:交易日期
153 | - ts_code:TS股票代码
154 | - name:股票名称
155 | - industry:行业
156 | - area:地域
157 | - pe:市盈率(动)
158 | - float_share:流通股本(亿)
159 | - total_share:总股本(亿)
160 | - total_assets:总资产(亿)
161 | - liquid_assets:流动资产(亿)
162 | - fixed_assets:固定资产(亿)
163 | - reserved:公积金
164 | - reserved_pershare:每股公积金
165 | - eps:每股收益
166 | - bvps:每股净资产
167 | - pb:市净率
168 | - list_date:上市日期
169 | - undp:未分配利润
170 | - per_undp:每股未分配利润
171 | - rev_yoy:收入同比(%)
172 | - profit_yoy:利润同比(%)
173 | - gpr:毛利率(%)
174 | - npr:净利润率(%)
175 | - holder_num:股东人数
176 |
177 | """
178 | try:
179 | # 登录tushare
180 | tsObj = login()
181 |
182 | # 日期标准化
183 | start_date = standardize_date(start_date)
184 |
185 | end_date = standardize_date(end_date)
186 |
187 | #TODO 股票代码 标准化
188 |
189 | # 获取指定时间范围内的交易日
190 | trade_dates = get_trade_dates(start_date=start_date, end_date=end_date)
191 |
192 | if not trade_dates:
193 | raise ValueError(f"指定的时间范围内,没有交易日")
194 |
195 | # 查询单支股票所有的基本面数据
196 | if fields:
197 | fields.append('trade_date')
198 | fields = list(set(fields))
199 |
200 | df = tsObj.bak_basic(ts_code=ts_code, fields=fields)
201 |
202 | res = df[df['trade_date'].isin(trade_dates)]
203 |
204 | # return res.to_json()
205 | return res
206 |
207 | except Exception as e:
208 | logger.error(f"获取股票基本面数据失败!\n ", exc_info=True)
209 | raise Exception(f"获取股票基本面数据失败!\n {str(e)}") from e
210 |
211 |
212 |
213 |
214 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/src/findata/providers/_tushare/macroeconomicData.py:
--------------------------------------------------------------------------------
1 | import os
2 | import pandas as pd
3 | from typing import Optional
4 | from utils.date_processor import standardize_date
5 | from utils.auth import login
6 |
7 |
8 | # LPR
9 | async def shibor_lpr(
10 | start_date: Optional[str] = "",
11 | end_date: Optional[str] = "",
12 | fields: Optional[list] = [],
13 | ) -> dict:
14 |
15 | """
16 | Name:
17 | LPR贷款基础利率。
18 |
19 | Description:
20 | 获取LPR贷款基础利率。贷款基础利率(Loan Prime Rate,简称LPR),是基于报价行自主报出的最优贷款利率计算并发布的贷款市场参考利率。
21 |
22 | Args:
23 | | 名称 | 类型 | 必填 | 描述 |
24 | |------------|-------|------|----------------------------------------|
25 | | start_date | str | 否 | 开始日期(YYYYMMDD),与end_date同时出现 |
26 | | end_date | str | 否 | 结束日期(YYYYMMDD),与start_date同时出现 |
27 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
28 |
29 | Fields:
30 | - date:日期
31 | - 1y:1年贷款利率
32 | - 5y:5年贷款利率
33 |
34 | """
35 | try:
36 | # 登录tushare
37 | tsObj = login()
38 |
39 | # 日期标准化
40 | if start_date:
41 | start_date = standardize_date(start_date)
42 |
43 | if end_date:
44 | end_date = standardize_date(end_date)
45 |
46 |
47 | #TODO 股票代码 标准化
48 |
49 |
50 | df = tsObj.shibor_lpr(start_date=start_date, end_date=end_date, fields=fields)
51 | # return df.to_json()
52 | return df
53 | except Exception as e:
54 | raise Exception(f"获取LPR贷款基础利率失败!\n {str(e)}") from e
55 |
56 |
57 | # GDP
58 | async def cn_gdp(
59 | q: Optional[str] = "",
60 | start_q: Optional[str] = "",
61 | end_q: Optional[str] = "",
62 | fields: Optional[list] = [],
63 | ) -> dict:
64 |
65 | """
66 | Name:
67 | GDP数据。
68 |
69 | Description:
70 | 获取国民经济之GDP数据。
71 |
72 | Args:
73 | | 名称 | 类型 | 必填 | 描述 |
74 | |------------|-------|------|----------------------------------------|
75 | | q | str | 否 | 季度(2019Q1表示,2019年第一季度),支持多个季度同时输入,逗号分隔 |
76 | | start_q | str | 否 | 开始季度(2019Q1表示,2019年第一季度),与end_q同时使用 |
77 | | end_q | str | 否 | 结束季度(2019Q1表示,2019年第一季度),与start_q同时使用 |
78 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
79 |
80 | Fields:
81 | - quarter: 季度
82 | - gdp: GDP累计值(亿元)
83 | - gdp_yoy: 当季同比增速(%)
84 | - pi: 第一产业累计值(亿元)
85 | - pi_yoy: 第一产业同比增速(%)
86 | - si: 第二产业累计值(亿元)
87 | - si_yoy: 第二产业同比增速(%)
88 | - ti: 第三产业累计值(亿元)
89 | - ti_yoy: 第三产业同比增速(%)
90 |
91 | """
92 | try:
93 | # 登录tushare
94 | tsObj = login()
95 |
96 | # 添加季度字段
97 | if fields:
98 | fields.append('quarter')
99 | fields = list(set(fields))
100 |
101 | df = tsObj.cn_gdp(q=q, start_q=start_q, end_q=end_q, fields=fields)
102 | # return df.to_json()
103 | return df
104 | except Exception as e:
105 | raise Exception(f"获取GDP数据失败!\n {str(e)}") from e
106 |
107 | # CPI
108 | async def cn_cpi(
109 | m: Optional[str] = "",
110 | start_m: Optional[str] = "",
111 | end_m: Optional[str] = "",
112 | fields: Optional[list] = [],
113 | ) -> dict:
114 | """
115 | Name:
116 | 居民消费价格指数。
117 |
118 | Description:
119 | 获取CPI居民消费价格数据,包括全国、城市和农村的数据。
120 |
121 | Args:
122 | | 名称 | 类型 | 必填 | 描述 |
123 | |------------|-------|------|----------------------------------------|
124 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 |
125 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 |
126 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 |
127 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
128 |
129 | Fields:
130 | - month: 月份
131 | - nt_val: 全国当月值
132 | - nt_yoy: 全国同比(%)
133 | - nt_mom: 全国环比(%)
134 | - nt_accu: 全国累计值
135 | - town_val: 城市当月值
136 | - town_yoy: 城市同比(%)
137 | - town_mom: 城市环比(%)
138 | - town_accu: 城市累计值
139 | - cnt_val: 农村当月值
140 | - cnt_yoy: 农村同比(%)
141 | - cnt_mom: 农村环比(%)
142 | - cnt_accu: 农村累计值
143 | """
144 | try:
145 | # 登录tushare
146 | tsObj = login()
147 |
148 | # 添加季度字段
149 | if fields:
150 | fields.append('month')
151 | fields = list(set(fields))
152 |
153 | df = tsObj.cn_cpi(m=m, start_m=start_m, end_m=end_m, fields=fields)
154 | # return df.to_json()
155 | return df
156 | except Exception as e:
157 | raise Exception(f"获取CPI数据失败!\n {str(e)}") from e
158 |
159 | # PPI
160 | async def cn_ppi(
161 | m: Optional[str] = "",
162 | start_m: Optional[str] = "",
163 | end_m: Optional[str] = "",
164 | fields: Optional[list] = [],
165 | ) -> dict:
166 | """
167 | Name:
168 | 工业生产者出厂价格指数。
169 |
170 | Description:
171 | 获取PPI工业生产者出厂价格指数数据。
172 |
173 | Args:
174 | | 名称 | 类型 | 必填 | 描述 |
175 | |------------|-------|------|----------------------------------------|
176 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 |
177 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 |
178 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 |
179 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
180 |
181 | Fields:
182 | - month: 月份(格式为YYYYMM)
183 | - ppi_yoy: 工业品出厂价格指数(PPI)-全部工业品-当月同比
184 | - ppi_mp_yoy: PPI-生产资料-当月同比
185 | - ppi_mp_qm_yoy: PPI-生产资料-采掘业-当月同比
186 | - ppi_mp_rm_yoy: PPI-生产资料-原料业-当月同比
187 | - ppi_mp_p_yoy: PPI-生产资料-加工业-当月同比
188 | - ppi_cg_yoy: PPI-生活资料-当月同比
189 | - ppi_cg_f_yoy: PPI-生活资料-食品类-当月同比
190 | - ppi_cg_c_yoy: PPI-生活资料-衣着类-当月同比
191 | - ppi_cg_adu_yoy: PPI-生活资料-一般日用品类-当月同比
192 | - ppi_cg_dcg_yoy: PPI-生活资料-耐用消费品类-当月同比
193 |
194 | - ppi_mom: PPI-全部工业品-环比
195 | - ppi_mp_mom: PPI-生产资料-环比
196 | - ppi_mp_qm_mom: PPI-生产资料-采掘业-环比
197 | - ppi_mp_rm_mom: PPI-生产资料-原料业-环比
198 | - ppi_mp_p_mom: PPI-生产资料-加工业-环比
199 | - ppi_cg_mom: PPI-生活资料-环比
200 | - ppi_cg_f_mom: PPI-生活资料-食品类-环比
201 | - ppi_cg_c_mom: PPI-生活资料-衣着类-环比
202 | - ppi_cg_adu_mom: PPI-生活资料-一般日用品类-环比
203 | - ppi_cg_dcg_mom: PPI-生活资料-耐用消费品类-环比
204 |
205 | - ppi_accu: PPI-全部工业品-累计同比
206 | - ppi_mp_accu: PPI-生产资料-累计同比
207 | - ppi_mp_qm_accu: PPI-生产资料-采掘业-累计同比
208 | - ppi_mp_rm_accu: PPI-生产资料-原料业-累计同比
209 | - ppi_mp_p_accu: PPI-生产资料-加工业-累计同比
210 | - ppi_cg_accu: PPI-生活资料-累计同比
211 | - ppi_cg_f_accu: PPI-生活资料-食品类-累计同比
212 | - ppi_cg_c_accu: PPI-生活资料-衣着类-累计同比
213 | - ppi_cg_adu_accu: PPI-生活资料-一般日用品类-累计同比
214 | - ppi_cg_dcg_accu: PPI-生活资料-耐用消费品类-累计同比
215 | """
216 |
217 | try:
218 | # 登录tushare
219 | tsObj = login()
220 |
221 | # 添加季度字段
222 | if fields:
223 | fields.append('month')
224 | fields = list(set(fields))
225 |
226 | df = tsObj.cn_ppi(m=m, start_m=start_m, end_m=end_m, fields=fields)
227 | # return df.to_json()
228 | return df
229 | except Exception as e:
230 | raise Exception(f"获取PPI数据失败!\n {str(e)}") from e
231 |
232 |
233 | # 货币供应量
234 | async def cn_m(
235 | m: Optional[str] = "",
236 | start_m: Optional[str] = "",
237 | end_m: Optional[str] = "",
238 | fields: Optional[list] = [],
239 | ) -> dict:
240 | """
241 | Name:
242 | 货币供应量。
243 |
244 | Description:
245 | 获取货币供应量之月度数据。
246 |
247 | Args:
248 | | 名称 | 类型 | 必填 | 描述 |
249 | |------------|-------|------|----------------------------------------|
250 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 |
251 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 |
252 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 |
253 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
254 |
255 | Fields:
256 | - month: 月份(YYYYMM)
257 | - m0: M0(亿元)
258 | - m0_yoy: M0同比(%)
259 | - m0_mom: M0环比(%)
260 | - m1: M1(亿元)
261 | - m1_yoy: M1同比(%)
262 | - m1_mom: M1环比(%)
263 | - m2: M2(亿元)
264 | - m2_yoy: M2同比(%)
265 | - m2_mom: M2环比(%)
266 | """
267 | try:
268 | # 登录tushare
269 | tsObj = login()
270 |
271 | # 添加季度字段
272 | if fields:
273 | fields.append('month')
274 | fields = list(set(fields))
275 |
276 | df = tsObj.cn_m(m=m, start_m=start_m, end_m=end_m, fields=fields)
277 | # return df.to_json()
278 | return df
279 | except Exception as e:
280 | raise Exception(f"获取货币供应量数据失败!\n {str(e)}") from e
281 |
282 |
283 | # 社融数据(月度)
284 | async def sf_month(
285 | m: Optional[str] = "",
286 | start_m: Optional[str] = "",
287 | end_m: Optional[str] = "",
288 | fields: Optional[list] = [],
289 | ) -> dict:
290 | """
291 | Name:
292 | 社融数据(月度)。
293 |
294 | Description:
295 | 获取月度社会融资数据。
296 |
297 | Args:
298 | | 名称 | 类型 | 必填 | 描述 |
299 | |------------|-------|------|----------------------------------------|
300 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 |
301 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 |
302 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 |
303 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
304 |
305 | Fields:
306 | - month: 月度
307 | - inc_month: 社融增量当月值(亿元)
308 | - inc_cumval: 社融增量累计值(亿元)
309 | - stk_endval: 社融存量期末值(万亿元)
310 | """
311 | try:
312 | # 登录tushare
313 | tsObj = login()
314 |
315 | # 添加季度字段
316 | if fields:
317 | fields.append('month')
318 | fields = list(set(fields))
319 |
320 | df = tsObj.sf_month(m=m, start_m=start_m, end_m=end_m, fields=fields)
321 | # return df.to_json()
322 | return df
323 | except Exception as e:
324 | raise Exception(f"获取社融数据数据失败!\n {str(e)}") from e
325 |
326 | # pmi
327 | async def cn_pmi(
328 | m: Optional[str] = "",
329 | start_m: Optional[str] = "",
330 | end_m: Optional[str] = "",
331 | fields: Optional[list] = [],
332 | ) -> dict:
333 | """
334 | Name:
335 | 采购经理人指数(PMI)。
336 |
337 | Description:
338 | 获取采购经理人指数(PMI)数据。
339 |
340 | Args:
341 | | 名称 | 类型 | 必填 | 描述 |
342 | |------------|-------|------|----------------------------------------|
343 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 |
344 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 |
345 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 |
346 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
347 |
348 | Fields:
349 | - month - 月份YYYYMM
350 | - pmi010000 - 制造业PMI
351 | - pmi010100 - 制造业PMI-企业规模-大型企业
352 | - pmi010200 - 制造业PMI-企业规模-中型企业
353 | - pmi010300 - 制造业PMI-企业规模-小型企业
354 | - pmi010400 - 制造业PMI-构成指数-生产指数
355 | - pmi010401 - 制造业PMI-构成指数-生产指数-企业规模-大型企业
356 | - pmi010402 - 制造业PMI-构成指数-生产指数-企业规模-中型企业
357 | - pmi010403 - 制造业PMI-构成指数-生产指数-企业规模-小型企业
358 | - pmi010500 - 制造业PMI-构成指数-新订单指数
359 | - pmi010501 - 制造业PMI-构成指数-新订单指数-企业规模-大型企业
360 | - pmi010502 - 制造业PMI-构成指数-新订单指数-企业规模-中型企业
361 | - pmi010503 - 制造业PMI-构成指数-新订单指数-企业规模-小型企业
362 | - pmi010600 - 制造业PMI-构成指数-供应商配送时间指数
363 | - pmi010601 - 制造业PMI-构成指数-供应商配送时间指数-企业规模-大型企业
364 | - pmi010602 - 制造业PMI-构成指数-供应商配送时间指数-企业规模-中型企业
365 | - pmi010603 - 制造业PMI-构成指数-供应商配送时间指数-企业规模-小型企业
366 | - pmi010700 - 制造业PMI-构成指数-原材料库存指数
367 | - pmi010701 - 制造业PMI-构成指数-原材料库存指数-企业规模-大型企业
368 | - pmi010702 - 制造业PMI-构成指数-原材料库存指数-企业规模-中型企业
369 | - pmi010703 - 制造业PMI-构成指数-原材料库存指数-企业规模-小型企业
370 | - pmi010800 - 制造业PMI-构成指数-从业人员指数
371 | - pmi010801 - 制造业PMI-构成指数-从业人员指数-企业规模-大型企业
372 | - pmi010802 - 制造业PMI-构成指数-从业人员指数-企业规模-中型企业
373 | - pmi010803 - 制造业PMI-构成指数-从业人员指数-企业规模-小型企业
374 | - pmi010900 - 制造业PMI-其他-新出口订单
375 | - pmi011000 - 制造业PMI-其他-进口
376 | - pmi011100 - 制造业PMI-其他-采购量
377 | - pmi011200 - 制造业PMI-其他-主要原材料购进价格
378 | - pmi011300 - 制造业PMI-其他-出厂价格
379 | - pmi011400 - 制造业PMI-其他-产成品库存
380 | - pmi011500 - 制造业PMI-其他-在手订单
381 | - pmi011600 - 制造业PMI-其他-生产经营活动预期
382 | - pmi011700 - 制造业PMI-分行业-装备制造业
383 | - pmi011800 - 制造业PMI-分行业-高技术制造业
384 | - pmi011900 - 制造业PMI-分行业-基础原材料制造业
385 | - pmi012000 - 制造业PMI-分行业-消费品制造业
386 | - pmi020100 - 非制造业PMI-商务活动
387 | - pmi020101 - 非制造业PMI-商务活动-分行业-建筑业
388 | - pmi020102 - 非制造业PMI-商务活动-分行业-服务业业
389 | - pmi020200 - 非制造业PMI-新订单指数
390 | - pmi020201 - 非制造业PMI-新订单指数-分行业-建筑业
391 | - pmi020202 - 非制造业PMI-新订单指数-分行业-服务业
392 | - pmi020300 - 非制造业PMI-投入品价格指数
393 | - pmi020301 - 非制造业PMI-投入品价格指数-分行业-建筑业
394 | - pmi020302 - 非制造业PMI-投入品价格指数-分行业-服务业
395 | - pmi020400 - 非制造业PMI-销售价格指数
396 | - pmi020401 - 非制造业PMI-销售价格指数-分行业-建筑业
397 | - pmi020402 - 非制造业PMI-销售价格指数-分行业-服务业
398 | - pmi020500 - 非制造业PMI-从业人员指数
399 | - pmi020501 - 非制造业PMI-从业人员指数-分行业-建筑业
400 | - pmi020502 - 非制造业PMI-从业人员指数-分行业-服务业
401 | - pmi020600 - 非制造业PMI-业务活动预期指数
402 | - pmi020601 - 非制造业PMI-业务活动预期指数-分行业-建筑业
403 | - pmi020602 - 非制造业PMI-业务活动预期指数-分行业-服务业
404 | - pmi020700 - 非制造业PMI-新出口订单
405 | - pmi020800 - 非制造业PMI-在手订单
406 | - pmi020900 - 非制造业PMI-存货
407 | - pmi021000 - 非制造业PMI-供应商配送时间
408 | - pmi030000 - 中国综合PMI-产出指数
409 | """
410 |
411 | try:
412 | # 登录tushare
413 | tsObj = login()
414 |
415 | # 添加季度字段
416 | if fields:
417 | fields.append('month')
418 | fields = list(set(fields))
419 |
420 | df = tsObj.cn_pmi(m=m, start_m=start_m, end_m=end_m, fields=fields)
421 | # return df.to_json()
422 | return df
423 | except Exception as e:
424 | raise Exception(f"获取PMI数据失败!\n {str(e)}") from e
425 |
426 |
427 |
--------------------------------------------------------------------------------
/src/findata/providers/_tushare/financialData.py:
--------------------------------------------------------------------------------
1 | import os
2 | import pandas as pd
3 | from typing import Optional
4 | from utils.date_processor import standardize_date
5 | from utils.auth import login
6 |
7 |
8 | # 利润表
9 | async def income(
10 | ts_code: str = "",
11 | ann_date: Optional[str] = "",
12 | f_ann_date: Optional[str] = "",
13 | start_date: Optional[str] = "",
14 | end_date: Optional[str] = "",
15 | period: Optional[str] = "",
16 | report_type: Optional[str] = "",
17 | comp_type: Optional[str] = "",
18 | fields: Optional[list] = [],
19 | ) -> dict:
20 | """
21 | Name:
22 | 上市公司财务利润表。
23 |
24 | Description:
25 | 获取上市公司财务三大报表之利润表数据。
26 |
27 | Args:
28 | | 名称 | 类型 | 必选 | 描述 |
29 | |------------|--------|------|----------------------------------------------------------------------|
30 | | ts_code | str | 是 | 股票代码,每次只能查询一支股票 |
31 | | ann_date | str | 否 | 公告日期(YYYYMMDD格式) |
32 | | f_ann_date | str | 否 | 实际公告日期(YYYYMMDD格式) |
33 | | start_date | str | 否 | 公告开始日期(YYYYMMDD格式) |
34 | | end_date | str | 否 | 公告结束日期 (YYYYMMDD格式) |
35 | | period | str | 否 | 报告期(每个季度最后一天的日期,比如20171231表示年报,20170630半年报,20170930三季报) |
36 | | report_type| str | 否 | 报告类型,参考文档最下方说明 |
37 | | comp_type | str | 否 | 公司类型(一般工商业:1,银行:2,保险:3,证券:4) |
38 | | fields | list | 否 | 从Fields中选取需要查询的字段 |
39 |
40 | Fields:
41 | - ts_code:TS代码
42 | - ann_date:公告日期
43 | - f_ann_date:实际公告日期
44 | - end_date:报告期(每个季度最后一天的日期,比如20171231表示年报,20170630半年报,20170930三季报)
45 | - report_type:报告类型 见底部表
46 | - comp_type:公司类型(1一般工商业2银行3保险4证券)
47 | - end_type:报告期类型
48 | - basic_eps:基本每股收益
49 | - diluted_eps:稀释每股收益
50 | - total_revenue:营业总收入
51 | - revenue:营业收入
52 | - int_income:利息收入
53 | - prem_earned:已赚保费
54 | - comm_income:手续费及佣金收入
55 | - n_commis_income:手续费及佣金净收入
56 | - n_oth_income:其他经营净收益
57 | - n_oth_b_income:加:其他业务净收益
58 | - prem_income:保险业务收入
59 | - out_prem:减:分出保费
60 | - une_prem_reser:提取未到期责任准备金
61 | - reins_income:其中:分保费收入
62 | - n_sec_tb_income:代理买卖证券业务净收入
63 | - n_sec_uw_income:证券承销业务净收入
64 | - n_asset_mg_income:受托客户资产管理业务净收入
65 | - oth_b_income:其他业务收入
66 | - fv_value_chg_gain:加:公允价值变动净收益
67 | - invest_income:加:投资净收益
68 | - ass_invest_income:其中:对联营企业和合营企业的投资收益
69 | - forex_gain:加:汇兑净收益
70 | - total_cogs:营业总成本
71 | - oper_cost:减:营业成本
72 | - int_exp:减:利息支出
73 | - comm_exp:减:手续费及佣金支出
74 | - biz_tax_surchg:减:营业税金及附加
75 | - sell_exp:减:销售费用
76 | - admin_exp:减:管理费用
77 | - fin_exp:减:财务费用
78 | - assets_impair_loss:减:资产减值损失
79 | - prem_refund:退保金
80 | - compens_payout:赔付总支出
81 | - reser_insur_liab:提取保险责任准备金
82 | - div_payt:保户红利支出
83 | - reins_exp:分保费用
84 | - oper_exp:营业支出
85 | - compens_payout_refu:减:摊回赔付支出
86 | - insur_reser_refu:减:摊回保险责任准备金
87 | - reins_cost_refund:减:摊回分保费用
88 | - other_bus_cost:其他业务成本
89 | - operate_profit:营业利润
90 | - non_oper_income:加:营业外收入
91 | - non_oper_exp:减:营业外支出
92 | - nca_disploss:其中:减:非流动资产处置净损失
93 | - total_profit:利润总额
94 | - income_tax:所得税费用
95 | - n_income:净利润(含少数股东损益)
96 | - n_income_attr_p:净利润(不含少数股东损益)
97 | - minority_gain:少数股东损益
98 | - oth_compr_income:其他综合收益
99 | - t_compr_income:综合收益总额
100 | - compr_inc_attr_p:归属于母公司(或股东)的综合收益总额
101 | - compr_inc_attr_m_s:归属于少数股东的综合收益总额
102 | - ebit:息税前利润
103 | - ebitda:息税折旧摊销前利润
104 | - insurance_exp:保险业务支出
105 | - undist_profit:年初未分配利润
106 | - distable_profit:可分配利润
107 | - rd_exp:研发费用
108 | - fin_exp_int_exp:财务费用:利息费用
109 | - fin_exp_int_inc:财务费用:利息收入
110 | - transfer_surplus_rese:盈余公积转入
111 | - transfer_housing_imprest:住房周转金转入
112 | - transfer_oth:其他转入
113 | - adj_lossgain:调整以前年度损益
114 | - withdra_legal_surplus:提取法定盈余公积
115 | - withdra_legal_pubfund:提取法定公益金
116 | - withdra_biz_devfund:提取企业发展基金
117 | - withdra_rese_fund:提取储备基金
118 | - withdra_oth_ersu:提取任意盈余公积金
119 | - workers_welfare:职工奖金福利
120 | - distr_profit_shrhder:可供股东分配的利润
121 | - prfshare_payable_dvd:应付优先股股利
122 | - comshare_payable_dvd:应付普通股股利
123 | - capit_comstock_div:转作股本的普通股股利
124 | - net_after_nr_lp_correct:扣除非经常性损益后的净利润(更正前)
125 | - credit_impa_loss:信用减值损失
126 | - net_expo_hedging_benefits:净敞口套期收益
127 | - oth_impair_loss_assets:其他资产减值损失
128 | - total_opcost:营业总成本(二)
129 | - amodcost_fin_assets:以摊余成本计量的金融资产终止确认收益
130 | - oth_income:其他收益
131 | - asset_disp_income:资产处置收益
132 | - continued_net_profit:持续经营净利润
133 | - end_net_profit:终止经营净利润
134 | - update_flag:更新标识
135 | """
136 | try:
137 | # 登录tushare
138 | tsObj = login()
139 |
140 | # 日期标准化
141 | if ann_date:
142 | ann_date = standardize_date(ann_date)
143 |
144 | if start_date:
145 | start_date = standardize_date(start_date)
146 |
147 | if end_date:
148 | end_date = standardize_date(end_date)
149 |
150 | if f_ann_date:
151 | f_ann_date = standardize_date(f_ann_date)
152 |
153 | #TODO 股票代码 标准化
154 |
155 | # 添加必须存在的字段
156 | if fields:
157 | fields.append('ann_date')
158 | fields.append('f_ann_date')
159 | fields.append('end_date')
160 | fields = list(set(fields))
161 |
162 | 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)
163 | # return df.to_json()
164 | return df
165 |
166 | except Exception as e:
167 | raise Exception(f"获取上市公司财务利润表数据失败!\n {str(e)}") from e
168 |
169 |
170 | # 资产负债表
171 | async def balancesheet(
172 | ts_code: str = "",
173 | ann_date: Optional[str] = "",
174 | start_date: Optional[str] = "",
175 | end_date: Optional[str] = "",
176 | period: Optional[str] = "",
177 | report_type: Optional[str] = "",
178 | comp_type: Optional[str] = "",
179 | fields: Optional[list] = [],
180 | ) -> dict:
181 | """
182 | Name:
183 | 上市公司资产负债表。
184 |
185 | Description:
186 | 获取上市公司财务三大报表之资产负债表数据。
187 |
188 | Args:
189 | | 名称 | 类型 | 必选 | 描述 |
190 | |------------|--------|------|----------------------------------------------------------------------|
191 | | ts_code | str | 是 | 股票代码,每次只能查询一支股票 |
192 | | ann_date | str | 否 | 公告日期(YYYYMMDD格式) |
193 | | start_date | str | 否 | 公告开始日期(YYYYMMDD格式) |
194 | | end_date | str | 否 | 公告结束日期 (YYYYMMDD格式) |
195 | | period | str | 否 | 报告期(每个季度最后一天的日期,比如20171231表示年报,20170630半年报,20170930三季报) |
196 | | report_type| str | 否 | 报告类型,参考文档最下方说明 |
197 | | comp_type | str | 否 | 公司类型(一般工商业:1,银行:2,保险:3,证券:4) |
198 | | fields | list | 否 | 从Fields中选取需要查询的字段,必须包含ann_date、f_ann_date、end_date |
199 |
200 | Fields:
201 | - ts_code:TS股票代码
202 | - ann_date:公告日期
203 | - f_ann_date:实际公告日期
204 | - end_date:报告期
205 | - report_type:报表类型
206 | - comp_type:公司类型(1一般工商业2银行3保险4证券)
207 | - end_type:报告期类型
208 | - total_share:期末总股本
209 | - cap_rese:资本公积金
210 | - undistr_porfit:未分配利润
211 | - surplus_rese:盈余公积金
212 | - special_rese:专项储备
213 | - money_cap:货币资金
214 | - trad_asset:交易性金融资产
215 | - notes_receiv:应收票据
216 | - accounts_receiv:应收账款
217 | - oth_receiv:其他应收款
218 | - prepayment:预付款项
219 | - div_receiv:应收股利
220 | - int_receiv:应收利息
221 | - inventories:存货
222 | - amor_exp:待摊费用
223 | - nca_within_1y:一年内到期的非流动资产
224 | - sett_rsrv:结算备付金
225 | - loanto_oth_bank_fi:拆出资金
226 | - premium_receiv:应收保费
227 | - reinsur_receiv:应收分保账款
228 | - reinsur_res_receiv:应收分保合同准备金
229 | - pur_resale_fa:买入返售金融资产
230 | - oth_cur_assets:其他流动资产
231 | - total_cur_assets:流动资产合计
232 | - fa_avail_for_sale:可供出售金融资产
233 | - htm_invest:持有至到期投资
234 | - lt_eqt_invest:长期股权投资
235 | - invest_real_estate:投资性房地产
236 | - time_deposits:定期存款
237 | - oth_assets:其他资产
238 | - lt_rec:长期应收款
239 | - fix_assets:固定资产
240 | - cip:在建工程
241 | - const_materials:工程物资
242 | - fixed_assets_disp:固定资产清理
243 | - produc_bio_assets:生产性生物资产
244 | - oil_and_gas_assets:油气资产
245 | - intan_assets:无形资产
246 | - r_and_d:研发支出
247 | - goodwill:商誉
248 | - lt_amor_exp:长期待摊费用
249 | - defer_tax_assets:递延所得税资产
250 | - decr_in_disbur:发放贷款及垫款
251 | - oth_nca:其他非流动资产
252 | - total_nca:非流动资产合计
253 | - cash_reser_cb:现金及存放中央银行款项
254 | - depos_in_oth_bfi:存放同业和其它金融机构款项
255 | - prec_metals:贵金属
256 | - deriv_assets:衍生金融资产
257 | - rr_reins_une_prem:应收分保未到期责任准备金
258 | - rr_reins_outstd_cla:应收分保未决赔款准备金
259 | - rr_reins_lins_liab:应收分保寿险责任准备金
260 | - rr_reins_lthins_liab:应收分保长期健康险责任准备金
261 | - refund_depos:存出保证金
262 | - ph_pledge_loans:保户质押贷款
263 | - refund_cap_depos:存出资本保证金
264 | - indep_acct_assets:独立账户资产
265 | - client_depos:其中:客户资金存款
266 | - client_prov:其中:客户备付金
267 | - transac_seat_fee:其中:交易席位费
268 | - invest_as_receiv:应收款项类投资
269 | - total_assets:资产总计
270 | - lt_borr:长期借款
271 | - st_borr:短期借款
272 | - cb_borr:向中央银行借款
273 | - depos_ib_deposits:吸收存款及同业存放
274 | - loan_oth_bank:拆入资金
275 | - trading_fl:交易性金融负债
276 | - notes_payable:应付票据
277 | - acct_payable:应付账款
278 | - adv_receipts:预收款项
279 | - sold_for_repur_fa:卖出回购金融资产款
280 | - comm_payable:应付手续费及佣金
281 | - payroll_payable:应付职工薪酬
282 | - taxes_payable:应交税费
283 | - int_payable:应付利息
284 | - div_payable:应付股利
285 | - oth_payable:其他应付款
286 | - acc_exp:预提费用
287 | - deferred_inc:递延收益
288 | - st_bonds_payable:应付短期债券
289 | - payable_to_reinsurer:应付分保账款
290 | - rsrv_insur_cont:保险合同准备金
291 | - acting_trading_sec:代理买卖证券款
292 | - acting_uw_sec:代理承销证券款
293 | - non_cur_liab_due_1y:一年内到期的非流动负债
294 | - oth_cur_liab:其他流动负债
295 | - total_cur_liab:流动负债合计
296 | - bond_payable:应付债券
297 | - lt_payable:长期应付款
298 | - specific_payables:专项应付款
299 | - estimated_liab:预计负债
300 | - defer_tax_liab:递延所得税负债
301 | - defer_inc_non_cur_liab:递延收益-非流动负债
302 | - oth_ncl:其他非流动负债
303 | - total_ncl:非流动负债合计
304 | - depos_oth_bfi:同业和其它金融机构存放款项
305 | - deriv_liab:衍生金融负债
306 | - depos:吸收存款
307 | - agency_bus_liab:代理业务负债
308 | - oth_liab:其他负债
309 | - prem_receiv_adva:预收保费
310 | - depos_received:存入保证金
311 | - ph_invest:保户储金及投资款
312 | - reser_une_prem:未到期责任准备金
313 | - reser_outstd_claims:未决赔款准备金
314 | - reser_lins_liab:寿险责任准备金
315 | - reser_lthins_liab:长期健康险责任准备金
316 | - indept_acc_liab:独立账户负债
317 | - pledge_borr:其中:质押借款
318 | - indem_payable:应付赔付款
319 | - policy_div_payable:应付保单红利
320 | - total_liab:负债合计
321 | - treasury_share:减:库存股
322 | - ordin_risk_reser:一般风险准备
323 | - forex_differ:外币报表折算差额
324 | - invest_loss_unconf:未确认的投资损失
325 | - minority_int:少数股东权益
326 | - total_hldr_eqy_exc_min_int:股东权益合计(不含少数股东权益)
327 | - total_hldr_eqy_inc_min_int:股东权益合计(含少数股东权益)
328 | - total_liab_hldr_eqy:负债及股东权益总计
329 | - lt_payroll_payable:长期应付职工薪酬
330 | - oth_comp_income:其他综合收益
331 | - oth_eqt_tools:其他权益工具
332 | - oth_eqt_tools_p_shr:其他权益工具(优先股)
333 | - lending_funds:融出资金
334 | - acc_receivable:应收款项
335 | - st_fin_payable:应付短期融资款
336 | - payables:应付款项
337 | - hfs_assets:持有待售的资产
338 | - hfs_sales:持有待售的负债
339 | - cost_fin_assets:以摊余成本计量的金融资产
340 | - fair_value_fin_assets:以公允价值计量且其变动计入其他综合收益的金融资产
341 | - cip_total:在建工程(合计)(元)
342 | - oth_pay_total:其他应付款(合计)(元)
343 | - long_pay_total:长期应付款(合计)(元)
344 | - debt_invest:债权投资(元)
345 | - oth_debt_invest:其他债权投资(元)
346 | - oth_eq_invest:其他权益工具投资(元)
347 | - oth_illiq_fin_assets:其他非流动金融资产(元)
348 | - oth_eq_ppbond:其他权益工具:永续债(元)
349 | - receiv_financing:应收款项融资
350 | - use_right_assets:使用权资产
351 | - lease_liab:租赁负债
352 | - contract_assets:合同资产
353 | - contract_liab:合同负债
354 | - accounts_receiv_bill:应收票据及应收账款
355 | - accounts_pay:应付票据及应付账款
356 | - oth_rcv_total:其他应收款(合计)(元)
357 | - fix_assets_total:固定资产(合计)(元)
358 | - update_flag:更新标识
359 |
360 | """
361 | try:
362 | # 登录tushare
363 | tsObj = login()
364 |
365 | # 日期标准化
366 | if ann_date:
367 | ann_date = standardize_date(ann_date)
368 |
369 | if start_date:
370 | start_date = standardize_date(start_date)
371 |
372 | if end_date:
373 | end_date = standardize_date(end_date)
374 |
375 | #TODO 股票代码 标准化
376 |
377 | # 添加必须存在的字段
378 | if fields:
379 | fields.append('ann_date')
380 | fields.append('f_ann_date')
381 | fields.append('end_date')
382 | fields = list(set(fields))
383 |
384 | 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)
385 | # return df.to_json()
386 | return df
387 |
388 | except Exception as e:
389 | raise Exception(f"获取上市公司财务利润表数据失败!\n {str(e)}") from e
390 |
391 | # 现金流量表
392 | async def cashflow(
393 | ts_code: str = "",
394 | ann_date: Optional[str] = "",
395 | f_ann_date: Optional[str] = "",
396 | start_date: Optional[str] = "",
397 | end_date: Optional[str] = "",
398 | period: Optional[str] = "",
399 | report_type: Optional[str] = "",
400 | comp_type: Optional[str] = "",
401 | is_calc: Optional[int] = 0,
402 | fields: Optional[list] = [],
403 | ) -> dict:
404 | """
405 | Name:
406 | 上市公司现金流量表。
407 |
408 | Description:
409 | 获取上市公司财务三大报表之现金流量表数据。
410 |
411 | Args:
412 | | 名称 | 类型 | 必选 | 描述 |
413 | |------------|--------|------|----------------------------------------------------------------------|
414 | | ts_code | str | 是 | 股票代码,每次只能查询一支股票 |
415 | | ann_date | str | 否 | 公告日期(YYYYMMDD格式) |
416 | | f_ann_date | str | 否 | 实际公告日期(YYYYMMDD格式) |
417 | | start_date | str | 否 | 公告开始日期(YYYYMMDD格式) |
418 | | end_date | str | 否 | 公告结束日期 (YYYYMMDD格式) |
419 | | period | str | 否 | 报告期(每个季度最后一天的日期,比如20171231表示年报,20170630半年报,20170930三季报) |
420 | | report_type| str | 否 | 报告类型,参考文档最下方说明 |
421 | | comp_type | str | 否 | 公司类型(一般工商业:1,银行:2,保险:3,证券:4) |
422 | | is_calc | int | 否 | 是否计算报表 |
423 | | fields | list | 否 | 从Fields中选取需要查询的字段,必须包含ann_date、f_ann_date、end_date |
424 |
425 | Fields:
426 | - ts_code:TS股票代码
427 | - ann_date:公告日期
428 | - f_ann_date:实际公告日期
429 | - end_date:报告期
430 | - comp_type:公司类型(1一般工商业2银行3保险4证券)
431 | - report_type:报表类型
432 | - end_type:报告期类型
433 | - net_profit:净利润
434 | - finan_exp:财务费用
435 | - c_fr_sale_sg:销售商品、提供劳务收到的现金
436 | - recp_tax_rends:收到的税费返还
437 | - n_depos_incr_fi:客户存款和同业存放款项净增加额
438 | - n_incr_loans_cb:向中央银行借款净增加额
439 | - n_inc_borr_oth_fi:向其他金融机构拆入资金净增加额
440 | - prem_fr_orig_contr:收到原保险合同保费取得的现金
441 | - n_incr_insured_dep:保户储金净增加额
442 | - n_reinsur_prem:收到再保业务现金净额
443 | - n_incr_disp_tfa:处置交易性金融资产净增加额
444 | - ifc_cash_incr:收取利息和手续费净增加额
445 | - n_incr_disp_faas:处置可供出售金融资产净增加额
446 | - n_incr_loans_oth_bank:拆入资金净增加额
447 | - n_cap_incr_repur:回购业务资金净增加额
448 | - c_fr_oth_operate_a:收到其他与经营活动有关的现金
449 | - c_inf_fr_operate_a:经营活动现金流入小计
450 | - c_paid_goods_s:购买商品、接受劳务支付的现金
451 | - c_paid_to_for_empl:支付给职工以及为职工支付的现金
452 | - c_paid_for_taxes:支付的各项税费
453 | - n_incr_clt_loan_adv:客户贷款及垫款净增加额
454 | - n_incr_dep_cbob:存放央行和同业款项净增加额
455 | - c_pay_claims_orig_inco:支付原保险合同赔付款项的现金
456 | - pay_handling_chrg:支付手续费的现金
457 | - pay_comm_insur_plcy:支付保单红利的现金
458 | - oth_cash_pay_oper_act:支付其他与经营活动有关的现金
459 | - st_cash_out_act:经营活动现金流出小计
460 | - n_cashflow_act:经营活动产生的现金流量净额
461 | - oth_recp_ral_inv_act:收到其他与投资活动有关的现金
462 | - c_disp_withdrwl_invest:收回投资收到的现金
463 | - c_recp_return_invest:取得投资收益收到的现金
464 | - n_recp_disp_fiolta:处置固定资产、无形资产和其他长期资产收回的现金净额
465 | - n_recp_disp_sobu:处置子公司及其他营业单位收到的现金净额
466 | - stot_inflows_inv_act:投资活动现金流入小计
467 | - c_pay_acq_const_fiolta:购建固定资产、无形资产和其他长期资产支付的现金
468 | - c_paid_invest:投资支付的现金
469 | - n_disp_subs_oth_biz:取得子公司及其他营业单位支付的现金净额
470 | - oth_pay_ral_inv_act:支付其他与投资活动有关的现金
471 | - n_incr_pledge_loan:质押贷款净增加额
472 | - stot_out_inv_act:投资活动现金流出小计
473 | - n_cashflow_inv_act:投资活动产生的现金流量净额
474 | - c_recp_borrow:取得借款收到的现金
475 | - proc_issue_bonds:发行债券收到的现金
476 | - oth_cash_recp_ral_fnc_act:收到其他与筹资活动有关的现金
477 | - stot_cash_in_fnc_act:筹资活动现金流入小计
478 | - free_cashflow:企业自由现金流量
479 | - c_prepay_amt_borr:偿还债务支付的现金
480 | - c_pay_dist_dpcp_int_exp:分配股利、利润或偿付利息支付的现金
481 | - incl_dvd_profit_paid_sc_ms:其中:子公司支付给少数股东的股利、利润
482 | - oth_cashpay_ral_fnc_act:支付其他与筹资活动有关的现金
483 | - stot_cashout_fnc_act:筹资活动现金流出小计
484 | - n_cash_flows_fnc_act:筹资活动产生的现金流量净额
485 | - eff_fx_flu_cash:汇率变动对现金的影响
486 | - n_incr_cash_cash_equ:现金及现金等价物净增加额
487 | - c_cash_equ_beg_period:期初现金及现金等价物余额
488 | - c_cash_equ_end_period:期末现金及现金等价物余额
489 | - c_recp_cap_contrib:吸收投资收到的现金
490 | - incl_cash_rec_saims:其中:子公司吸收少数股东投资收到的现金
491 | - uncon_invest_loss:未确认投资损失
492 | - prov_depr_assets:加:资产减值准备
493 | - depr_fa_coga_dpba:固定资产折旧、油气资产折耗、生产性生物资产折旧
494 | - amort_intang_assets:无形资产摊销
495 | - lt_amort_deferred_exp:长期待摊费用摊销
496 | - decr_deferred_exp:待摊费用减少
497 | - incr_acc_exp:预提费用增加
498 | - loss_disp_fiolta:处置固定、无形资产和其他长期资产的损失
499 | - loss_scr_fa:固定资产报废损失
500 | - loss_fv_chg:公允价值变动损失
501 | - invest_loss:投资损失
502 | - decr_def_inc_tax_assets:递延所得税资产减少
503 | - incr_def_inc_tax_liab:递延所得税负债增加
504 | - decr_inventories:存货的减少
505 | - decr_oper_payable:经营性应收项目的减少
506 | - incr_oper_payable:经营性应付项目的增加
507 | - others:其他
508 | - im_net_cashflow_oper_act:经营活动产生的现金流量净额(间接法)
509 | - conv_debt_into_cap:债务转为资本
510 | - conv_copbonds_due_within_1y:一年内到期的可转换公司债券
511 | - fa_fnc_leases:融资租入固定资产
512 | - im_n_incr_cash_equ:现金及现金等价物净增加额(间接法)
513 | - net_dism_capital_add:拆出资金净增加额
514 | - net_cash_rece_sec:代理买卖证券收到的现金净额(元)
515 | - credit_impa_loss:信用减值损失
516 | - use_right_asset_dep:使用权资产折旧
517 | - oth_loss_asset:其他资产减值损失
518 | - end_bal_cash:现金的期末余额
519 | - beg_bal_cash:减:现金的期初余额
520 | - end_bal_cash_equ:加:现金等价物的期末余额
521 | - beg_bal_cash_equ:减:现金等价物的期初余额
522 | - update_flag:更新标志(1最新)
523 |
524 | """
525 |
526 | try:
527 | # 登录tushare
528 | tsObj = login()
529 |
530 | # 日期标准化
531 | if ann_date:
532 | ann_date = standardize_date(ann_date)
533 |
534 | if f_ann_date:
535 | f_ann_date = standardize_date(f_ann_date)
536 |
537 | if start_date:
538 | start_date = standardize_date(start_date)
539 |
540 | if end_date:
541 | end_date = standardize_date(end_date)
542 |
543 | #TODO 股票代码 标准化
544 |
545 |
546 | # 添加必须存在的字段
547 | if fields:
548 | fields.append('ann_date')
549 | fields.append('f_ann_date')
550 | fields.append('end_date')
551 | fields = list(set(fields))
552 |
553 | 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)
554 | # return df.to_json()
555 | return df
556 |
557 | except Exception as e:
558 | raise Exception(f"获取上市公司现金流量表数据失败!\n {str(e)}") from e
559 |
560 |
561 |
562 |
--------------------------------------------------------------------------------
/uv.lock:
--------------------------------------------------------------------------------
1 | version = 1
2 | revision = 1
3 | requires-python = ">=3.11"
4 | resolution-markers = [
5 | "python_full_version >= '3.12'",
6 | "python_full_version < '3.12'",
7 | ]
8 |
9 | [[package]]
10 | name = "annotated-types"
11 | version = "0.7.0"
12 | source = { registry = "https://pypi.org/simple" }
13 | sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
14 | wheels = [
15 | { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
16 | ]
17 |
18 | [[package]]
19 | name = "anyio"
20 | version = "4.9.0"
21 | source = { registry = "https://pypi.org/simple" }
22 | dependencies = [
23 | { name = "idna" },
24 | { name = "sniffio" },
25 | { name = "typing-extensions", marker = "python_full_version < '3.13'" },
26 | ]
27 | sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 }
28 | wheels = [
29 | { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 },
30 | ]
31 |
32 | [[package]]
33 | name = "beautifulsoup4"
34 | version = "4.13.3"
35 | source = { registry = "https://pypi.org/simple" }
36 | dependencies = [
37 | { name = "soupsieve" },
38 | { name = "typing-extensions" },
39 | ]
40 | sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 }
41 | wheels = [
42 | { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 },
43 | ]
44 |
45 | [[package]]
46 | name = "bs4"
47 | version = "0.0.2"
48 | source = { registry = "https://pypi.org/simple" }
49 | dependencies = [
50 | { name = "beautifulsoup4" },
51 | ]
52 | sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698 }
53 | wheels = [
54 | { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189 },
55 | ]
56 |
57 | [[package]]
58 | name = "certifi"
59 | version = "2025.1.31"
60 | source = { registry = "https://pypi.org/simple" }
61 | sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 }
62 | wheels = [
63 | { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 },
64 | ]
65 |
66 | [[package]]
67 | name = "charset-normalizer"
68 | version = "3.4.1"
69 | source = { registry = "https://pypi.org/simple" }
70 | sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
71 | wheels = [
72 | { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 },
73 | { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 },
74 | { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 },
75 | { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 },
76 | { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 },
77 | { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 },
78 | { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 },
79 | { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 },
80 | { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 },
81 | { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 },
82 | { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 },
83 | { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 },
84 | { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 },
85 | { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 },
86 | { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 },
87 | { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 },
88 | { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 },
89 | { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 },
90 | { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 },
91 | { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 },
92 | { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 },
93 | { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 },
94 | { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 },
95 | { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 },
96 | { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 },
97 | { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 },
98 | { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 },
99 | { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 },
100 | { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 },
101 | { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 },
102 | { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 },
103 | { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 },
104 | { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 },
105 | { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 },
106 | { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 },
107 | { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 },
108 | { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 },
109 | { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 },
110 | { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 },
111 | { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
112 | ]
113 |
114 | [[package]]
115 | name = "click"
116 | version = "8.1.8"
117 | source = { registry = "https://pypi.org/simple" }
118 | dependencies = [
119 | { name = "colorama", marker = "sys_platform == 'win32'" },
120 | ]
121 | sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
122 | wheels = [
123 | { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
124 | ]
125 |
126 | [[package]]
127 | name = "colorama"
128 | version = "0.4.6"
129 | source = { registry = "https://pypi.org/simple" }
130 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
131 | wheels = [
132 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
133 | ]
134 |
135 | [[package]]
136 | name = "findata"
137 | version = "0.1.0"
138 | source = { virtual = "." }
139 | dependencies = [
140 | { name = "mcp", extra = ["cli"] },
141 | { name = "pandas" },
142 | { name = "tushare" },
143 | ]
144 |
145 | [package.metadata]
146 | requires-dist = [
147 | { name = "mcp", extras = ["cli"], specifier = ">=1.6.0" },
148 | { name = "pandas", specifier = ">=2.2.3" },
149 | { name = "tushare", specifier = ">=1.4.21" },
150 | ]
151 |
152 | [[package]]
153 | name = "h11"
154 | version = "0.14.0"
155 | source = { registry = "https://pypi.org/simple" }
156 | sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
157 | wheels = [
158 | { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
159 | ]
160 |
161 | [[package]]
162 | name = "httpcore"
163 | version = "1.0.8"
164 | source = { registry = "https://pypi.org/simple" }
165 | dependencies = [
166 | { name = "certifi" },
167 | { name = "h11" },
168 | ]
169 | sdist = { url = "https://files.pythonhosted.org/packages/9f/45/ad3e1b4d448f22c0cff4f5692f5ed0666658578e358b8d58a19846048059/httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad", size = 85385 }
170 | wheels = [
171 | { url = "https://files.pythonhosted.org/packages/18/8d/f052b1e336bb2c1fc7ed1aaed898aa570c0b61a09707b108979d9fc6e308/httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be", size = 78732 },
172 | ]
173 |
174 | [[package]]
175 | name = "httpx"
176 | version = "0.28.1"
177 | source = { registry = "https://pypi.org/simple" }
178 | dependencies = [
179 | { name = "anyio" },
180 | { name = "certifi" },
181 | { name = "httpcore" },
182 | { name = "idna" },
183 | ]
184 | sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
185 | wheels = [
186 | { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
187 | ]
188 |
189 | [[package]]
190 | name = "httpx-sse"
191 | version = "0.4.0"
192 | source = { registry = "https://pypi.org/simple" }
193 | sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 }
194 | wheels = [
195 | { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 },
196 | ]
197 |
198 | [[package]]
199 | name = "idna"
200 | version = "3.10"
201 | source = { registry = "https://pypi.org/simple" }
202 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
203 | wheels = [
204 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
205 | ]
206 |
207 | [[package]]
208 | name = "lxml"
209 | version = "5.3.2"
210 | source = { registry = "https://pypi.org/simple" }
211 | sdist = { url = "https://files.pythonhosted.org/packages/80/61/d3dc048cd6c7be6fe45b80cedcbdd4326ba4d550375f266d9f4246d0f4bc/lxml-5.3.2.tar.gz", hash = "sha256:773947d0ed809ddad824b7b14467e1a481b8976e87278ac4a730c2f7c7fcddc1", size = 3679948 }
212 | wheels = [
213 | { url = "https://files.pythonhosted.org/packages/84/b8/2b727f5a90902f7cc5548349f563b60911ca05f3b92e35dfa751349f265f/lxml-5.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d61a7d0d208ace43986a92b111e035881c4ed45b1f5b7a270070acae8b0bfb4", size = 8163457 },
214 | { url = "https://files.pythonhosted.org/packages/91/84/23135b2dc72b3440d68c8f39ace2bb00fe78e3a2255f7c74f7e76f22498e/lxml-5.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856dfd7eda0b75c29ac80a31a6411ca12209183e866c33faf46e77ace3ce8a79", size = 4433445 },
215 | { url = "https://files.pythonhosted.org/packages/c9/1c/6900ade2294488f80598af7b3229669562166384bb10bf4c915342a2f288/lxml-5.3.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a01679e4aad0727bedd4c9407d4d65978e920f0200107ceeffd4b019bd48529", size = 5029603 },
216 | { url = "https://files.pythonhosted.org/packages/2f/e9/31dbe5deaccf0d33ec279cf400306ad4b32dfd1a0fee1fca40c5e90678fe/lxml-5.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6b37b4c3acb8472d191816d4582379f64d81cecbdce1a668601745c963ca5cc", size = 4771236 },
217 | { url = "https://files.pythonhosted.org/packages/68/41/c3412392884130af3415af2e89a2007e00b2a782be6fb848a95b598a114c/lxml-5.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3df5a54e7b7c31755383f126d3a84e12a4e0333db4679462ef1165d702517477", size = 5369815 },
218 | { url = "https://files.pythonhosted.org/packages/34/0a/ba0309fd5f990ea0cc05aba2bea225ef1bcb07ecbf6c323c6b119fc46e7f/lxml-5.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c09a40f28dcded933dc16217d6a092be0cc49ae25811d3b8e937c8060647c353", size = 4843663 },
219 | { url = "https://files.pythonhosted.org/packages/b6/c6/663b5d87d51d00d4386a2d52742a62daa486c5dc6872a443409d9aeafece/lxml-5.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1ef20f1851ccfbe6c5a04c67ec1ce49da16ba993fdbabdce87a92926e505412", size = 4918028 },
220 | { url = "https://files.pythonhosted.org/packages/75/5f/f6a72ccbe05cf83341d4b6ad162ed9e1f1ffbd12f1c4b8bc8ae413392282/lxml-5.3.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f79a63289dbaba964eb29ed3c103b7911f2dce28c36fe87c36a114e6bd21d7ad", size = 4792005 },
221 | { url = "https://files.pythonhosted.org/packages/37/7b/8abd5b332252239ffd28df5842ee4e5bf56e1c613c323586c21ccf5af634/lxml-5.3.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:75a72697d95f27ae00e75086aed629f117e816387b74a2f2da6ef382b460b710", size = 5405363 },
222 | { url = "https://files.pythonhosted.org/packages/5a/79/549b7ec92b8d9feb13869c1b385a0749d7ccfe5590d1e60f11add9cdd580/lxml-5.3.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:b9b00c9ee1cc3a76f1f16e94a23c344e0b6e5c10bec7f94cf2d820ce303b8c01", size = 4932915 },
223 | { url = "https://files.pythonhosted.org/packages/57/eb/4fa626d0bac8b4f2aa1d0e6a86232db030fd0f462386daf339e4a0ee352b/lxml-5.3.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:77cbcab50cbe8c857c6ba5f37f9a3976499c60eada1bf6d38f88311373d7b4bc", size = 4983473 },
224 | { url = "https://files.pythonhosted.org/packages/1b/c8/79d61d13cbb361c2c45fbe7c8bd00ea6a23b3e64bc506264d2856c60d702/lxml-5.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29424058f072a24622a0a15357bca63d796954758248a72da6d512f9bd9a4493", size = 4855284 },
225 | { url = "https://files.pythonhosted.org/packages/80/16/9f84e1ef03a13136ab4f9482c9adaaad425c68b47556b9d3192a782e5d37/lxml-5.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7d82737a8afe69a7c80ef31d7626075cc7d6e2267f16bf68af2c764b45ed68ab", size = 5458355 },
226 | { url = "https://files.pythonhosted.org/packages/aa/6d/f62860451bb4683e87636e49effb76d499773337928e53356c1712ccec24/lxml-5.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:95473d1d50a5d9fcdb9321fdc0ca6e1edc164dce4c7da13616247d27f3d21e31", size = 5300051 },
227 | { url = "https://files.pythonhosted.org/packages/3f/5f/3b6c4acec17f9a57ea8bb89a658a70621db3fb86ea588e7703b6819d9b03/lxml-5.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2162068f6da83613f8b2a32ca105e37a564afd0d7009b0b25834d47693ce3538", size = 5033481 },
228 | { url = "https://files.pythonhosted.org/packages/79/bd/3c4dd7d903bb9981f4876c61ef2ff5d5473e409ef61dc7337ac207b91920/lxml-5.3.2-cp311-cp311-win32.whl", hash = "sha256:f8695752cf5d639b4e981afe6c99e060621362c416058effd5c704bede9cb5d1", size = 3474266 },
229 | { url = "https://files.pythonhosted.org/packages/1f/ea/9311fa1ef75b7d601c89600fc612838ee77ad3d426184941cba9cf62641f/lxml-5.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:d1a94cbb4ee64af3ab386c2d63d6d9e9cf2e256ac0fd30f33ef0a3c88f575174", size = 3815230 },
230 | { url = "https://files.pythonhosted.org/packages/0d/7e/c749257a7fabc712c4df57927b0f703507f316e9f2c7e3219f8f76d36145/lxml-5.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:16b3897691ec0316a1aa3c6585f61c8b7978475587c5b16fc1d2c28d283dc1b0", size = 8193212 },
231 | { url = "https://files.pythonhosted.org/packages/a8/50/17e985ba162c9f1ca119f4445004b58f9e5ef559ded599b16755e9bfa260/lxml-5.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8d4b34a0eeaf6e73169dcfd653c8d47f25f09d806c010daf074fba2db5e2d3f", size = 4451439 },
232 | { url = "https://files.pythonhosted.org/packages/c2/b5/4960ba0fcca6ce394ed4a2f89ee13083e7fcbe9641a91166e8e9792fedb1/lxml-5.3.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cd7a959396da425022e1e4214895b5cfe7de7035a043bcc2d11303792b67554", size = 5052146 },
233 | { url = "https://files.pythonhosted.org/packages/5f/d1/184b04481a5d1f5758916de087430752a7b229bddbd6c1d23405078c72bd/lxml-5.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cac5eaeec3549c5df7f8f97a5a6db6963b91639389cdd735d5a806370847732b", size = 4789082 },
234 | { url = "https://files.pythonhosted.org/packages/7d/75/1a19749d373e9a3d08861addccdf50c92b628c67074b22b8f3c61997cf5a/lxml-5.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29b5f7d77334877c2146e7bb8b94e4df980325fab0a8af4d524e5d43cd6f789d", size = 5312300 },
235 | { url = "https://files.pythonhosted.org/packages/fb/00/9d165d4060d3f347e63b219fcea5c6a3f9193e9e2868c6801e18e5379725/lxml-5.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13f3495cfec24e3d63fffd342cc8141355d1d26ee766ad388775f5c8c5ec3932", size = 4836655 },
236 | { url = "https://files.pythonhosted.org/packages/b8/e9/06720a33cc155966448a19677f079100517b6629a872382d22ebd25e48aa/lxml-5.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e70ad4c9658beeff99856926fd3ee5fde8b519b92c693f856007177c36eb2e30", size = 4961795 },
237 | { url = "https://files.pythonhosted.org/packages/2d/57/4540efab2673de2904746b37ef7f74385329afd4643ed92abcc9ec6e00ca/lxml-5.3.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:507085365783abd7879fa0a6fa55eddf4bdd06591b17a2418403bb3aff8a267d", size = 4779791 },
238 | { url = "https://files.pythonhosted.org/packages/99/ad/6056edf6c9f4fa1d41e6fbdae52c733a4a257fd0d7feccfa26ae051bb46f/lxml-5.3.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:5bb304f67cbf5dfa07edad904732782cbf693286b9cd85af27059c5779131050", size = 5346807 },
239 | { url = "https://files.pythonhosted.org/packages/a1/fa/5be91fc91a18f3f705ea5533bc2210b25d738c6b615bf1c91e71a9b2f26b/lxml-5.3.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:3d84f5c093645c21c29a4e972b84cb7cf682f707f8706484a5a0c7ff13d7a988", size = 4909213 },
240 | { url = "https://files.pythonhosted.org/packages/f3/74/71bb96a3b5ae36b74e0402f4fa319df5559a8538577f8c57c50f1b57dc15/lxml-5.3.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:bdc13911db524bd63f37b0103af014b7161427ada41f1b0b3c9b5b5a9c1ca927", size = 4987694 },
241 | { url = "https://files.pythonhosted.org/packages/08/c2/3953a68b0861b2f97234b1838769269478ccf872d8ea7a26e911238220ad/lxml-5.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ec944539543f66ebc060ae180d47e86aca0188bda9cbfadff47d86b0dc057dc", size = 4862865 },
242 | { url = "https://files.pythonhosted.org/packages/e0/9a/52e48f7cfd5a5e61f44a77e679880580dfb4f077af52d6ed5dd97e3356fe/lxml-5.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:59d437cc8a7f838282df5a199cf26f97ef08f1c0fbec6e84bd6f5cc2b7913f6e", size = 5423383 },
243 | { url = "https://files.pythonhosted.org/packages/17/67/42fe1d489e4dcc0b264bef361aef0b929fbb2b5378702471a3043bc6982c/lxml-5.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e275961adbd32e15672e14e0cc976a982075208224ce06d149c92cb43db5b93", size = 5286864 },
244 | { url = "https://files.pythonhosted.org/packages/29/e4/03b1d040ee3aaf2bd4e1c2061de2eae1178fe9a460d3efc1ea7ef66f6011/lxml-5.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:038aeb6937aa404480c2966b7f26f1440a14005cb0702078c173c028eca72c31", size = 5056819 },
245 | { url = "https://files.pythonhosted.org/packages/83/b3/e2ec8a6378e4d87da3af9de7c862bcea7ca624fc1a74b794180c82e30123/lxml-5.3.2-cp312-cp312-win32.whl", hash = "sha256:3c2c8d0fa3277147bff180e3590be67597e17d365ce94beb2efa3138a2131f71", size = 3486177 },
246 | { url = "https://files.pythonhosted.org/packages/d5/8a/6a08254b0bab2da9573735725caab8302a2a1c9b3818533b41568ca489be/lxml-5.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:77809fcd97dfda3f399102db1794f7280737b69830cd5c961ac87b3c5c05662d", size = 3817134 },
247 | { url = "https://files.pythonhosted.org/packages/19/fe/904fd1b0ba4f42ed5a144fcfff7b8913181892a6aa7aeb361ee783d441f8/lxml-5.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:77626571fb5270ceb36134765f25b665b896243529eefe840974269b083e090d", size = 8173598 },
248 | { url = "https://files.pythonhosted.org/packages/97/e8/5e332877b3ce4e2840507b35d6dbe1cc33b17678ece945ba48d2962f8c06/lxml-5.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78a533375dc7aa16d0da44af3cf6e96035e484c8c6b2b2445541a5d4d3d289ee", size = 4441586 },
249 | { url = "https://files.pythonhosted.org/packages/de/f4/8fe2e6d8721803182fbce2325712e98f22dbc478126070e62731ec6d54a0/lxml-5.3.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6f62b2404b3f3f0744bbcabb0381c5fe186fa2a9a67ecca3603480f4846c585", size = 5038447 },
250 | { url = "https://files.pythonhosted.org/packages/a6/ac/fa63f86a1a4b1ba8b03599ad9e2f5212fa813223ac60bfe1155390d1cc0c/lxml-5.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea918da00091194526d40c30c4996971f09dacab032607581f8d8872db34fbf", size = 4783583 },
251 | { url = "https://files.pythonhosted.org/packages/1a/7a/08898541296a02c868d4acc11f31a5839d80f5b21d4a96f11d4c0fbed15e/lxml-5.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c35326f94702a7264aa0eea826a79547d3396a41ae87a70511b9f6e9667ad31c", size = 5305684 },
252 | { url = "https://files.pythonhosted.org/packages/0b/be/9a6d80b467771b90be762b968985d3de09e0d5886092238da65dac9c1f75/lxml-5.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3bef90af21d31c4544bc917f51e04f94ae11b43156356aff243cdd84802cbf2", size = 4830797 },
253 | { url = "https://files.pythonhosted.org/packages/8d/1c/493632959f83519802637f7db3be0113b6e8a4e501b31411fbf410735a75/lxml-5.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52fa7ba11a495b7cbce51573c73f638f1dcff7b3ee23697467dc063f75352a69", size = 4950302 },
254 | { url = "https://files.pythonhosted.org/packages/c7/13/01aa3b92a6b93253b90c061c7527261b792f5ae7724b420cded733bfd5d6/lxml-5.3.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ad131e2c4d2c3803e736bb69063382334e03648de2a6b8f56a878d700d4b557d", size = 4775247 },
255 | { url = "https://files.pythonhosted.org/packages/60/4a/baeb09fbf5c84809e119c9cf8e2e94acec326a9b45563bf5ae45a234973b/lxml-5.3.2-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:00a4463ca409ceacd20490a893a7e08deec7870840eff33dc3093067b559ce3e", size = 5338824 },
256 | { url = "https://files.pythonhosted.org/packages/69/c7/a05850f169ad783ed09740ac895e158b06d25fce4b13887a8ac92a84d61c/lxml-5.3.2-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:87e8d78205331cace2b73ac8249294c24ae3cba98220687b5b8ec5971a2267f1", size = 4899079 },
257 | { url = "https://files.pythonhosted.org/packages/de/48/18ca583aba5235582db0e933ed1af6540226ee9ca16c2ee2d6f504fcc34a/lxml-5.3.2-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bf6389133bb255e530a4f2f553f41c4dd795b1fbb6f797aea1eff308f1e11606", size = 4978041 },
258 | { url = "https://files.pythonhosted.org/packages/b6/55/6968ddc88554209d1dba0dca196360c629b3dfe083bc32a3370f9523a0c4/lxml-5.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b3709fc752b42fb6b6ffa2ba0a5b9871646d97d011d8f08f4d5b3ee61c7f3b2b", size = 4859761 },
259 | { url = "https://files.pythonhosted.org/packages/2e/52/d2d3baa1e0b7d04a729613160f1562f466fb1a0e45085a33acb0d6981a2b/lxml-5.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:abc795703d0de5d83943a4badd770fbe3d1ca16ee4ff3783d7caffc252f309ae", size = 5418209 },
260 | { url = "https://files.pythonhosted.org/packages/d3/50/6005b297ba5f858a113d6e81ccdb3a558b95a615772e7412d1f1cbdf22d7/lxml-5.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98050830bb6510159f65d9ad1b8aca27f07c01bb3884ba95f17319ccedc4bcf9", size = 5274231 },
261 | { url = "https://files.pythonhosted.org/packages/fb/33/6f40c09a5f7d7e7fcb85ef75072e53eba3fbadbf23e4991ca069ab2b1abb/lxml-5.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ba465a91acc419c5682f8b06bcc84a424a7aa5c91c220241c6fd31de2a72bc6", size = 5051899 },
262 | { url = "https://files.pythonhosted.org/packages/8b/3a/673bc5c0d5fb6596ee2963dd016fdaefaed2c57ede82c7634c08cbda86c1/lxml-5.3.2-cp313-cp313-win32.whl", hash = "sha256:56a1d56d60ea1ec940f949d7a309e0bff05243f9bd337f585721605670abb1c1", size = 3485315 },
263 | { url = "https://files.pythonhosted.org/packages/8c/be/cab8dd33b0dbe3af5b5d4d24137218f79ea75d540f74eb7d8581195639e0/lxml-5.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:1a580dc232c33d2ad87d02c8a3069d47abbcdce974b9c9cc82a79ff603065dbe", size = 3814639 },
264 | ]
265 |
266 | [[package]]
267 | name = "markdown-it-py"
268 | version = "3.0.0"
269 | source = { registry = "https://pypi.org/simple" }
270 | dependencies = [
271 | { name = "mdurl" },
272 | ]
273 | sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
274 | wheels = [
275 | { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 },
276 | ]
277 |
278 | [[package]]
279 | name = "mcp"
280 | version = "1.6.0"
281 | source = { registry = "https://pypi.org/simple" }
282 | dependencies = [
283 | { name = "anyio" },
284 | { name = "httpx" },
285 | { name = "httpx-sse" },
286 | { name = "pydantic" },
287 | { name = "pydantic-settings" },
288 | { name = "sse-starlette" },
289 | { name = "starlette" },
290 | { name = "uvicorn" },
291 | ]
292 | sdist = { url = "https://files.pythonhosted.org/packages/95/d2/f587cb965a56e992634bebc8611c5b579af912b74e04eb9164bd49527d21/mcp-1.6.0.tar.gz", hash = "sha256:d9324876de2c5637369f43161cd71eebfd803df5a95e46225cab8d280e366723", size = 200031 }
293 | wheels = [
294 | { url = "https://files.pythonhosted.org/packages/10/30/20a7f33b0b884a9d14dd3aa94ff1ac9da1479fe2ad66dd9e2736075d2506/mcp-1.6.0-py3-none-any.whl", hash = "sha256:7bd24c6ea042dbec44c754f100984d186620d8b841ec30f1b19eda9b93a634d0", size = 76077 },
295 | ]
296 |
297 | [package.optional-dependencies]
298 | cli = [
299 | { name = "python-dotenv" },
300 | { name = "typer" },
301 | ]
302 |
303 | [[package]]
304 | name = "mdurl"
305 | version = "0.1.2"
306 | source = { registry = "https://pypi.org/simple" }
307 | sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
308 | wheels = [
309 | { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
310 | ]
311 |
312 | [[package]]
313 | name = "numpy"
314 | version = "2.2.4"
315 | source = { registry = "https://pypi.org/simple" }
316 | sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 }
317 | wheels = [
318 | { url = "https://files.pythonhosted.org/packages/16/fb/09e778ee3a8ea0d4dc8329cca0a9c9e65fed847d08e37eba74cb7ed4b252/numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", size = 21254989 },
319 | { url = "https://files.pythonhosted.org/packages/a2/0a/1212befdbecab5d80eca3cde47d304cad986ad4eec7d85a42e0b6d2cc2ef/numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", size = 14425910 },
320 | { url = "https://files.pythonhosted.org/packages/2b/3e/e7247c1d4f15086bb106c8d43c925b0b2ea20270224f5186fa48d4fb5cbd/numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", size = 5426490 },
321 | { url = "https://files.pythonhosted.org/packages/5d/fa/aa7cd6be51419b894c5787a8a93c3302a1ed4f82d35beb0613ec15bdd0e2/numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", size = 6967754 },
322 | { url = "https://files.pythonhosted.org/packages/d5/ee/96457c943265de9fadeb3d2ffdbab003f7fba13d971084a9876affcda095/numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", size = 14373079 },
323 | { url = "https://files.pythonhosted.org/packages/c5/5c/ceefca458559f0ccc7a982319f37ed07b0d7b526964ae6cc61f8ad1b6119/numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", size = 16428819 },
324 | { url = "https://files.pythonhosted.org/packages/22/31/9b2ac8eee99e001eb6add9fa27514ef5e9faf176169057a12860af52704c/numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", size = 15881470 },
325 | { url = "https://files.pythonhosted.org/packages/f0/dc/8569b5f25ff30484b555ad8a3f537e0225d091abec386c9420cf5f7a2976/numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", size = 18218144 },
326 | { url = "https://files.pythonhosted.org/packages/5e/05/463c023a39bdeb9bb43a99e7dee2c664cb68d5bb87d14f92482b9f6011cc/numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", size = 6606368 },
327 | { url = "https://files.pythonhosted.org/packages/8b/72/10c1d2d82101c468a28adc35de6c77b308f288cfd0b88e1070f15b98e00c/numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91", size = 12947526 },
328 | { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 },
329 | { url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 },
330 | { url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 },
331 | { url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 },
332 | { url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 },
333 | { url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 },
334 | { url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 },
335 | { url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 },
336 | { url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 },
337 | { url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 },
338 | { url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623 },
339 | { url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681 },
340 | { url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759 },
341 | { url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092 },
342 | { url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422 },
343 | { url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202 },
344 | { url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131 },
345 | { url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270 },
346 | { url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141 },
347 | { url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885 },
348 | { url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829 },
349 | { url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419 },
350 | { url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414 },
351 | { url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379 },
352 | { url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725 },
353 | { url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638 },
354 | { url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717 },
355 | { url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998 },
356 | { url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896 },
357 | { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 },
358 | ]
359 |
360 | [[package]]
361 | name = "pandas"
362 | version = "2.2.3"
363 | source = { registry = "https://pypi.org/simple" }
364 | dependencies = [
365 | { name = "numpy" },
366 | { name = "python-dateutil" },
367 | { name = "pytz" },
368 | { name = "tzdata" },
369 | ]
370 | sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 }
371 | wheels = [
372 | { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222 },
373 | { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274 },
374 | { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836 },
375 | { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505 },
376 | { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420 },
377 | { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457 },
378 | { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166 },
379 | { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 },
380 | { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 },
381 | { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 },
382 | { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 },
383 | { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 },
384 | { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 },
385 | { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 },
386 | { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 },
387 | { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 },
388 | { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 },
389 | { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 },
390 | { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 },
391 | { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 },
392 | { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 },
393 | { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 },
394 | { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 },
395 | { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 },
396 | { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 },
397 | { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 },
398 | { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
399 | ]
400 |
401 | [[package]]
402 | name = "pydantic"
403 | version = "2.11.3"
404 | source = { registry = "https://pypi.org/simple" }
405 | dependencies = [
406 | { name = "annotated-types" },
407 | { name = "pydantic-core" },
408 | { name = "typing-extensions" },
409 | { name = "typing-inspection" },
410 | ]
411 | sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 }
412 | wheels = [
413 | { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 },
414 | ]
415 |
416 | [[package]]
417 | name = "pydantic-core"
418 | version = "2.33.1"
419 | source = { registry = "https://pypi.org/simple" }
420 | dependencies = [
421 | { name = "typing-extensions" },
422 | ]
423 | sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 }
424 | wheels = [
425 | { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224 },
426 | { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845 },
427 | { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029 },
428 | { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784 },
429 | { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075 },
430 | { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849 },
431 | { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794 },
432 | { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237 },
433 | { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351 },
434 | { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914 },
435 | { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385 },
436 | { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765 },
437 | { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688 },
438 | { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185 },
439 | { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640 },
440 | { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649 },
441 | { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472 },
442 | { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509 },
443 | { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702 },
444 | { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428 },
445 | { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753 },
446 | { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849 },
447 | { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541 },
448 | { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225 },
449 | { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373 },
450 | { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034 },
451 | { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848 },
452 | { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986 },
453 | { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 },
454 | { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 },
455 | { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 },
456 | { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 },
457 | { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 },
458 | { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 },
459 | { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 },
460 | { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 },
461 | { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 },
462 | { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 },
463 | { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 },
464 | { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 },
465 | { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 },
466 | { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 },
467 | { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 },
468 | { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 },
469 | { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 },
470 | { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858 },
471 | { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745 },
472 | { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188 },
473 | { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479 },
474 | { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415 },
475 | { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623 },
476 | { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175 },
477 | { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674 },
478 | { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951 },
479 | ]
480 |
481 | [[package]]
482 | name = "pydantic-settings"
483 | version = "2.8.1"
484 | source = { registry = "https://pypi.org/simple" }
485 | dependencies = [
486 | { name = "pydantic" },
487 | { name = "python-dotenv" },
488 | ]
489 | sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 }
490 | wheels = [
491 | { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 },
492 | ]
493 |
494 | [[package]]
495 | name = "pygments"
496 | version = "2.19.1"
497 | source = { registry = "https://pypi.org/simple" }
498 | sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 }
499 | wheels = [
500 | { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
501 | ]
502 |
503 | [[package]]
504 | name = "python-dateutil"
505 | version = "2.9.0.post0"
506 | source = { registry = "https://pypi.org/simple" }
507 | dependencies = [
508 | { name = "six" },
509 | ]
510 | sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 }
511 | wheels = [
512 | { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 },
513 | ]
514 |
515 | [[package]]
516 | name = "python-dotenv"
517 | version = "1.1.0"
518 | source = { registry = "https://pypi.org/simple" }
519 | sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 }
520 | wheels = [
521 | { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 },
522 | ]
523 |
524 | [[package]]
525 | name = "pytz"
526 | version = "2025.2"
527 | source = { registry = "https://pypi.org/simple" }
528 | sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 }
529 | wheels = [
530 | { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 },
531 | ]
532 |
533 | [[package]]
534 | name = "requests"
535 | version = "2.32.3"
536 | source = { registry = "https://pypi.org/simple" }
537 | dependencies = [
538 | { name = "certifi" },
539 | { name = "charset-normalizer" },
540 | { name = "idna" },
541 | { name = "urllib3" },
542 | ]
543 | sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
544 | wheels = [
545 | { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
546 | ]
547 |
548 | [[package]]
549 | name = "rich"
550 | version = "14.0.0"
551 | source = { registry = "https://pypi.org/simple" }
552 | dependencies = [
553 | { name = "markdown-it-py" },
554 | { name = "pygments" },
555 | ]
556 | sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 }
557 | wheels = [
558 | { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 },
559 | ]
560 |
561 | [[package]]
562 | name = "shellingham"
563 | version = "1.5.4"
564 | source = { registry = "https://pypi.org/simple" }
565 | sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 }
566 | wheels = [
567 | { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 },
568 | ]
569 |
570 | [[package]]
571 | name = "simplejson"
572 | version = "3.20.1"
573 | source = { registry = "https://pypi.org/simple" }
574 | sdist = { url = "https://files.pythonhosted.org/packages/af/92/51b417685abd96b31308b61b9acce7ec50d8e1de8fbc39a7fd4962c60689/simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d", size = 85591 }
575 | wheels = [
576 | { url = "https://files.pythonhosted.org/packages/76/59/74bc90d1c051bc2432c96b34bd4e8036875ab58b4fcbe4d6a5a76985f853/simplejson-3.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca", size = 92132 },
577 | { url = "https://files.pythonhosted.org/packages/71/c7/1970916e0c51794fff89f76da2f632aaf0b259b87753c88a8c409623d3e1/simplejson-3.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0", size = 74956 },
578 | { url = "https://files.pythonhosted.org/packages/c8/0d/98cc5909180463f1d75fac7180de62d4cdb4e82c4fef276b9e591979372c/simplejson-3.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f", size = 74772 },
579 | { url = "https://files.pythonhosted.org/packages/e1/94/a30a5211a90d67725a3e8fcc1c788189f2ae2ed2b96b63ed15d0b7f5d6bb/simplejson-3.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10", size = 143575 },
580 | { url = "https://files.pythonhosted.org/packages/ee/08/cdb6821f1058eb5db46d252de69ff7e6c53f05f1bae6368fe20d5b51d37e/simplejson-3.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38", size = 153241 },
581 | { url = "https://files.pythonhosted.org/packages/4c/2d/ca3caeea0bdc5efc5503d5f57a2dfb56804898fb196dfada121323ee0ccb/simplejson-3.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd", size = 141500 },
582 | { url = "https://files.pythonhosted.org/packages/e1/33/d3e0779d5c58245e7370c98eb969275af6b7a4a5aec3b97cbf85f09ad328/simplejson-3.20.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c", size = 144757 },
583 | { url = "https://files.pythonhosted.org/packages/54/53/2d93128bb55861b2fa36c5944f38da51a0bc6d83e513afc6f7838440dd15/simplejson-3.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79", size = 144409 },
584 | { url = "https://files.pythonhosted.org/packages/99/4c/dac310a98f897ad3435b4bdc836d92e78f09e38c5dbf28211ed21dc59fa2/simplejson-3.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e", size = 146082 },
585 | { url = "https://files.pythonhosted.org/packages/ee/22/d7ba958cfed39827335b82656b1c46f89678faecda9a7677b47e87b48ee6/simplejson-3.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8", size = 154339 },
586 | { url = "https://files.pythonhosted.org/packages/b8/c8/b072b741129406a7086a0799c6f5d13096231bf35fdd87a0cffa789687fc/simplejson-3.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749", size = 147915 },
587 | { url = "https://files.pythonhosted.org/packages/6c/46/8347e61e9cf3db5342a42f7fd30a81b4f5cf85977f916852d7674a540907/simplejson-3.20.1-cp311-cp311-win32.whl", hash = "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43", size = 73972 },
588 | { url = "https://files.pythonhosted.org/packages/01/85/b52f24859237b4e9d523d5655796d911ba3d46e242eb1959c45b6af5aedd/simplejson-3.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766", size = 75595 },
589 | { url = "https://files.pythonhosted.org/packages/8d/eb/34c16a1ac9ba265d024dc977ad84e1659d931c0a700967c3e59a98ed7514/simplejson-3.20.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23", size = 93100 },
590 | { url = "https://files.pythonhosted.org/packages/41/fc/2c2c007d135894971e6814e7c0806936e5bade28f8db4dd7e2a58b50debd/simplejson-3.20.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6", size = 75464 },
591 | { url = "https://files.pythonhosted.org/packages/0f/05/2b5ecb33b776c34bb5cace5de5d7669f9b60e3ca13c113037b2ca86edfbd/simplejson-3.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832", size = 75112 },
592 | { url = "https://files.pythonhosted.org/packages/fe/36/1f3609a2792f06cd4b71030485f78e91eb09cfd57bebf3116bf2980a8bac/simplejson-3.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb", size = 150182 },
593 | { url = "https://files.pythonhosted.org/packages/2f/b0/053fbda38b8b602a77a4f7829def1b4f316cd8deb5440a6d3ee90790d2a4/simplejson-3.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595", size = 158363 },
594 | { url = "https://files.pythonhosted.org/packages/d1/4b/2eb84ae867539a80822e92f9be4a7200dffba609275faf99b24141839110/simplejson-3.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf", size = 148415 },
595 | { url = "https://files.pythonhosted.org/packages/e0/bd/400b0bd372a5666addf2540c7358bfc3841b9ce5cdbc5cc4ad2f61627ad8/simplejson-3.20.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49", size = 152213 },
596 | { url = "https://files.pythonhosted.org/packages/50/12/143f447bf6a827ee9472693768dc1a5eb96154f8feb140a88ce6973a3cfa/simplejson-3.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453", size = 150048 },
597 | { url = "https://files.pythonhosted.org/packages/5e/ea/dd9b3e8e8ed710a66f24a22c16a907c9b539b6f5f45fd8586bd5c231444e/simplejson-3.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc", size = 151668 },
598 | { url = "https://files.pythonhosted.org/packages/99/af/ee52a8045426a0c5b89d755a5a70cc821815ef3c333b56fbcad33c4435c0/simplejson-3.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f", size = 158840 },
599 | { url = "https://files.pythonhosted.org/packages/68/db/ab32869acea6b5de7d75fa0dac07a112ded795d41eaa7e66c7813b17be95/simplejson-3.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3", size = 154212 },
600 | { url = "https://files.pythonhosted.org/packages/fa/7a/e3132d454977d75a3bf9a6d541d730f76462ebf42a96fea2621498166f41/simplejson-3.20.1-cp312-cp312-win32.whl", hash = "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea", size = 74101 },
601 | { url = "https://files.pythonhosted.org/packages/bc/5d/4e243e937fa3560107c69f6f7c2eed8589163f5ed14324e864871daa2dd9/simplejson-3.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17", size = 75736 },
602 | { url = "https://files.pythonhosted.org/packages/c4/03/0f453a27877cb5a5fff16a975925f4119102cc8552f52536b9a98ef0431e/simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3", size = 93109 },
603 | { url = "https://files.pythonhosted.org/packages/74/1f/a729f4026850cabeaff23e134646c3f455e86925d2533463420635ae54de/simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29", size = 75475 },
604 | { url = "https://files.pythonhosted.org/packages/e2/14/50a2713fee8ff1f8d655b1a14f4a0f1c0c7246768a1b3b3d12964a4ed5aa/simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb", size = 75112 },
605 | { url = "https://files.pythonhosted.org/packages/45/86/ea9835abb646755140e2d482edc9bc1e91997ed19a59fd77ae4c6a0facea/simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1", size = 150245 },
606 | { url = "https://files.pythonhosted.org/packages/12/b4/53084809faede45da829fe571c65fbda8479d2a5b9c633f46b74124d56f5/simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0", size = 158465 },
607 | { url = "https://files.pythonhosted.org/packages/a9/7d/d56579468d1660b3841e1f21c14490d103e33cf911886b22652d6e9683ec/simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078", size = 148514 },
608 | { url = "https://files.pythonhosted.org/packages/19/e3/874b1cca3d3897b486d3afdccc475eb3a09815bf1015b01cf7fcb52a55f0/simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6", size = 152262 },
609 | { url = "https://files.pythonhosted.org/packages/32/84/f0fdb3625292d945c2bd13a814584603aebdb38cfbe5fe9be6b46fe598c4/simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0", size = 150164 },
610 | { url = "https://files.pythonhosted.org/packages/95/51/6d625247224f01eaaeabace9aec75ac5603a42f8ebcce02c486fbda8b428/simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e", size = 151795 },
611 | { url = "https://files.pythonhosted.org/packages/7f/d9/bb921df6b35be8412f519e58e86d1060fddf3ad401b783e4862e0a74c4c1/simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112", size = 159027 },
612 | { url = "https://files.pythonhosted.org/packages/03/c5/5950605e4ad023a6621cf4c931b29fd3d2a9c1f36be937230bfc83d7271d/simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a", size = 154380 },
613 | { url = "https://files.pythonhosted.org/packages/66/ad/b74149557c5ec1e4e4d55758bda426f5d2ec0123cd01a53ae63b8de51fa3/simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87", size = 74102 },
614 | { url = "https://files.pythonhosted.org/packages/db/a9/25282fdd24493e1022f30b7f5cdf804255c007218b2bfaa655bd7ad34b2d/simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc", size = 75736 },
615 | { url = "https://files.pythonhosted.org/packages/4b/30/00f02a0a921556dd5a6db1ef2926a1bc7a8bbbfb1c49cfed68a275b8ab2b/simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697", size = 57121 },
616 | ]
617 |
618 | [[package]]
619 | name = "six"
620 | version = "1.17.0"
621 | source = { registry = "https://pypi.org/simple" }
622 | sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 }
623 | wheels = [
624 | { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
625 | ]
626 |
627 | [[package]]
628 | name = "sniffio"
629 | version = "1.3.1"
630 | source = { registry = "https://pypi.org/simple" }
631 | sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
632 | wheels = [
633 | { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
634 | ]
635 |
636 | [[package]]
637 | name = "soupsieve"
638 | version = "2.6"
639 | source = { registry = "https://pypi.org/simple" }
640 | sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 }
641 | wheels = [
642 | { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 },
643 | ]
644 |
645 | [[package]]
646 | name = "sse-starlette"
647 | version = "2.2.1"
648 | source = { registry = "https://pypi.org/simple" }
649 | dependencies = [
650 | { name = "anyio" },
651 | { name = "starlette" },
652 | ]
653 | sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376 }
654 | wheels = [
655 | { url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120 },
656 | ]
657 |
658 | [[package]]
659 | name = "starlette"
660 | version = "0.46.2"
661 | source = { registry = "https://pypi.org/simple" }
662 | dependencies = [
663 | { name = "anyio" },
664 | ]
665 | sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 }
666 | wheels = [
667 | { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 },
668 | ]
669 |
670 | [[package]]
671 | name = "tqdm"
672 | version = "4.67.1"
673 | source = { registry = "https://pypi.org/simple" }
674 | dependencies = [
675 | { name = "colorama", marker = "sys_platform == 'win32'" },
676 | ]
677 | sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 }
678 | wheels = [
679 | { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 },
680 | ]
681 |
682 | [[package]]
683 | name = "tushare"
684 | version = "1.4.21"
685 | source = { registry = "https://pypi.org/simple" }
686 | dependencies = [
687 | { name = "bs4" },
688 | { name = "lxml" },
689 | { name = "pandas" },
690 | { name = "requests" },
691 | { name = "simplejson" },
692 | { name = "tqdm" },
693 | { name = "websocket-client" },
694 | ]
695 | sdist = { url = "https://files.pythonhosted.org/packages/da/3e/c1818c73861273f7f75b059c8c0f54741387b279d34bdd1a2491ab94e728/tushare-1.4.21.tar.gz", hash = "sha256:3c08bf2596d7cf6e002bb4f5b56f00916622928b8881d22dbb942009a3cf6fee", size = 127673 }
696 | wheels = [
697 | { url = "https://files.pythonhosted.org/packages/38/33/0b4ed09bff3b69887c2545f1c587420c89685d36c377095e465cc000759b/tushare-1.4.21-py3-none-any.whl", hash = "sha256:2014c3866d8cee36da7325efff9b174dd458a1896aac39225944ab0e40593f7c", size = 142762 },
698 | ]
699 |
700 | [[package]]
701 | name = "typer"
702 | version = "0.15.2"
703 | source = { registry = "https://pypi.org/simple" }
704 | dependencies = [
705 | { name = "click" },
706 | { name = "rich" },
707 | { name = "shellingham" },
708 | { name = "typing-extensions" },
709 | ]
710 | sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 }
711 | wheels = [
712 | { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 },
713 | ]
714 |
715 | [[package]]
716 | name = "typing-extensions"
717 | version = "4.13.2"
718 | source = { registry = "https://pypi.org/simple" }
719 | sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 }
720 | wheels = [
721 | { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 },
722 | ]
723 |
724 | [[package]]
725 | name = "typing-inspection"
726 | version = "0.4.0"
727 | source = { registry = "https://pypi.org/simple" }
728 | dependencies = [
729 | { name = "typing-extensions" },
730 | ]
731 | sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 }
732 | wheels = [
733 | { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 },
734 | ]
735 |
736 | [[package]]
737 | name = "tzdata"
738 | version = "2025.2"
739 | source = { registry = "https://pypi.org/simple" }
740 | sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 }
741 | wheels = [
742 | { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 },
743 | ]
744 |
745 | [[package]]
746 | name = "urllib3"
747 | version = "2.4.0"
748 | source = { registry = "https://pypi.org/simple" }
749 | sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 }
750 | wheels = [
751 | { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 },
752 | ]
753 |
754 | [[package]]
755 | name = "uvicorn"
756 | version = "0.34.1"
757 | source = { registry = "https://pypi.org/simple" }
758 | dependencies = [
759 | { name = "click" },
760 | { name = "h11" },
761 | ]
762 | sdist = { url = "https://files.pythonhosted.org/packages/86/37/dd92f1f9cedb5eaf74d9999044306e06abe65344ff197864175dbbd91871/uvicorn-0.34.1.tar.gz", hash = "sha256:af981725fc4b7ffc5cb3b0e9eda6258a90c4b52cb2a83ce567ae0a7ae1757afc", size = 76755 }
763 | wheels = [
764 | { url = "https://files.pythonhosted.org/packages/5f/38/a5801450940a858c102a7ad9e6150146a25406a119851c993148d56ab041/uvicorn-0.34.1-py3-none-any.whl", hash = "sha256:984c3a8c7ca18ebaad15995ee7401179212c59521e67bfc390c07fa2b8d2e065", size = 62404 },
765 | ]
766 |
767 | [[package]]
768 | name = "websocket-client"
769 | version = "1.8.0"
770 | source = { registry = "https://pypi.org/simple" }
771 | sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648 }
772 | wheels = [
773 | { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826 },
774 | ]
775 |
--------------------------------------------------------------------------------