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
|