hyperquant 0.1.7__tar.gz → 0.1.9__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperquant
3
- Version: 0.1.7
3
+ Version: 0.1.9
4
4
  Summary: A minimal yet hyper-efficient backtesting framework for quantitative trading
5
5
  Project-URL: Homepage, https://github.com/yourusername/hyperquant
6
6
  Project-URL: Issues, https://github.com/yourusername/hyperquant/issues
@@ -16,6 +16,7 @@ Requires-Python: >=3.9
16
16
  Requires-Dist: aiohttp>=3.11.16
17
17
  Requires-Dist: colorama>=0.4.6
18
18
  Requires-Dist: cryptography>=44.0.2
19
+ Requires-Dist: duckdb>=1.2.2
19
20
  Requires-Dist: numpy>=1.21.0
20
21
  Requires-Dist: pandas>=2.2.3
21
22
  Requires-Dist: pyecharts>=2.0.8
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hyperquant"
3
- version = "0.1.7"
3
+ version = "0.1.9"
4
4
  description = "A minimal yet hyper-efficient backtesting framework for quantitative trading"
5
5
  authors = [
6
6
  { name = "MissinA", email = "1421329142@qq.com" }
@@ -11,7 +11,8 @@ dependencies = [
11
11
  "colorama>=0.4.6",
12
12
  "aiohttp>=3.11.16",
13
13
  "cryptography>=44.0.2",
14
- "numpy>=1.21.0", # Added numpy as a new dependency
14
+ "numpy>=1.21.0", # Added numpy as a new dependency
15
+ "duckdb>=1.2.2",
15
16
  ]
16
17
  readme = "README.md"
17
18
  requires-python = ">=3.9"
@@ -0,0 +1,192 @@
1
+ from dataclasses import dataclass
2
+ import duckdb
3
+ import pandas as pd
4
+ from typing import Dict, Optional, Union
5
+ from enum import Enum
6
+ import os
7
+
8
+
9
+ # 实现retry装饰器
10
+ def restry(max_retries=3):
11
+ def decorator(func):
12
+ def wrapper(*args, **kwargs):
13
+ for attempt in range(max_retries):
14
+ try:
15
+ return func(*args, **kwargs)
16
+ except Exception as e:
17
+ if attempt < max_retries - 1:
18
+ continue
19
+ else:
20
+ raise e
21
+ return wrapper
22
+ return decorator
23
+
24
+ @dataclass
25
+ class DuckDBType():
26
+ INTEGER = 'INTEGER'
27
+ DOUBLE = 'DOUBLE'
28
+ DECIMAL = 'DECIMAL'
29
+ DECIMAL_10_2 = 'DECIMAL(10,2)'
30
+ DECIMAL_10_4 = 'DECIMAL(10,4)'
31
+ DECIMAL_10_6 = 'DECIMAL(10,6)'
32
+ TIMESTAMP = 'TIMESTAMP'
33
+ BOOLEAN = 'BOOLEAN'
34
+ VARCHAR = 'VARCHAR'
35
+ # 根据需要添加更多类型
36
+
37
+ @restry()
38
+ def save_to_duck(
39
+ path: str,
40
+ df: pd.DataFrame,
41
+ tbl_name: str,
42
+ dtype_overrides: Optional[Dict[str, str]] = None,
43
+ update_for: Optional[Union[str, list]] = None,
44
+ con: Optional[duckdb.DuckDBPyConnection] = None
45
+ ):
46
+ after_close = False
47
+ if con is None:
48
+ if os.path.dirname(path) != '':
49
+ os.makedirs(os.path.dirname(path), exist_ok=True)
50
+ if not os.path.exists(path):
51
+ duckdb.connect(path).close() # 仅创建空库
52
+ con = duckdb.connect(path)
53
+ after_close = True
54
+
55
+ # 如果提供了 update_for, 确保它是一个列表
56
+ if update_for:
57
+ update_for = [update_for] if isinstance(update_for, str) else update_for
58
+ missing = [col for col in update_for if col not in df.columns]
59
+ if missing:
60
+ raise ValueError(f"Missing update_for columns: {missing}")
61
+
62
+ # 类型推断
63
+ def infer_type(series):
64
+ if pd.api.types.is_integer_dtype(series) or pd.api.types.is_float_dtype(series):
65
+ return 'DOUBLE'
66
+ elif pd.api.types.is_bool_dtype(series):
67
+ return 'BOOLEAN'
68
+ elif pd.api.types.is_datetime64_any_dtype(series):
69
+ return 'TIMESTAMP'
70
+ else:
71
+ return 'VARCHAR'
72
+
73
+ dtype_mapping = {col: infer_type(df[col]) for col in df.columns}
74
+ if dtype_overrides:
75
+ dtype_mapping.update({k: v.upper() for k, v in dtype_overrides.items()})
76
+
77
+ try:
78
+ # 检查表是否存在
79
+ table_exists = con.execute("""
80
+ SELECT COUNT(*) FROM information_schema.tables
81
+ WHERE table_schema = 'main' AND table_name = ?;
82
+ """, (tbl_name.lower(),)).fetchone()[0] > 0
83
+
84
+ # 创建表或添加列
85
+ if not table_exists:
86
+ cols = [f'"{col}" {dtype}' for col, dtype in dtype_mapping.items()]
87
+ con.execute(f'CREATE TABLE "{tbl_name}" ({", ".join(cols)});')
88
+ else:
89
+ # 查询现有列
90
+ existing_columns = con.execute("""
91
+ SELECT column_name, data_type
92
+ FROM information_schema.columns
93
+ WHERE table_schema = 'main' AND table_name = ?;
94
+ """, (tbl_name.lower(),)).fetchall()
95
+ existing_columns = {row[0].lower(): row[1].upper() for row in existing_columns}
96
+
97
+ # 合并添加列
98
+ new_columns = {col: dtype for col, dtype in dtype_mapping.items()
99
+ if col.lower() not in existing_columns}
100
+ if new_columns:
101
+ add_clauses = [f'ADD COLUMN "{col}" {dtype}'
102
+ for col, dtype in new_columns.items()]
103
+ con.execute(f'ALTER TABLE "{tbl_name}" {", ".join(add_clauses)};')
104
+
105
+ # 注册临时表
106
+ con.register('df_temp', df)
107
+
108
+ # 如果 update_for 存在,进行更新操作
109
+ if update_for:
110
+ join_cond = " AND ".join([f'target."{col}" = src."{col}"'
111
+ for col in update_for])
112
+ update_cols = [col for col in df.columns if col not in update_for]
113
+ if not update_cols:
114
+ raise ValueError("No columns to update with given update_for.")
115
+
116
+ # 更新 SQL
117
+ set_clause = ", ".join([f'"{col}" = src."{col}"'
118
+ for col in update_cols])
119
+ con.execute(f"""
120
+ UPDATE "{tbl_name}" AS target
121
+ SET {set_clause}
122
+ FROM df_temp AS src
123
+ WHERE {join_cond};
124
+ """)
125
+
126
+ # 插入不存在的记录
127
+ insert_cols = ", ".join([f'"{col}"' for col in df.columns])
128
+ insert_vals = ", ".join([f'src."{col}"' for col in df.columns])
129
+
130
+ con.execute(f"""
131
+ INSERT INTO "{tbl_name}" ({insert_cols})
132
+ SELECT {insert_vals}
133
+ FROM df_temp AS src
134
+ LEFT JOIN "{tbl_name}" AS target
135
+ ON {join_cond}
136
+ WHERE target."{update_for[0]}" IS NULL;
137
+ """)
138
+ else:
139
+ # 没有 update_for 时直接插入数据
140
+ cols = ", ".join([f'"{col}"' for col in df.columns])
141
+ con.execute(f'INSERT INTO "{tbl_name}" ({cols}) SELECT {cols} FROM df_temp;')
142
+
143
+ if after_close:
144
+ con.close()
145
+ except Exception as e:
146
+ if after_close:
147
+ con.rollback()
148
+ con.close()
149
+ raise RuntimeError(f"Failed to save data: {e}") from e
150
+
151
+ clear_table_duck = lambda path, tbl_name: duckdb.connect(path).execute(f"TRUNCATE TABLE {tbl_name};")
152
+
153
+ # 使用示例
154
+ if __name__ == "__main__":
155
+ # 初始数据
156
+ data_initial = {
157
+ 'symbol': ['BTCUSDT'],
158
+ 'exchange': ['binance'],
159
+ 'orderid': ['123'],
160
+ 'win': [301110],
161
+ 'time': [pd.to_datetime('2025-01-05 05:10:00')]
162
+ }
163
+
164
+ df_initial = pd.DataFrame(data_initial)
165
+
166
+ # 更新数据
167
+ data_update = {
168
+ 'symbol': ['BTCUSDT'],
169
+ 'exchange': ['eee'],
170
+ 'orderid': ['123'],
171
+ 'win': [1010],
172
+ 'time': [pd.to_datetime('2025-01-05 04:20:00', utc=True)]
173
+ }
174
+
175
+ df_update = pd.DataFrame(data_update)
176
+
177
+ # 自定义数据类型覆盖
178
+ dtype_overrides = {
179
+ 'orderid': DuckDBType.VARCHAR, # 根据您的数据类型调整
180
+ 'win': DuckDBType.INTEGER
181
+ }
182
+
183
+ # 保存初始数据到 DuckDB
184
+ # save_to_duck('./333.db', df_initial, 'trades', dtype_overrides=dtype_overrides, update_for='orderid')
185
+
186
+ # # 覆盖 orderid 为 '123' 的数据
187
+ save_to_duck('./333.db', df_update, 'trades', dtype_overrides=dtype_overrides, update_for=['orderid', 'time'])
188
+
189
+ # 验证结果
190
+ with duckdb.connect('./333.db') as con:
191
+ df = con.execute("SELECT * FROM trades;").fetchdf()
192
+ print(df)
@@ -845,7 +845,8 @@ def _produce_date_opt_js(
845
845
  let dateInput = document.getElementById('date-input');
846
846
  endDate=dateInput.value;
847
847
  if (endDate.indexOf("-")<0 && endDate.length>=6){{
848
- endDate=endDate.replace(/({{4}})({{2}})({{2}})/, "$1-$2-$3");
848
+ endDate = endDate.replace(/^(\\d{4})(\\d{2})(\\d{2})$/, '$1-$2-$3');
849
+
849
850
  }}
850
851
  to_date(endDate);
851
852
  }});
@@ -895,7 +896,7 @@ def _produce_date_opt_js(
895
896
  """
896
897
  # 如果高度是用%设置的,要监听浏览器窗口大小变化事件实现图表自动变大小
897
898
  if height_type == "%":
898
- resize_js = """
899
+ resize_js = r"""
899
900
  function resize_chart(){{
900
901
  // 获取当前窗口的宽度和高度
901
902
  let width = window.innerWidth;
@@ -369,6 +369,54 @@ wheels = [
369
369
  { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 },
370
370
  ]
371
371
 
372
+ [[package]]
373
+ name = "duckdb"
374
+ version = "1.2.2"
375
+ source = { registry = "https://pypi.org/simple" }
376
+ sdist = { url = "https://files.pythonhosted.org/packages/28/b8/0f86278684fb7a1fac7c0c869fc6d68ed005cdc91c963eb4373e0551bc0a/duckdb-1.2.2.tar.gz", hash = "sha256:1e53555dece49201df08645dbfa4510c86440339889667702f936b7d28d39e43", size = 11595514 }
377
+ wheels = [
378
+ { url = "https://files.pythonhosted.org/packages/cc/47/d17eecc8bf23519f4385a7ad361482e5791f6b94995a50839f130c469626/duckdb-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6e5e6c333b550903ff11919ed1154c60c9b9d935db51afdb263babe523a8a69e", size = 15255351 },
379
+ { url = "https://files.pythonhosted.org/packages/bd/d1/317397198e0481339c469441762ce4e563f612479c2be70ddba3c1493bf2/duckdb-1.2.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:c1fcbc579de8e4fa7e34242fd6f419c1a39520073b1fe0c29ed6e60ed5553f38", size = 31925074 },
380
+ { url = "https://files.pythonhosted.org/packages/3d/e2/9f8cfa9d8a8d1370ae2b5cf0c6a34e6adc51be533771fd75b5ff84fb2441/duckdb-1.2.2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:690885060c4140922ffa2f6935291c6e74ddad0ca2cf33bff66474ce89312ab3", size = 16779904 },
381
+ { url = "https://files.pythonhosted.org/packages/e6/47/3651b1ab62b6e8ce15a1ead5d81d4bc76b09912c2ae0b11aa0bbcbd0209d/duckdb-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a382782980643f5ee827990b76f079b22f47786509061c0afac28afaa5b8bf5", size = 18726556 },
382
+ { url = "https://files.pythonhosted.org/packages/6d/66/6b2a433d042a3a5109c1a62a4daaea40b908e7876756aed2837adaf0ca26/duckdb-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c33345570ed8c50c9fe340c2767470115cc02d330f25384104cfad1f6e54f5", size = 20195269 },
383
+ { url = "https://files.pythonhosted.org/packages/a3/38/1737151fba968c0e7221b68d11c80ed9ff63edf380d91058426b51f1b233/duckdb-1.2.2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b744f8293ce649d802a9eabbf88e4930d672cf9de7d4fc9af5d14ceaeeec5805", size = 18737528 },
384
+ { url = "https://files.pythonhosted.org/packages/b3/37/bfde2ea14353a297e7effe9e4688b4e60a3ec08a9bd67c404c64046e5d9e/duckdb-1.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c8680e81b0c77be9fc968c1dd4cd38395c34b18bb693cbfc7b7742c18221cc9b", size = 22254571 },
385
+ { url = "https://files.pythonhosted.org/packages/f0/42/392736bfd62b5b5f0d9ea15b010c90a8c92c21fdfc4372e46160f3d8f680/duckdb-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:fb41f2035a70378b3021f724bb08b047ca4aa475850a3744c442570054af3c52", size = 11366201 },
386
+ { url = "https://files.pythonhosted.org/packages/c1/41/78c63937a4f7a5de7d128203c567303d4813c1109b7d17e6b3959f0882e1/duckdb-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:081110ffbc9d53c9740ef55482c93b97db2f8030d681d1658827d2e94f77da03", size = 15258298 },
387
+ { url = "https://files.pythonhosted.org/packages/94/b2/91d983ecd67a1b87343e98395ffe7d77c996e1798c1bab339beed4680693/duckdb-1.2.2-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:53a154dbc074604036a537784ce5d1468edf263745a4363ca06fdb922f0d0a99", size = 31933969 },
388
+ { url = "https://files.pythonhosted.org/packages/ad/12/4737b682cbc1b4778ffb37e4f4cdb603676c50aec89d6c9781ec29d3e904/duckdb-1.2.2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:0353f80882c066f7b14451852395b7a360f3d4846a10555c4268eb49144ea11c", size = 16784775 },
389
+ { url = "https://files.pythonhosted.org/packages/71/be/dfb52b579a0b82aa92993aecc100bd951d0bd1850c6a8d47c68953a9de62/duckdb-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b134a5002757af1ae44a9ae26c2fe963ffa09eb47a62779ce0c5eeb44bfc2f28", size = 18731124 },
390
+ { url = "https://files.pythonhosted.org/packages/ca/49/153dd6289a3d06e87c3199a5547ccc04c574d167d7f85c1a8196218bf040/duckdb-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd9c434127fd1575694e1cf19a393bed301f5d6e80b4bcdae80caa368a61a678", size = 20199712 },
391
+ { url = "https://files.pythonhosted.org/packages/97/ce/f27a7b735a8abb04e2c1efcc05178e25e455539c74d70f76c2845bae8473/duckdb-1.2.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:890f58855d127c25bc3a53f4c24b27e79391c4468c4fcc99bc10d87b5d4bd1c4", size = 18739966 },
392
+ { url = "https://files.pythonhosted.org/packages/d8/f2/a8066267eb5fcd1f535776efde29b6d0fa678d978a7de73f47bc59cc940d/duckdb-1.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a5002305cdd4e76c94b61b50abc5e3f4e32c9cb81116960bb4b74acbbc9c6c8", size = 22255946 },
393
+ { url = "https://files.pythonhosted.org/packages/df/74/8a05ef00c554882d8300c2c261e8f7e7ead74e2b3ff66059599ff2646cf4/duckdb-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:cdb9999c6a109aa31196cdd22fc58a810a3d35d08181a25d1bf963988e89f0a5", size = 11368173 },
394
+ { url = "https://files.pythonhosted.org/packages/77/25/549f68e55e1b455bd2daf2e5fc912000a3139fe0395111b3d49b23a2cec1/duckdb-1.2.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f745379f44ad302560688855baaed9739c03b37a331338eda6a4ac655e4eb42f", size = 15271882 },
395
+ { url = "https://files.pythonhosted.org/packages/f6/84/13de7bf9056dcc7a346125d9a9f0f26f76c633db6b54052738f78f828538/duckdb-1.2.2-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:087713fc5958cae5eb59097856b3deaae0def021660c8f2052ec83fa8345174a", size = 31964873 },
396
+ { url = "https://files.pythonhosted.org/packages/0f/53/c8d2d56a801b7843ea87f8533a3634e6b38f06910098a266f8a096bd4c61/duckdb-1.2.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:a1f96395319c447a31b9477881bd84b4cb8323d6f86f21ceaef355d22dd90623", size = 16800653 },
397
+ { url = "https://files.pythonhosted.org/packages/bb/36/e25791d879fb93b92a56bf481ce11949ab19109103ae2ba12d64e49355d9/duckdb-1.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6aba3bc0acf4f8d52b94f7746c3b0007b78b517676d482dc516d63f48f967baf", size = 18735524 },
398
+ { url = "https://files.pythonhosted.org/packages/d7/46/4745aa10a1e460f4c8b473eddaffe2c783ac5280e1e5929dd84bd1a1acde/duckdb-1.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5c1556775a9ebaa49b5c8d64718f155ac3e05b34a49e9c99443cf105e8b0371", size = 20210314 },
399
+ { url = "https://files.pythonhosted.org/packages/ff/0d/8563fc5ece36252e3d07dd3d29c7a0a034dcf62f14bed7cdc016d95adcbe/duckdb-1.2.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d625cc7d2faacfb2fc83ebbe001ae75dda175b3d8dce6a51a71c199ffac3627a", size = 18755134 },
400
+ { url = "https://files.pythonhosted.org/packages/11/f1/b7ade7d980eee4fb3ad7469ccf23adb3668a9a28cf3989b24418392d3786/duckdb-1.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:73263f81545c5cb4360fbaf7b22a493e55ddf88fadbe639c43efb7bc8d7554c4", size = 22294397 },
401
+ { url = "https://files.pythonhosted.org/packages/eb/c9/896e8ced7b408df81e015fe0c6497cda46c92d9dfc8bf84b6d13f5dad473/duckdb-1.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:b1c0c4d737fd2ab9681e4e78b9f361e0a827916a730e84fa91e76dca451b14d5", size = 11370381 },
402
+ { url = "https://files.pythonhosted.org/packages/41/31/5e2f68cbd000137f6ed52092ad83a8e9c09eca70c59e0b4c5eb679709997/duckdb-1.2.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:fb9a2c77236fae079185a990434cb9d8432902488ba990235c702fc2692d2dcd", size = 15272507 },
403
+ { url = "https://files.pythonhosted.org/packages/d2/15/aa9078fc897e744e077c0c1510e34db4c809de1d51ddb5cb62e1f9c61312/duckdb-1.2.2-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:d8bb89e580cb9a3aaf42e4555bf265d3db9446abfb118e32150e1a5dfa4b5b15", size = 31965548 },
404
+ { url = "https://files.pythonhosted.org/packages/9f/28/943773d44fd97055c59b58dde9182733661c2b6e3b3549f15dc26b2e139e/duckdb-1.2.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:88916d7f0532dc926bed84b50408c00dcbe6d2097d0de93c3ff647d8d57b4f83", size = 16800600 },
405
+ { url = "https://files.pythonhosted.org/packages/39/51/2caf01e7791e490290798c8c155d4d702ed61d69e815915b42e72b3e7473/duckdb-1.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30bece4f58a6c7bb0944a02dd1dc6de435a9daf8668fa31a9fe3a9923b20bd65", size = 18735886 },
406
+ { url = "https://files.pythonhosted.org/packages/87/0c/48ae1d485725af3a452303af409a9022d751ecab260cb9ca2f8c9fb670bc/duckdb-1.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bd2c6373b8b54474724c2119f6939c4568c428e1d0be5bcb1f4e3d7f1b7c8bb", size = 20210481 },
407
+ { url = "https://files.pythonhosted.org/packages/69/c7/95fcd7bde0f754ea6700208d36b845379cbd2b28779c0eff4dd4a7396369/duckdb-1.2.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72f688a8b0df7030c5a28ca6072817c1f090979e08d28ee5912dee37c26a7d0c", size = 18756619 },
408
+ { url = "https://files.pythonhosted.org/packages/ad/1b/c9eab9e84d4a70dd5f7e2a93dd6e9d7b4d868d3df755cd58b572d82d6c5d/duckdb-1.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:26e9c349f56f7c99341b5c79bbaff5ba12a5414af0261e79bf1a6a2693f152f6", size = 22294667 },
409
+ { url = "https://files.pythonhosted.org/packages/3f/3d/ce68db53084746a4a62695a4cb064e44ce04123f8582bb3afbf6ee944e16/duckdb-1.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1aec7102670e59d83512cf47d32a6c77a79df9df0294c5e4d16b6259851e2e9", size = 11370206 },
410
+ { url = "https://files.pythonhosted.org/packages/a9/a8/9d75eeab4ff76a4e9dae52298cd0c582f513300f3fc34db9520a6db6c4b1/duckdb-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:25ac669180f88fecca20f300b898e191f81aa674d51dde8a328bdeb28a572ab0", size = 15255341 },
411
+ { url = "https://files.pythonhosted.org/packages/67/52/745839eb1299be96379b52b6cc3783ee330e91ec8d325b157611b9a2d49c/duckdb-1.2.2-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:d42e7e545d1059e6b73d0f0baa9ae34c90684bfd8c862e70b0d8ab92e01e0e3f", size = 31923916 },
412
+ { url = "https://files.pythonhosted.org/packages/0c/6b/0e1da90808ec4f60215c2a2873c5ae5a248337ccccc77c2b5fb71918f7eb/duckdb-1.2.2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:f3ce127bcecc723f1c7bddbc57f0526d11128cb05bfd81ffcd5e69e2dd5a1624", size = 16778052 },
413
+ { url = "https://files.pythonhosted.org/packages/60/13/04974fdd6106492d6ebbd411c51fca949f73d1a08b5281f9b41c622b0386/duckdb-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2418937adb9d6d0ca823bd385b914495294db27bc2963749d54af6708757f679", size = 18727076 },
414
+ { url = "https://files.pythonhosted.org/packages/be/cf/f875823e9eae416928b7e583b2174e826e67c120297880f1dde3a726accc/duckdb-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d41f899ce7979e7b3f9097ebce70da5c659db2d81d08c07a72b2b50f869859", size = 20196346 },
415
+ { url = "https://files.pythonhosted.org/packages/b1/3e/b483c5ad2223392474f4d74d42e522b7545a95154c673f81eea4252d7192/duckdb-1.2.2-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:85e90a9c5307cf4d9151844e60c80f492618ea6e9b71081020e7d462e071ac8f", size = 18724393 },
416
+ { url = "https://files.pythonhosted.org/packages/a6/99/349475c08be5abe686d647ca4585287bd01c01b16121f329e05e664630f4/duckdb-1.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:df8c8a4ec998139b8507213c44c50e24f62a36af1cfded87e8972173dc9f8baf", size = 22237700 },
417
+ { url = "https://files.pythonhosted.org/packages/8e/1a/1a9da0336c146750ba1dc9a5ad1ab8c228da4512991e1d5b8f0e07076bd5/duckdb-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6507ad2445cd3479853fb6473164b5eb5b22446d283c9892cfbbd0a85c5f361d", size = 11400288 },
418
+ ]
419
+
372
420
  [[package]]
373
421
  name = "frozenlist"
374
422
  version = "1.6.0"
@@ -482,12 +530,13 @@ wheels = [
482
530
 
483
531
  [[package]]
484
532
  name = "hyperquant"
485
- version = "0.1.6"
533
+ version = "0.1.8"
486
534
  source = { editable = "." }
487
535
  dependencies = [
488
536
  { name = "aiohttp" },
489
537
  { name = "colorama" },
490
538
  { name = "cryptography" },
539
+ { name = "duckdb" },
491
540
  { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
492
541
  { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
493
542
  { name = "pandas" },
@@ -504,6 +553,7 @@ requires-dist = [
504
553
  { name = "aiohttp", specifier = ">=3.11.16" },
505
554
  { name = "colorama", specifier = ">=0.4.6" },
506
555
  { name = "cryptography", specifier = ">=44.0.2" },
556
+ { name = "duckdb", specifier = ">=1.2.2" },
507
557
  { name = "numpy", specifier = ">=1.21.0" },
508
558
  { name = "pandas", specifier = ">=2.2.3" },
509
559
  { name = "pyecharts", specifier = ">=2.0.8" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes