hyperquant 0.1.7__tar.gz → 0.1.8__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.
- {hyperquant-0.1.7 → hyperquant-0.1.8}/PKG-INFO +2 -1
- {hyperquant-0.1.7 → hyperquant-0.1.8}/pyproject.toml +3 -2
- hyperquant-0.1.8/src/hyperquant/db.py +192 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/uv.lock +51 -1
- {hyperquant-0.1.7 → hyperquant-0.1.8}/.gitignore +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/.python-version +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/README.md +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/pub.sh +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/requirements-dev.lock +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/requirements.lock +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/src/hyperquant/__init__.py +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/src/hyperquant/core.py +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/src/hyperquant/datavison/_util.py +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/src/hyperquant/datavison/binance.py +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/src/hyperquant/datavison/coinglass.py +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/src/hyperquant/draw.py +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/src/hyperquant/logkit.py +0 -0
- {hyperquant-0.1.7 → hyperquant-0.1.8}/test.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: hyperquant
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.8
|
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.
|
3
|
+
version = "0.1.8"
|
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",
|
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)
|
@@ -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.
|
533
|
+
version = "0.1.7"
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|