lidb 1.1.10__tar.gz → 2.0.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of lidb might be problematic. Click here for more details.

Files changed (41) hide show
  1. lidb-2.0.5/PKG-INFO +282 -0
  2. lidb-2.0.5/README.md +262 -0
  3. {lidb-1.1.10 → lidb-2.0.5}/lidb/__init__.py +4 -3
  4. lidb-2.0.5/lidb/dataset.py +614 -0
  5. lidb-2.0.5/lidb/decorator.py +50 -0
  6. {lidb-1.1.10 → lidb-2.0.5}/lidb/init.py +5 -2
  7. {lidb-1.1.10 → lidb-2.0.5}/lidb/parse.py +4 -0
  8. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/__init__.py +8 -6
  9. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/expr.py +63 -0
  10. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/lazy.py +4 -20
  11. lidb-2.0.5/lidb/qdf/lazy2.py +161 -0
  12. lidb-2.0.5/lidb/qdf/qdf.py +163 -0
  13. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/udf/d_udf.py +4 -4
  14. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/udf/itd_udf.py +4 -4
  15. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/udf/ts_udf.py +4 -4
  16. {lidb-1.1.10 → lidb-2.0.5}/lidb/table.py +25 -16
  17. lidb-2.0.5/lidb.egg-info/PKG-INFO +282 -0
  18. {lidb-1.1.10 → lidb-2.0.5}/lidb.egg-info/SOURCES.txt +7 -1
  19. {lidb-1.1.10 → lidb-2.0.5}/lidb.egg-info/requires.txt +4 -2
  20. {lidb-1.1.10 → lidb-2.0.5}/pyproject.toml +5 -3
  21. lidb-2.0.5/tests/test_ds.py +72 -0
  22. lidb-2.0.5/tests/test_expr.py +85 -0
  23. lidb-2.0.5/tests/test_ldf.py +55 -0
  24. lidb-2.0.5/tests/test_zoo.py +10 -0
  25. lidb-1.1.10/PKG-INFO +0 -17
  26. lidb-1.1.10/README.md +0 -0
  27. lidb-1.1.10/lidb/dataset.py +0 -310
  28. lidb-1.1.10/lidb/qdf/qdf.py +0 -189
  29. lidb-1.1.10/lidb.egg-info/PKG-INFO +0 -17
  30. {lidb-1.1.10 → lidb-2.0.5}/lidb/database.py +0 -0
  31. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/errors.py +0 -0
  32. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/udf/__init__.py +0 -0
  33. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/udf/base_udf.py +0 -0
  34. {lidb-1.1.10 → lidb-2.0.5}/lidb/qdf/udf/cs_udf.py +0 -0
  35. {lidb-1.1.10 → lidb-2.0.5}/lidb/svc/__init__.py +0 -0
  36. {lidb-1.1.10 → lidb-2.0.5}/lidb/svc/data.py +0 -0
  37. {lidb-1.1.10 → lidb-2.0.5}/lidb.egg-info/dependency_links.txt +0 -0
  38. {lidb-1.1.10 → lidb-2.0.5}/lidb.egg-info/top_level.txt +0 -0
  39. {lidb-1.1.10 → lidb-2.0.5}/setup.cfg +0 -0
  40. {lidb-1.1.10 → lidb-2.0.5}/tests/test_conf.py +0 -0
  41. {lidb-1.1.10 → lidb-2.0.5}/tests/test_parse.py +0 -0
lidb-2.0.5/PKG-INFO ADDED
@@ -0,0 +1,282 @@
1
+ Metadata-Version: 2.4
2
+ Name: lidb
3
+ Version: 2.0.5
4
+ Summary: Light database for quantor
5
+ Requires-Python: >=3.12
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: dynaconf>=3.2.11
8
+ Requires-Dist: polars>=1.31.0
9
+ Requires-Dist: sqlparse>=0.5.3
10
+ Requires-Dist: logair>=1.0.8
11
+ Requires-Dist: clickhouse-df>=0.1.5
12
+ Requires-Dist: connectorx>=0.4.3
13
+ Requires-Dist: pymysql>=1.1.2
14
+ Requires-Dist: xcals>=0.0.4
15
+ Requires-Dist: ygo>=1.2.9
16
+ Requires-Dist: lark>=1.3.1
17
+ Requires-Dist: numpy>=2.3.1
18
+ Requires-Dist: tqdm>=4.67.1
19
+ Requires-Dist: varname>=0.15.1
20
+
21
+ ## lidb
22
+
23
+ ### 项目简介
24
+ lidb 是一个基于 Polars 的数据管理和分析库,专为金融量化研究设计。它提供了高效的数据存储、查询和表达式计算功能,支持多种时间序列和横截面数据分析操作。
25
+
26
+ ### 功能特性
27
+ - **多数据源支持**: 本地 Parquet 存储、MySQL、ClickHouse 等数据库连接
28
+ - **高效数据存储**: 基于 Parquet 格式的分区存储机制
29
+ - **SQL 查询接口**: 支持标准 SQL 语法进行数据查询
30
+ - **表达式计算引擎**: 提供丰富的 UDF 函数库,包括时间序列、横截面、维度等分析函数
31
+ - **数据集管理**: 自动化数据补全、历史数据加载和 PIT(Point-in-Time)数据处理
32
+ - **数据服务**: 异步加载数据,用于数据密集型任务的数据加载(如大量标的的高频数据)
33
+
34
+ ### 安装
35
+ ```bash
36
+ pip install -U lidb
37
+ ```
38
+
39
+ ### 快速开始
40
+
41
+ #### 基础数据操作
42
+ ```python
43
+ import lidb
44
+ import polars as pl
45
+
46
+ df = pl.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
47
+
48
+ # 写入数据
49
+ lidb.put(df, "my_table")
50
+
51
+ # sql 查询
52
+ res = lidb.sql("select * from my_table;")
53
+ ```
54
+
55
+ #### 数据集使用
56
+ ```python
57
+ import lidb
58
+ from lidb import Dataset, dataset
59
+ import polars as pl
60
+
61
+ # 定义一个tick级别的高频数据集: 高频成交量
62
+ def hft_vol(date: str, num: int) -> pl.DataFrame | pl.LazyFrame | None:
63
+ # 假设上游tick行情表在clickhouse
64
+ quote_query = f"select * from quote where date = '{date}'"
65
+ quote = lidb.read_ck(quote_query, db_conf="databases.ck")
66
+ # 特征计算: 比如过去20根tick的成交量总和, 使用表达式引擎计算
67
+ return lidb.from_polars(quote).sql(f"itd_sum(volume, {num}) as vol_s20")
68
+
69
+ ds_hft_vol = Dataset(fn=hft_vol,
70
+ tb="path/to/hft_vol",
71
+ partitions=["num"], # 默认值 None, 会自动识别 num
72
+ update_time="", # 实时更新
73
+ is_hft=True, # 根据asset_id进行分区
74
+ )(num=20)
75
+
76
+ # 获取历史数据
77
+ history_data = ds_hft_vol.get_history(["2023-01-01", "2023-01-02", ...])
78
+
79
+ # 更加便捷的创建数据集方式:通过dataset装饰器
80
+ @dataset()
81
+ def hft_vol(date: str, num: int) -> pl.DataFrame | pl.LazyFrame | None:
82
+ # 假设上游tick行情表在clickhouse
83
+ quote_query = f"select * from quote where date = '{date}'"
84
+ quote = lidb.read_ck(quote_query, db_conf="databases.ck")
85
+ # 特征计算: 比如过去20根tick的成交量总和, 使用表达式引擎计算
86
+ return lidb.from_polars(quote).sql(f"itd_sum(volume, {num}) as vol_s20")
87
+
88
+ hft_vol.get_value("2025-05-15")
89
+ ```
90
+
91
+ #### `Table`
92
+ 除了 `Dataset` 类用于管理复杂的、可分区的历史数据集之外,lidb 还提供了一个更轻量级的 `Table` 类。
93
+ 它适用于那些不需要复杂分区逻辑,且通常以单一文件形式存储的表格数据。`Table` 类同样支持基于更新时间的自动化数据管理和加载。
94
+ ##### 特性
95
+ - **简化数据管理**: 专为单表数据设计,无需复杂的分区结构。
96
+ - **灵活更新策略**:
97
+ - **全量更新(`TableMode.F`)**: 每次更新时覆盖旧数据,仅保留最新的数据文件(0.parquet)。
98
+ - **增量更新(`TableMode.I`)**: 每次更新时生成一个新的带时间戳的文件(<uuid>.parquet),保留历史版本。
99
+ - **自动更新检查**: 根据设定的 `update_time` 和文件修改时间,自动判断是否需要更新数据。
100
+
101
+ ##### 使用示例
102
+ ```python
103
+ from lidb import Table, TableMode
104
+ import polars as pl
105
+
106
+ # 1. 定义一个数据获取函数
107
+ def fetch_latest_stock_list() -> pl.DataFrame:
108
+ # 模拟从某个API或数据库获取最新的股票列表
109
+ import time
110
+ time.sleep(1) # 模拟网络延迟
111
+ return pl.DataFrame({
112
+ "symbol": ["AAPL", "GOOGL", "MSFT"],
113
+ "name": ["Apple Inc.", "Alphabet Inc.", "Microsoft Corp."],
114
+ "sector": ["Technology", "Communication Services", "Technology"]
115
+ })
116
+
117
+ # 2. 创建 Table 实例
118
+ # 假设此表每天上午9点更新
119
+ stock_list_table = Table(
120
+ fn=fetch_latest_stock_list,
121
+ tb="stock_list",
122
+ update_time="09:00:00",
123
+ mode=TableMode.F # 使用全量更新模式
124
+ )
125
+
126
+ # 3. 更新数据 (可选,get_value 会自动检查并提示更新)
127
+ # stock_list_table.update(verbose=True)
128
+
129
+ # 4. 获取数据
130
+ # 如果数据过期,get_value 会打印警告并退出,提示先调用 update()
131
+ df = stock_list_table.get_value(date="2023-10-27")
132
+ print(df)
133
+ ```
134
+
135
+
136
+ #### 表达式计算
137
+ ```python
138
+ import lidb
139
+
140
+ date = "2025-05-15"
141
+ quote_query = f"select * from quote where date = '{date}'"
142
+ quote = lidb.read_ck(quote_query, db_conf="databases.ck")
143
+
144
+ qdf = lidb.from_polars(quote)
145
+
146
+ # 使用 QDF 进行表达式计算
147
+ res = qdf.sql(
148
+ "ts_mean(close, 5) as c_m5",
149
+ "cs_rank(volume) as vol_rank",
150
+ )
151
+ ```
152
+
153
+ #### 数据服务
154
+ lidb 提供了一个名为 `D` 的全局 `DataService` 实例。
155
+ 用于在后台线程中预加载数据并缓存,从而提升数据密集型任务的性能。
156
+ 这对于需要提前准备大量数据的应用非常有用,例如回测系统或实时数据处理流水线。
157
+ ##### 启动数据服务
158
+ 你可以通过调用 `D.start()` 方法来启动数据服务,指定一个数据加载函数、需要加载的键列表以及迭代配置。
159
+ ```python
160
+ from lidb import D
161
+ import polars as pl
162
+
163
+ # 定义一个模拟的数据加载函数
164
+ def mock_data_loader(key: str, iterables: list[str]) -> pl.DataFrame:
165
+ # 模拟耗时操作
166
+ import time
167
+ time.sleep(1)
168
+
169
+ # 返回简单的 DataFrame 示例
170
+ return pl.DataFrame({
171
+ "key": [key],
172
+ "value": [sum(len(s) for s in iterables)]
173
+ })
174
+
175
+ # 启动数据服务
176
+ D.start(
177
+ fn=mock_data_loader,
178
+ keys=["2023-01-01", "2023-01-02", "2023-01-03"],
179
+ iter_conf={"data_source_a": ["a", "b"], "data_source_b": ["x", "y"]},
180
+ max_cache_size=3
181
+ )
182
+ ```
183
+ ##### 消费数据
184
+ 一旦数据服务启动,你就可以通过 `D.do()` 来消费已加载的数据。
185
+ 这个方法接受一个消费者函数作为参数,每当有新数据可用时就会被调用。
186
+ ```python
187
+ def data_consumer(data_package: dict):
188
+ print(f"Consumed data for key: {data_package['key']}")
189
+ for name, df in data_package['data'].items():
190
+ print(f" Data from {name}:")
191
+ print(df)
192
+
193
+ # 开始消费数据
194
+ D.do(consumer=data_consumer, wait_secs=1)
195
+ ```
196
+ ##### 停止数据服务
197
+ 当你需要停止数据服务时,你可以调用 `D.stop()` 方法。
198
+ ##### 完整示例
199
+ 以下是一个完整的示例,演示了如何使用 D 进行异步数据加载与消费:
200
+ ```python
201
+ import lidb
202
+ from lidb import D
203
+ import polars as pl
204
+ import time
205
+
206
+ def fetch_market_data(key: str, iterables: list[str]) -> pl.DataFrame:
207
+ # 模拟网络请求或复杂计算
208
+ time.sleep(0.5)
209
+ return pl.DataFrame({
210
+ "date": [key],
211
+ "symbol_count": [len(iterables)],
212
+ "total_volume": [sum(ord(c) for s in iterables for c in s)] # Dummy volume
213
+ })
214
+
215
+ # 启动服务
216
+ D.start(
217
+ fn=fetch_market_data,
218
+ keys=["2023-01-01", "2023-01-02", "2023-01-03"],
219
+ iter_conf={"symbols": ["AAPL", "GOOGL", "MSFT"]},
220
+ max_cache_size=2
221
+ )
222
+
223
+ # 消费者函数
224
+ def handle_data(data_package: dict):
225
+ print(f"\nReceived data for {data_package['key']}:")
226
+ print(data_package['data']['market_data'])
227
+
228
+ # 启动消费过程
229
+ try:
230
+ D.do(consumer=handle_data, wait_secs=1)
231
+ except KeyboardInterrupt:
232
+ print("\nShutting down data service...")
233
+ finally:
234
+ D.stop()
235
+ ```
236
+
237
+ ### 核心模块
238
+
239
+ #### 数据库操作(`database.py`)
240
+ - `put`: 将 `polars.DataFrame` 写入指定表
241
+ - `sql`: 执行 `SQL` 查询
242
+ - `has`: 检查表是否存在
243
+ - `read_mysql`,`write_mysql`: mysql 数据读写
244
+ - `read_ck`: clickhouse 数据读取
245
+
246
+ #### 数据服务(`svc/data.py`)
247
+ - `DataService`: 数据服务管理
248
+ - `D`: `DataService` 全局实例
249
+
250
+ #### 数据集管理(`dataset.py`)
251
+ - `Dataset`: 数据集定义和管理
252
+ - `DataLoader`: 数据加载器
253
+
254
+ #### 表达式计算(`qdf/`)
255
+ - `QDF`: 表达式数据库
256
+ - `Expr`: 表达式解析器
257
+ - `UDF 函数库`:
258
+ - `base_udf`: 基础运算函数
259
+ - `ts_udf`: 时间序列函数
260
+ - `cs_udf`: 横截面函数
261
+ - `d_udf`: 日期维度函数
262
+ - `itd_udf`: 日内函数
263
+
264
+ #### 配置管理(`init.py`)
265
+ - 自动创建配置文件
266
+ - 支持自定义数据存储路径
267
+ - `polars` 线程配置
268
+ #### 配置说明
269
+ 首次运行会在 `~/.config/lidb/settings.toml` 创建配置文件:
270
+ ```toml
271
+ [GLOBAL]
272
+ path = "~/lidb" # 数据存储路径
273
+
274
+ [POLARS]
275
+ max_threads = 32 # Polars 最大线程数
276
+ ```
277
+
278
+ ### 许可证
279
+ 本项目采用 MIT 许可证, 请在项目根目录下查看
280
+
281
+ ### 联系方式
282
+ Zhangyundi - yundi.xxii@outlook.com
lidb-2.0.5/README.md ADDED
@@ -0,0 +1,262 @@
1
+ ## lidb
2
+
3
+ ### 项目简介
4
+ lidb 是一个基于 Polars 的数据管理和分析库,专为金融量化研究设计。它提供了高效的数据存储、查询和表达式计算功能,支持多种时间序列和横截面数据分析操作。
5
+
6
+ ### 功能特性
7
+ - **多数据源支持**: 本地 Parquet 存储、MySQL、ClickHouse 等数据库连接
8
+ - **高效数据存储**: 基于 Parquet 格式的分区存储机制
9
+ - **SQL 查询接口**: 支持标准 SQL 语法进行数据查询
10
+ - **表达式计算引擎**: 提供丰富的 UDF 函数库,包括时间序列、横截面、维度等分析函数
11
+ - **数据集管理**: 自动化数据补全、历史数据加载和 PIT(Point-in-Time)数据处理
12
+ - **数据服务**: 异步加载数据,用于数据密集型任务的数据加载(如大量标的的高频数据)
13
+
14
+ ### 安装
15
+ ```bash
16
+ pip install -U lidb
17
+ ```
18
+
19
+ ### 快速开始
20
+
21
+ #### 基础数据操作
22
+ ```python
23
+ import lidb
24
+ import polars as pl
25
+
26
+ df = pl.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
27
+
28
+ # 写入数据
29
+ lidb.put(df, "my_table")
30
+
31
+ # sql 查询
32
+ res = lidb.sql("select * from my_table;")
33
+ ```
34
+
35
+ #### 数据集使用
36
+ ```python
37
+ import lidb
38
+ from lidb import Dataset, dataset
39
+ import polars as pl
40
+
41
+ # 定义一个tick级别的高频数据集: 高频成交量
42
+ def hft_vol(date: str, num: int) -> pl.DataFrame | pl.LazyFrame | None:
43
+ # 假设上游tick行情表在clickhouse
44
+ quote_query = f"select * from quote where date = '{date}'"
45
+ quote = lidb.read_ck(quote_query, db_conf="databases.ck")
46
+ # 特征计算: 比如过去20根tick的成交量总和, 使用表达式引擎计算
47
+ return lidb.from_polars(quote).sql(f"itd_sum(volume, {num}) as vol_s20")
48
+
49
+ ds_hft_vol = Dataset(fn=hft_vol,
50
+ tb="path/to/hft_vol",
51
+ partitions=["num"], # 默认值 None, 会自动识别 num
52
+ update_time="", # 实时更新
53
+ is_hft=True, # 根据asset_id进行分区
54
+ )(num=20)
55
+
56
+ # 获取历史数据
57
+ history_data = ds_hft_vol.get_history(["2023-01-01", "2023-01-02", ...])
58
+
59
+ # 更加便捷的创建数据集方式:通过dataset装饰器
60
+ @dataset()
61
+ def hft_vol(date: str, num: int) -> pl.DataFrame | pl.LazyFrame | None:
62
+ # 假设上游tick行情表在clickhouse
63
+ quote_query = f"select * from quote where date = '{date}'"
64
+ quote = lidb.read_ck(quote_query, db_conf="databases.ck")
65
+ # 特征计算: 比如过去20根tick的成交量总和, 使用表达式引擎计算
66
+ return lidb.from_polars(quote).sql(f"itd_sum(volume, {num}) as vol_s20")
67
+
68
+ hft_vol.get_value("2025-05-15")
69
+ ```
70
+
71
+ #### `Table`
72
+ 除了 `Dataset` 类用于管理复杂的、可分区的历史数据集之外,lidb 还提供了一个更轻量级的 `Table` 类。
73
+ 它适用于那些不需要复杂分区逻辑,且通常以单一文件形式存储的表格数据。`Table` 类同样支持基于更新时间的自动化数据管理和加载。
74
+ ##### 特性
75
+ - **简化数据管理**: 专为单表数据设计,无需复杂的分区结构。
76
+ - **灵活更新策略**:
77
+ - **全量更新(`TableMode.F`)**: 每次更新时覆盖旧数据,仅保留最新的数据文件(0.parquet)。
78
+ - **增量更新(`TableMode.I`)**: 每次更新时生成一个新的带时间戳的文件(<uuid>.parquet),保留历史版本。
79
+ - **自动更新检查**: 根据设定的 `update_time` 和文件修改时间,自动判断是否需要更新数据。
80
+
81
+ ##### 使用示例
82
+ ```python
83
+ from lidb import Table, TableMode
84
+ import polars as pl
85
+
86
+ # 1. 定义一个数据获取函数
87
+ def fetch_latest_stock_list() -> pl.DataFrame:
88
+ # 模拟从某个API或数据库获取最新的股票列表
89
+ import time
90
+ time.sleep(1) # 模拟网络延迟
91
+ return pl.DataFrame({
92
+ "symbol": ["AAPL", "GOOGL", "MSFT"],
93
+ "name": ["Apple Inc.", "Alphabet Inc.", "Microsoft Corp."],
94
+ "sector": ["Technology", "Communication Services", "Technology"]
95
+ })
96
+
97
+ # 2. 创建 Table 实例
98
+ # 假设此表每天上午9点更新
99
+ stock_list_table = Table(
100
+ fn=fetch_latest_stock_list,
101
+ tb="stock_list",
102
+ update_time="09:00:00",
103
+ mode=TableMode.F # 使用全量更新模式
104
+ )
105
+
106
+ # 3. 更新数据 (可选,get_value 会自动检查并提示更新)
107
+ # stock_list_table.update(verbose=True)
108
+
109
+ # 4. 获取数据
110
+ # 如果数据过期,get_value 会打印警告并退出,提示先调用 update()
111
+ df = stock_list_table.get_value(date="2023-10-27")
112
+ print(df)
113
+ ```
114
+
115
+
116
+ #### 表达式计算
117
+ ```python
118
+ import lidb
119
+
120
+ date = "2025-05-15"
121
+ quote_query = f"select * from quote where date = '{date}'"
122
+ quote = lidb.read_ck(quote_query, db_conf="databases.ck")
123
+
124
+ qdf = lidb.from_polars(quote)
125
+
126
+ # 使用 QDF 进行表达式计算
127
+ res = qdf.sql(
128
+ "ts_mean(close, 5) as c_m5",
129
+ "cs_rank(volume) as vol_rank",
130
+ )
131
+ ```
132
+
133
+ #### 数据服务
134
+ lidb 提供了一个名为 `D` 的全局 `DataService` 实例。
135
+ 用于在后台线程中预加载数据并缓存,从而提升数据密集型任务的性能。
136
+ 这对于需要提前准备大量数据的应用非常有用,例如回测系统或实时数据处理流水线。
137
+ ##### 启动数据服务
138
+ 你可以通过调用 `D.start()` 方法来启动数据服务,指定一个数据加载函数、需要加载的键列表以及迭代配置。
139
+ ```python
140
+ from lidb import D
141
+ import polars as pl
142
+
143
+ # 定义一个模拟的数据加载函数
144
+ def mock_data_loader(key: str, iterables: list[str]) -> pl.DataFrame:
145
+ # 模拟耗时操作
146
+ import time
147
+ time.sleep(1)
148
+
149
+ # 返回简单的 DataFrame 示例
150
+ return pl.DataFrame({
151
+ "key": [key],
152
+ "value": [sum(len(s) for s in iterables)]
153
+ })
154
+
155
+ # 启动数据服务
156
+ D.start(
157
+ fn=mock_data_loader,
158
+ keys=["2023-01-01", "2023-01-02", "2023-01-03"],
159
+ iter_conf={"data_source_a": ["a", "b"], "data_source_b": ["x", "y"]},
160
+ max_cache_size=3
161
+ )
162
+ ```
163
+ ##### 消费数据
164
+ 一旦数据服务启动,你就可以通过 `D.do()` 来消费已加载的数据。
165
+ 这个方法接受一个消费者函数作为参数,每当有新数据可用时就会被调用。
166
+ ```python
167
+ def data_consumer(data_package: dict):
168
+ print(f"Consumed data for key: {data_package['key']}")
169
+ for name, df in data_package['data'].items():
170
+ print(f" Data from {name}:")
171
+ print(df)
172
+
173
+ # 开始消费数据
174
+ D.do(consumer=data_consumer, wait_secs=1)
175
+ ```
176
+ ##### 停止数据服务
177
+ 当你需要停止数据服务时,你可以调用 `D.stop()` 方法。
178
+ ##### 完整示例
179
+ 以下是一个完整的示例,演示了如何使用 D 进行异步数据加载与消费:
180
+ ```python
181
+ import lidb
182
+ from lidb import D
183
+ import polars as pl
184
+ import time
185
+
186
+ def fetch_market_data(key: str, iterables: list[str]) -> pl.DataFrame:
187
+ # 模拟网络请求或复杂计算
188
+ time.sleep(0.5)
189
+ return pl.DataFrame({
190
+ "date": [key],
191
+ "symbol_count": [len(iterables)],
192
+ "total_volume": [sum(ord(c) for s in iterables for c in s)] # Dummy volume
193
+ })
194
+
195
+ # 启动服务
196
+ D.start(
197
+ fn=fetch_market_data,
198
+ keys=["2023-01-01", "2023-01-02", "2023-01-03"],
199
+ iter_conf={"symbols": ["AAPL", "GOOGL", "MSFT"]},
200
+ max_cache_size=2
201
+ )
202
+
203
+ # 消费者函数
204
+ def handle_data(data_package: dict):
205
+ print(f"\nReceived data for {data_package['key']}:")
206
+ print(data_package['data']['market_data'])
207
+
208
+ # 启动消费过程
209
+ try:
210
+ D.do(consumer=handle_data, wait_secs=1)
211
+ except KeyboardInterrupt:
212
+ print("\nShutting down data service...")
213
+ finally:
214
+ D.stop()
215
+ ```
216
+
217
+ ### 核心模块
218
+
219
+ #### 数据库操作(`database.py`)
220
+ - `put`: 将 `polars.DataFrame` 写入指定表
221
+ - `sql`: 执行 `SQL` 查询
222
+ - `has`: 检查表是否存在
223
+ - `read_mysql`,`write_mysql`: mysql 数据读写
224
+ - `read_ck`: clickhouse 数据读取
225
+
226
+ #### 数据服务(`svc/data.py`)
227
+ - `DataService`: 数据服务管理
228
+ - `D`: `DataService` 全局实例
229
+
230
+ #### 数据集管理(`dataset.py`)
231
+ - `Dataset`: 数据集定义和管理
232
+ - `DataLoader`: 数据加载器
233
+
234
+ #### 表达式计算(`qdf/`)
235
+ - `QDF`: 表达式数据库
236
+ - `Expr`: 表达式解析器
237
+ - `UDF 函数库`:
238
+ - `base_udf`: 基础运算函数
239
+ - `ts_udf`: 时间序列函数
240
+ - `cs_udf`: 横截面函数
241
+ - `d_udf`: 日期维度函数
242
+ - `itd_udf`: 日内函数
243
+
244
+ #### 配置管理(`init.py`)
245
+ - 自动创建配置文件
246
+ - 支持自定义数据存储路径
247
+ - `polars` 线程配置
248
+ #### 配置说明
249
+ 首次运行会在 `~/.config/lidb/settings.toml` 创建配置文件:
250
+ ```toml
251
+ [GLOBAL]
252
+ path = "~/lidb" # 数据存储路径
253
+
254
+ [POLARS]
255
+ max_threads = 32 # Polars 最大线程数
256
+ ```
257
+
258
+ ### 许可证
259
+ 本项目采用 MIT 许可证, 请在项目根目录下查看
260
+
261
+ ### 联系方式
262
+ Zhangyundi - yundi.xxii@outlook.com
@@ -21,10 +21,11 @@ from .database import (
21
21
  )
22
22
 
23
23
  from .table import Table, TableMode
24
- from .dataset import Dataset, load_ds
25
- from .qdf import to_lazy, Expr
24
+ from .dataset import Dataset, DataLoader
25
+ from .decorator import dataset
26
+ from .qdf import from_polars, Expr
26
27
  from .svc import DataService, D
27
28
 
28
29
  from .parse import parse_hive_partition_structure
29
30
 
30
- __version__ = "1.1.10"
31
+ __version__ = "2.0.5"