vnai 0.0.5__py3-none-any.whl → 0.0.7__py3-none-any.whl
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.
- vnai/__init__.py +18 -4
- {vnai-0.0.5.dist-info → vnai-0.0.7.dist-info}/METADATA +1 -1
- vnai-0.0.7.dist-info/RECORD +5 -0
- {vnai-0.0.5.dist-info → vnai-0.0.7.dist-info}/top_level.txt +0 -1
- raw/__init__.py +0 -335
- raw/analytics.py +0 -341
- raw/setup.py +0 -9
- vnai-0.0.5.dist-info/RECORD +0 -8
- {vnai-0.0.5.dist-info → vnai-0.0.7.dist-info}/WHEEL +0 -0
vnai/__init__.py
CHANGED
@@ -103,10 +103,7 @@ class VnstockInitializer:
|
|
103
103
|
else:
|
104
104
|
environment = "Other" # Non-interactive environment (e.g., script executed from an IDE)
|
105
105
|
else:
|
106
|
-
|
107
|
-
environment = "Google Colab"
|
108
|
-
else:
|
109
|
-
environment = "Jupyter"
|
106
|
+
environment = "Jupyter"
|
110
107
|
except (ImportError, AttributeError):
|
111
108
|
# Fallback if IPython isn't installed or other checks fail
|
112
109
|
if sys.stdout.isatty():
|
@@ -114,6 +111,22 @@ class VnstockInitializer:
|
|
114
111
|
else:
|
115
112
|
environment = "Other"
|
116
113
|
|
114
|
+
try:
|
115
|
+
if 'google.colab' in sys.modules:
|
116
|
+
hosting_service = "Google Colab"
|
117
|
+
elif 'CODESPACE_NAME' in os.environ:
|
118
|
+
hosting_service = "Github Codespace"
|
119
|
+
elif 'GITPOD_WORKSPACE_CLUSTER_HOST' in os.environ:
|
120
|
+
hosting_service = "Gitpod"
|
121
|
+
elif 'REPLIT_USER' in os.environ:
|
122
|
+
hosting_service = "Replit"
|
123
|
+
elif 'KAGGLE_CONTAINER_NAME' in os.environ:
|
124
|
+
hosting_service = "Kaggle"
|
125
|
+
elif '.hf.space' in os.environ['SPACE_HOST']:
|
126
|
+
hosting_service = "Hugging Face Spaces"
|
127
|
+
except:
|
128
|
+
hosting_service = "Local or Unknown"
|
129
|
+
|
117
130
|
# System information
|
118
131
|
os_info = platform.uname()
|
119
132
|
|
@@ -135,6 +148,7 @@ class VnstockInitializer:
|
|
135
148
|
info = {
|
136
149
|
"uuid": machine_id,
|
137
150
|
"environment": environment,
|
151
|
+
"hosting_service": hosting_service,
|
138
152
|
"python_version": platform.python_version(),
|
139
153
|
"os_name": os_info.system,
|
140
154
|
"os_version": os_info.version,
|
@@ -0,0 +1,5 @@
|
|
1
|
+
vnai/__init__.py,sha256=72F-l8UJ5Egaez41BTN58SeDOxv7h78-PyYKKZK1T_U,15323
|
2
|
+
vnai-0.0.7.dist-info/METADATA,sha256=3faoC2891w6Kv41jzVRCq9znMJMCB_YAVhxTzafsNq0,576
|
3
|
+
vnai-0.0.7.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
4
|
+
vnai-0.0.7.dist-info/top_level.txt,sha256=4zI0qZHePCwvgSqXl4420sBcd0VzZn4MEcRsAIFae3k,5
|
5
|
+
vnai-0.0.7.dist-info/RECORD,,
|
raw/__init__.py
DELETED
@@ -1,335 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import pathlib
|
3
|
-
import importlib.metadata
|
4
|
-
import requests
|
5
|
-
import psutil
|
6
|
-
import platform
|
7
|
-
import uuid
|
8
|
-
import sys
|
9
|
-
import socket
|
10
|
-
import json
|
11
|
-
import base64
|
12
|
-
from cryptography.fernet import Fernet
|
13
|
-
|
14
|
-
TC_VAR = "ACCEPT_TC"
|
15
|
-
TC_VAL = "tôi đồng ý"
|
16
|
-
|
17
|
-
HOME_DIR = pathlib.Path.home()
|
18
|
-
PROJECT_DIR = HOME_DIR / ".vnstock"
|
19
|
-
ID_DIR = PROJECT_DIR / 'id'
|
20
|
-
TG = b'gAAAAABmOPXPmFYXs94INEralMxhR38geFp91TZRLP29C41OoO0k7D7QiXIR2nWl5PCEoQCKECZw8b-Xeek3oqT6LcpcpJsAPyOGOBTX5cw_r5Mv0o8SBLa53jOeuVAwCAhId_BpMtOO'
|
21
|
-
TC_PATH = ID_DIR / "terms_agreement.txt"
|
22
|
-
|
23
|
-
class VnstockInitializer:
|
24
|
-
def __init__(self, target):
|
25
|
-
self.TERMS_AND_CONDITIONS = """
|
26
|
-
THOẢ THUẬN SỬ DỤNG - ĐIỀU KHOẢN & ĐIỀU KIỆN SỬ DỤNG VNSTOCK3
|
27
|
-
------------------------
|
28
|
-
Khi sử dụng vnstock, bạn xác nhận rằng bạn đã đọc, hiểu rõ, và chấp nhận các điều khoản mô tả dưới đây.
|
29
|
-
Vui lòng nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận các điều khoản và điều kiện này và tiếp tục sử dụng phần mềm.
|
30
|
-
|
31
|
-
I. ĐIỀU KHOẢN CHUNG
|
32
|
-
------------------------
|
33
|
-
- Thư viện này chỉ dành cho mục đích cá nhân và không được phân phối lại hoặc sử dụng cho mục đích thương mại mà không có sự đồng ý bằng văn bản chính thức từ tác giả. Tất cả bản quyền và sở hữu trí tuệ thuộc về tác giả. Bất kỳ hành vi vi phạm bản quyền hoặc sở hữu trí tuệ sẽ bị xử lý theo pháp luật.
|
34
|
-
|
35
|
-
- Bạn không được sử dụng Vnstock cho các mục đích bất hợp pháp, phi đạo đức, hoặc trái với quy định pháp luật hiện hành.
|
36
|
-
|
37
|
-
- Bạn đồng ý rằng tác giả không chịu trách nhiệm cho bất kỳ thiệt hại, mất mát, hoặc hậu quả nào phát sinh từ việc sử dụng thư viện này, đặc biệt trong hoạt động đầu tư hoặc bất kỳ hoạt động nào có rủi ro. Bạn tự chịu trách nhiệm cho các quyết định đầu tư của mình.
|
38
|
-
|
39
|
-
- Bạn đồng ý tuân thủ mọi luật pháp, quy định, và hướng dẫn liên quan khi sử dụng thư viện này.
|
40
|
-
|
41
|
-
- Bạn chấp nhận rằng Vnstock có thể lưu trữ dữ liệu ẩn danh của thiết bị để tối ưu tính năng và cải thiện hiệu năng phần mềm. Thông tin này sẽ được bảo mật và không được chia sẻ với bên thứ ba mà không có sự đồng ý của bạn.
|
42
|
-
|
43
|
-
II. LƯU TRỮ & XỬ LÝ DỮ LIỆU
|
44
|
-
------------------------
|
45
|
-
Thư viện này thu thập dữ liệu để phân tích, thống kê, và cải thiện hiệu suất. Dữ liệu này sẽ không được chia sẻ với bên thứ ba. Dưới đây là danh sách các thông tin được thu thập, cùng với giải thích và ví dụ mẫu:
|
46
|
-
|
47
|
-
- UUID (Machine ID): Một định danh duy nhất cho máy tính của bạn, giúp phân biệt các thiết bị. Ví dụ: "123e4567-e89b-12d3-a456-426614174000".
|
48
|
-
|
49
|
-
- Environment (Môi trường): Mô tả môi trường chạy chương trình, như "development", "testing", hoặc "production". Ví dụ: "production".
|
50
|
-
|
51
|
-
- Python Version (Phiên bản Python): Phiên bản Python đang chạy trên hệ thống của bạn. Ví dụ: "3.9.1".
|
52
|
-
|
53
|
-
- OS Name (Tên hệ điều hành): Tên hệ điều hành đang chạy trên máy tính. Ví dụ: "Windows".
|
54
|
-
|
55
|
-
- OS Version (Phiên bản hệ điều hành): Phiên bản cụ thể của hệ điều hành. Ví dụ: "10.0.19041".
|
56
|
-
|
57
|
-
- Machine (Máy): Mô tả loại máy tính hoặc kiến trúc phần cứng. Ví dụ: "AMD64".
|
58
|
-
|
59
|
-
- CPU Model (Mô hình CPU): Thông tin về loại bộ xử lý (CPU) trên máy tính. Ví dụ: "Intel Core i7-8700".
|
60
|
-
|
61
|
-
- CPU Cores (Số lõi CPU): Số lõi vật lý của CPU. Ví dụ: 6.
|
62
|
-
|
63
|
-
- CPU Logical Cores (Số lõi CPU logic): Số lõi logic của CPU, thường bao gồm cả lõi vật lý và lõi ảo. Ví dụ: 12.
|
64
|
-
|
65
|
-
- RAM Total (Tổng dung lượng RAM): Tổng dung lượng bộ nhớ RAM trên máy tính, tính bằng gigabyte (GB). Ví dụ: 16.0 GB.
|
66
|
-
|
67
|
-
- RAM Available (Dung lượng RAM có sẵn): Dung lượng bộ nhớ RAM còn trống, tính bằng gigabyte (GB). Ví dụ: 8.5 GB.
|
68
|
-
|
69
|
-
- Local IP (Địa chỉ IP cục bộ): Địa chỉ IP cục bộ của máy tính.
|
70
|
-
|
71
|
-
- MAC Address (Địa chỉ MAC): Địa chỉ MAC (Media Access Control) của thiết bị mạng. Ví dụ: "00:1A:A2:3B:4C:5D".
|
72
|
-
"""
|
73
|
-
|
74
|
-
self.home_dir = HOME_DIR
|
75
|
-
self.project_dir = PROJECT_DIR
|
76
|
-
self.id_dir = ID_DIR
|
77
|
-
self.terms_file_path = TC_PATH
|
78
|
-
self.RH = 'asejruyy^&%$#W2vX>NfwrevDRESWR'
|
79
|
-
self.LH = 'YMAnhuytr%$59u90y7j-mjhgvyFTfbiuUYH'
|
80
|
-
|
81
|
-
# Create the project directory if it doesn't exist
|
82
|
-
self.project_dir.mkdir(exist_ok=True)
|
83
|
-
self.id_dir.mkdir(exist_ok=True)
|
84
|
-
self.target = target
|
85
|
-
|
86
|
-
kb = (str(self.project_dir).split("/")[-1] + str(self.id_dir).split("/")[-1] + str(self.terms_file_path).split("/")[-1]).ljust(32)[:32].encode('utf-8')
|
87
|
-
kb64 = base64.urlsafe_b64encode(kb)
|
88
|
-
self.cph = Fernet(kb64)
|
89
|
-
|
90
|
-
def system_info(self):
|
91
|
-
"""
|
92
|
-
Gathers information about the environment and system.
|
93
|
-
"""
|
94
|
-
# Generate UUID
|
95
|
-
machine_id = str(uuid.uuid4())
|
96
|
-
|
97
|
-
# Environment (modify to detect your specific frameworks)
|
98
|
-
try:
|
99
|
-
from IPython import get_ipython
|
100
|
-
if 'IPKernelApp' not in get_ipython().config: # Check if not in IPython kernel
|
101
|
-
if sys.stdout.isatty():
|
102
|
-
environment = "Terminal"
|
103
|
-
else:
|
104
|
-
environment = "Other" # Non-interactive environment (e.g., script executed from an IDE)
|
105
|
-
else:
|
106
|
-
if 'google.colab' in sys.modules:
|
107
|
-
environment = "Google Colab"
|
108
|
-
else:
|
109
|
-
environment = "Jupyter"
|
110
|
-
except (ImportError, AttributeError):
|
111
|
-
# Fallback if IPython isn't installed or other checks fail
|
112
|
-
if sys.stdout.isatty():
|
113
|
-
environment = "Terminal"
|
114
|
-
else:
|
115
|
-
environment = "Other"
|
116
|
-
|
117
|
-
# System information
|
118
|
-
os_info = platform.uname()
|
119
|
-
|
120
|
-
# CPU information
|
121
|
-
cpu_arch = platform.processor()
|
122
|
-
cpu_logical_cores = psutil.cpu_count(logical=True)
|
123
|
-
cpu_cores = psutil.cpu_count(logical=False)
|
124
|
-
|
125
|
-
# Memory information
|
126
|
-
ram_total = psutil.virtual_memory().total / (1024**3) # GB
|
127
|
-
ram_available = psutil.virtual_memory().available / (1024**3) # GB
|
128
|
-
|
129
|
-
hostname = socket.gethostname()
|
130
|
-
IPAddr = socket.gethostbyname(hostname)
|
131
|
-
|
132
|
-
mac = ':'.join(['{:02x}'.format((uuid.getnode() >> elements) & 0xff) for elements in range(0, 2 * 6, 2)])
|
133
|
-
|
134
|
-
# Combine information into a dictionary
|
135
|
-
info = {
|
136
|
-
"uuid": machine_id,
|
137
|
-
"environment": environment,
|
138
|
-
"python_version": platform.python_version(),
|
139
|
-
"os_name": os_info.system,
|
140
|
-
"os_version": os_info.version,
|
141
|
-
"machine": os_info.machine,
|
142
|
-
"cpu_model": cpu_arch,
|
143
|
-
"cpu_cores": cpu_cores,
|
144
|
-
"cpu_logical_cores": cpu_logical_cores,
|
145
|
-
"ram_total": round(ram_total, 1),
|
146
|
-
"ram_available": round(ram_available, 1),
|
147
|
-
"local_ip": IPAddr,
|
148
|
-
"mac_address": mac,
|
149
|
-
}
|
150
|
-
|
151
|
-
return info
|
152
|
-
|
153
|
-
def show_terms_and_conditions(self):
|
154
|
-
"""
|
155
|
-
Displays terms and conditions and asks for acceptance.
|
156
|
-
"""
|
157
|
-
print(self.TERMS_AND_CONDITIONS)
|
158
|
-
|
159
|
-
# check if os.environ[TC_VAR] exist and equal to tôi đồng ý
|
160
|
-
if TC_VAR in os.environ and os.environ[TC_VAR] == TC_VAL:
|
161
|
-
response = TC_VAL
|
162
|
-
else:
|
163
|
-
response = input("Nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận: ")
|
164
|
-
if not response.strip():
|
165
|
-
response = TC_VAL
|
166
|
-
os.environ[TC_VAR] = response
|
167
|
-
|
168
|
-
if response.strip().lower() == TC_VAL:
|
169
|
-
from datetime import datetime
|
170
|
-
# get now time in string
|
171
|
-
now = datetime.now()
|
172
|
-
HARDWARE = self.system_info()
|
173
|
-
# VERSION = pkg_resources.get_distribution('vnstock').version
|
174
|
-
|
175
|
-
VERSION = None
|
176
|
-
try:
|
177
|
-
VERSION = importlib.metadata.version('vnstock')
|
178
|
-
except importlib.metadata.PackageNotFoundError:
|
179
|
-
print("Package 'vnstock' not found")
|
180
|
-
|
181
|
-
# parse HARDWARE to string to store in the file
|
182
|
-
signed_aggreement = f"PHIÊN BẢN: {VERSION}\nMÔ TẢ:\nNgười dùng có mã nhận dạng {HARDWARE['uuid']} đã chấp nhận điều khoản & điều kiện sử dụng Vnstock lúc {now}\n---\n\nTHÔNG TIN THIẾT BỊ: {str(HARDWARE)}\n\nĐính kèm bản sao nội dung bạn đã đọc, hiểu rõ và đồng ý dưới đây:\n{self.TERMS_AND_CONDITIONS}"
|
183
|
-
|
184
|
-
# Store the acceptance
|
185
|
-
with open(self.terms_file_path, "w", encoding="utf-8") as f:
|
186
|
-
f.write(signed_aggreement)
|
187
|
-
|
188
|
-
print("---\nCảm ơn bạn đã chấp nhận điều khoản và điều kiện!\nBạn đã có thể tiếp tục sử dụng Vnstock!")
|
189
|
-
return True
|
190
|
-
else:
|
191
|
-
return False
|
192
|
-
|
193
|
-
def log_analytics_data(self):
|
194
|
-
"""
|
195
|
-
Sends analytics data to a webhook.
|
196
|
-
"""
|
197
|
-
HARDWARE = self.system_info()
|
198
|
-
EP = 'gAAAAABmOPNX4DJAsImlkzvtcyezBxr4UcK_HpCOgz-GOF9yBDP99tWNFYM_ZjeC22kNqmX3urZa467BC1D2fPLJrUkp6rQizYEMK4m196ZlOzUhwCbfjdvURXesL3LC7DofOgwWjNyltPQ8AnPyB4YUMnnAwnFooQ=='
|
199
|
-
TGE = self.cph.decrypt(self.target).decode('utf-8')
|
200
|
-
WH = f"{self.cph.decrypt(((self.RH+EP+self.RH)[30:-30]).encode()).decode('utf-8')}{TGE}"
|
201
|
-
|
202
|
-
data = {
|
203
|
-
"systems": HARDWARE,
|
204
|
-
"accepted_agreement": True,
|
205
|
-
"installed_packages": self.packages_installed(),
|
206
|
-
}
|
207
|
-
|
208
|
-
# save data to a json file in id folder
|
209
|
-
with open(self.id_dir / "environment.json", "w", encoding="utf-8") as f:
|
210
|
-
f.write(json.dumps(data, indent=4))
|
211
|
-
|
212
|
-
try:
|
213
|
-
response = requests.post(WH, json=data)
|
214
|
-
except:
|
215
|
-
raise SystemExit("Không thể gửi dữ liệu phân tích. Vui lòng kiểm tra kết nối mạng và thử lại sau.")
|
216
|
-
|
217
|
-
def check_terms_accepted(self):
|
218
|
-
"""
|
219
|
-
Checks if terms and conditions are accepted.
|
220
|
-
"""
|
221
|
-
if not self.terms_file_path.exists():
|
222
|
-
# If not, ask for acceptance
|
223
|
-
accepted = self.show_terms_and_conditions()
|
224
|
-
if not accepted:
|
225
|
-
raise SystemExit("Điều khoản và điều kiện không được chấp nhận. Không thể tiếp tục.")
|
226
|
-
else:
|
227
|
-
self.log_analytics_data()
|
228
|
-
|
229
|
-
def packages_installed(self):
|
230
|
-
"""
|
231
|
-
Checks installed packages and returns a dictionary.
|
232
|
-
"""
|
233
|
-
# Define package mapping
|
234
|
-
package_mapping = {
|
235
|
-
"vnstock_family": [
|
236
|
-
"vnstock",
|
237
|
-
"vnstock3",
|
238
|
-
"vnstock_ezchart",
|
239
|
-
"vnstock_data_pro"
|
240
|
-
"vnstock_market_data_pipeline",
|
241
|
-
"vnstock_ta"
|
242
|
-
],
|
243
|
-
"analytics": [
|
244
|
-
"openbb",
|
245
|
-
"pandas_ta"
|
246
|
-
],
|
247
|
-
"static_charts": [
|
248
|
-
"matplotlib",
|
249
|
-
"seaborn",
|
250
|
-
"altair"
|
251
|
-
],
|
252
|
-
"dashboard": [
|
253
|
-
"streamlit",
|
254
|
-
"voila",
|
255
|
-
"panel"
|
256
|
-
],
|
257
|
-
"interactive_charts": [
|
258
|
-
"mplfinance",
|
259
|
-
"plotly",
|
260
|
-
"plotline",
|
261
|
-
"bokeh",
|
262
|
-
"pyecharts",
|
263
|
-
"highcharts-core",
|
264
|
-
"highcharts-stock"
|
265
|
-
],
|
266
|
-
"datafeed": [
|
267
|
-
"yfinance",
|
268
|
-
"alpha_vantage",
|
269
|
-
"pandas-datareader",
|
270
|
-
"investpy",
|
271
|
-
],
|
272
|
-
"official_api": [
|
273
|
-
"ssi-fc-data",
|
274
|
-
"ssi-fctrading"
|
275
|
-
],
|
276
|
-
"risk_return": [
|
277
|
-
"pyfolio",
|
278
|
-
"empyrical",
|
279
|
-
"quantstats"
|
280
|
-
],
|
281
|
-
"machine_learning": [
|
282
|
-
"scipy",
|
283
|
-
"sklearn",
|
284
|
-
"statsmodels",
|
285
|
-
"pytorch",
|
286
|
-
"tensorflow",
|
287
|
-
"keras",
|
288
|
-
"xgboost"
|
289
|
-
],
|
290
|
-
"indicators": [
|
291
|
-
"stochastic",
|
292
|
-
"talib",
|
293
|
-
"tqdm",
|
294
|
-
"finta",
|
295
|
-
"financetoolkit",
|
296
|
-
"tulipindicators"
|
297
|
-
],
|
298
|
-
"backtesting": [
|
299
|
-
"vectorbt",
|
300
|
-
"backtesting",
|
301
|
-
"bt",
|
302
|
-
"zipline",
|
303
|
-
"pyalgotrade",
|
304
|
-
"backtrader",
|
305
|
-
"pybacktest"
|
306
|
-
],
|
307
|
-
"server": [
|
308
|
-
"fastapi",
|
309
|
-
"flask",
|
310
|
-
"uvicorn",
|
311
|
-
"gunicorn"
|
312
|
-
],
|
313
|
-
"framework": [
|
314
|
-
"lightgbm",
|
315
|
-
"catboost",
|
316
|
-
"django",
|
317
|
-
]
|
318
|
-
}
|
319
|
-
|
320
|
-
installed_packages = {}
|
321
|
-
|
322
|
-
for category, packages in package_mapping.items():
|
323
|
-
installed_packages[category] = []
|
324
|
-
for pkg in packages:
|
325
|
-
try:
|
326
|
-
version = importlib.metadata.version(pkg)
|
327
|
-
installed_packages[category].append((pkg, version))
|
328
|
-
except importlib.metadata.PackageNotFoundError:
|
329
|
-
pass
|
330
|
-
|
331
|
-
return installed_packages
|
332
|
-
|
333
|
-
def tc_init():
|
334
|
-
vnstock_initializer = VnstockInitializer(TG)
|
335
|
-
vnstock_initializer.check_terms_accepted()
|
raw/analytics.py
DELETED
@@ -1,341 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import pathlib
|
3
|
-
# import pkg_resources
|
4
|
-
import importlib.metadata
|
5
|
-
import asyncio
|
6
|
-
import requests
|
7
|
-
import psutil
|
8
|
-
import platform
|
9
|
-
import uuid
|
10
|
-
import sys
|
11
|
-
import socket
|
12
|
-
|
13
|
-
class VnstockInitializer:
|
14
|
-
def __init__(self, hook_id):
|
15
|
-
# Define terms and conditions
|
16
|
-
self.TERMS_AND_CONDITIONS = """
|
17
|
-
THOẢ THUẬN SỬ DỤNG - ĐIỀU KHOẢN & ĐIỀU KIỆN SỬ DỤNG VNSTOCK3
|
18
|
-
------------------------
|
19
|
-
Khi sử dụng vnstock, bạn xác nhận rằng bạn đã đọc, hiểu rõ, và chấp nhận các điều khoản mô tả dưới đây. Vui lòng nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận các điều khoản và điều kiện này và tiếp tục sử dụng phần mềm.
|
20
|
-
|
21
|
-
I. ĐIỀU KHOẢN CHUNG
|
22
|
-
------------------------
|
23
|
-
- Thư viện này chỉ dành cho mục đích cá nhân và không được phân phối lại hoặc sử dụng cho mục đích thương mại mà không có sự đồng ý bằng văn bản chính thức từ tác giả. Tất cả bản quyền và sở hữu trí tuệ thuộc về tác giả. Bất kỳ hành vi vi phạm bản quyền hoặc sở hữu trí tuệ sẽ bị xử lý theo pháp luật.
|
24
|
-
|
25
|
-
- Bạn không được sử dụng thư viện này cho các mục đích bất hợp pháp, phi đạo đức, hoặc trái với quy định pháp luật hiện hành.
|
26
|
-
|
27
|
-
- Bạn đồng ý rằng tác giả không chịu trách nhiệm cho bất kỳ thiệt hại, mất mát, hoặc hậu quả nào phát sinh từ việc sử dụng thư viện này, đặc biệt trong hoạt động đầu tư hoặc bất kỳ hoạt động nào có rủi ro. Bạn tự chịu trách nhiệm cho các quyết định đầu tư của mình.
|
28
|
-
|
29
|
-
- Bạn đồng ý tuân thủ mọi luật pháp, quy định, và hướng dẫn liên quan khi sử dụng thư viện này.
|
30
|
-
|
31
|
-
- Bạn chấp nhận rằng thư viện này có thể lưu trữ dữ liệu cục bộ để lưu cấu hình, cung cấp tính năng cá nhân hóa, hoặc cho mục đích phân tích. Thông tin này sẽ được bảo mật và không được chia sẻ với bên thứ ba mà không có sự đồng ý của bạn.
|
32
|
-
|
33
|
-
II. LƯU TRỮ & XỬ LÝ DỮ LIỆU
|
34
|
-
------------------------
|
35
|
-
Thư viện này thu thập dữ liệu để phân tích, thống kê, và cải thiện hiệu suất. Dữ liệu này được lưu trữ cục bộ và không được chia sẻ với bên thứ ba. Dưới đây là danh sách các thông tin được thu thập, cùng với giải thích và ví dụ mẫu:
|
36
|
-
|
37
|
-
- UUID (Machine ID): Một định danh duy nhất cho máy tính của bạn, giúp phân biệt các thiết bị. Ví dụ: "123e4567-e89b-12d3-a456-426614174000".
|
38
|
-
|
39
|
-
- Environment (Môi trường): Mô tả môi trường chạy chương trình, như "development", "testing", hoặc "production". Ví dụ: "production".
|
40
|
-
|
41
|
-
- Python Version (Phiên bản Python): Phiên bản Python đang chạy trên hệ thống của bạn. Ví dụ: "3.9.1".
|
42
|
-
|
43
|
-
- OS Name (Tên hệ điều hành): Tên hệ điều hành đang chạy trên máy tính. Ví dụ: "Windows".
|
44
|
-
|
45
|
-
- OS Version (Phiên bản hệ điều hành): Phiên bản cụ thể của hệ điều hành. Ví dụ: "10.0.19041".
|
46
|
-
|
47
|
-
- Machine (Máy): Mô tả loại máy tính hoặc kiến trúc phần cứng. Ví dụ: "AMD64".
|
48
|
-
|
49
|
-
- CPU Model (Mô hình CPU): Thông tin về loại bộ xử lý (CPU) trên máy tính. Ví dụ: "Intel Core i7-8700".
|
50
|
-
|
51
|
-
- CPU Cores (Số lõi CPU): Số lõi vật lý của CPU. Ví dụ: 6.
|
52
|
-
|
53
|
-
- CPU Logical Cores (Số lõi CPU logic): Số lõi logic của CPU, thường bao gồm cả lõi vật lý và lõi ảo. Ví dụ: 12.
|
54
|
-
|
55
|
-
- RAM Total (Tổng dung lượng RAM): Tổng dung lượng bộ nhớ RAM trên máy tính, tính bằng gigabyte (GB). Ví dụ: 16.0 GB.
|
56
|
-
|
57
|
-
- RAM Available (Dung lượng RAM có sẵn): Dung lượng bộ nhớ RAM còn trống, tính bằng gigabyte (GB). Ví dụ: 8.5 GB.
|
58
|
-
|
59
|
-
- Local IP (Địa chỉ IP cục bộ): Địa chỉ IP cục bộ của máy tính.
|
60
|
-
|
61
|
-
- MAC Address (Địa chỉ MAC): Địa chỉ MAC (Media Access Control) của thiết bị mạng. Ví dụ: "00:1A:A2:3B:4C:5D".
|
62
|
-
"""
|
63
|
-
|
64
|
-
self.HOME_DIR = pathlib.Path.home()
|
65
|
-
self.PROJECT_DIR = self.HOME_DIR / ".vnstock"
|
66
|
-
self.TERMS_FILE_PATH = self.PROJECT_DIR / "terms_agreement.txt"
|
67
|
-
|
68
|
-
# Create the project directory if it doesn't exist
|
69
|
-
self.PROJECT_DIR.mkdir(exist_ok=True)
|
70
|
-
self.hook_id = hook_id
|
71
|
-
|
72
|
-
async def system_info(self):
|
73
|
-
"""
|
74
|
-
Gathers information about the environment and system.
|
75
|
-
"""
|
76
|
-
# Generate UUID
|
77
|
-
machine_id = str(uuid.uuid4())
|
78
|
-
|
79
|
-
# Environment (modify to detect your specific frameworks)
|
80
|
-
try:
|
81
|
-
from IPython import get_ipython
|
82
|
-
if 'IPKernelApp' not in get_ipython().config: # Check if not in IPython kernel
|
83
|
-
if sys.stdout.isatty():
|
84
|
-
environment = "Terminal"
|
85
|
-
else:
|
86
|
-
environment = "Other" # Non-interactive environment (e.g., script executed from an IDE)
|
87
|
-
else:
|
88
|
-
environment = "Jupyter"
|
89
|
-
except (ImportError, AttributeError):
|
90
|
-
# Fallback if IPython isn't installed or other checks fail
|
91
|
-
if sys.stdout.isatty():
|
92
|
-
environment = "Terminal"
|
93
|
-
else:
|
94
|
-
environment = "Other"
|
95
|
-
|
96
|
-
# System information
|
97
|
-
os_info = platform.uname()
|
98
|
-
|
99
|
-
# CPU information
|
100
|
-
cpu_arch = platform.processor()
|
101
|
-
cpu_logical_cores = psutil.cpu_count(logical=True)
|
102
|
-
cpu_cores = psutil.cpu_count(logical=False)
|
103
|
-
|
104
|
-
# Memory information
|
105
|
-
ram_total = psutil.virtual_memory().total / (1024**3) # GB
|
106
|
-
ram_available = psutil.virtual_memory().available / (1024**3) # GB
|
107
|
-
|
108
|
-
hostname = socket.gethostname()
|
109
|
-
IPAddr = socket.gethostbyname(hostname)
|
110
|
-
|
111
|
-
mac = ':'.join(['{:02x}'.format((uuid.getnode() >> elements) & 0xff) for elements in range(0, 2 * 6, 2)])
|
112
|
-
|
113
|
-
# Combine information into a dictionary
|
114
|
-
info = {
|
115
|
-
"uuid": machine_id,
|
116
|
-
"environment": environment,
|
117
|
-
"python_version": platform.python_version(),
|
118
|
-
"os_name": os_info.system,
|
119
|
-
"os_version": os_info.version,
|
120
|
-
"machine": os_info.machine,
|
121
|
-
"cpu_model": cpu_arch,
|
122
|
-
"cpu_cores": cpu_cores,
|
123
|
-
"cpu_logical_cores": cpu_logical_cores,
|
124
|
-
"ram_total": round(ram_total, 1),
|
125
|
-
"ram_available": round(ram_available, 1),
|
126
|
-
"local_ip": IPAddr,
|
127
|
-
"mac_address": mac,
|
128
|
-
}
|
129
|
-
|
130
|
-
return info
|
131
|
-
|
132
|
-
async def show_terms_and_conditions(self):
|
133
|
-
"""
|
134
|
-
Displays terms and conditions and asks for acceptance.
|
135
|
-
"""
|
136
|
-
print(self.TERMS_AND_CONDITIONS)
|
137
|
-
|
138
|
-
response = input("Nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận: ")
|
139
|
-
|
140
|
-
# If the user presses Enter without typing, default to "Tôi đồng ý"
|
141
|
-
if not response.strip():
|
142
|
-
response = "tôi đồng ý"
|
143
|
-
|
144
|
-
if response.strip().lower() == "tôi đồng ý":
|
145
|
-
from datetime import datetime
|
146
|
-
# get now time in string
|
147
|
-
now = datetime.now()
|
148
|
-
HARDWARE = await self.system_info()
|
149
|
-
# VERSION = pkg_resources.get_distribution('vnstock').version
|
150
|
-
|
151
|
-
VERSION = None
|
152
|
-
try:
|
153
|
-
VERSION = importlib.metadata.version('vnstock')
|
154
|
-
except importlib.metadata.PackageNotFoundError:
|
155
|
-
print("Package 'vnstock' not found")
|
156
|
-
|
157
|
-
# parse HARDWARE to string to store in the file
|
158
|
-
signed_aggreement = f"PHIÊN BẢN: {VERSION}\nMÔ TẢ:\nNgười dùng có mã nhận dạng {HARDWARE['uuid']} đã chấp nhận điều khoản & điều kiện sử dụng Vnstock lúc {now}\n---\n\nTHÔNG TIN THIẾT BỊ: {str(HARDWARE)}\n\nĐính kèm bản sao nội dung bạn đã đọc, hiểu rõ và đồng ý dưới đây:\n{self.TERMS_AND_CONDITIONS}"
|
159
|
-
# Store the acceptance
|
160
|
-
with open(self.TERMS_FILE_PATH, "w", encoding="utf-8") as f:
|
161
|
-
f.write(signed_aggreement)
|
162
|
-
print("---\nCảm ơn bạn đã chấp nhận điều khoản và điều kiện!\nBạn đã có thể tiếp tục sử dụng Vnstock!\nBạn có thể xem lại điều khoản và điều kiện tại đường dẫn sau: ", self.TERMS_FILE_PATH)
|
163
|
-
return True
|
164
|
-
else:
|
165
|
-
return False
|
166
|
-
|
167
|
-
async def send_analytics_data(self):
|
168
|
-
"""
|
169
|
-
Sends analytics data to a webhook.
|
170
|
-
"""
|
171
|
-
HARDWARE = await self.system_info()
|
172
|
-
WEBHOOK_URI = f"https://botbuilder.larksuite.com/api/trigger-webhook/{self.hook_id}"
|
173
|
-
|
174
|
-
data = {
|
175
|
-
"systems": HARDWARE,
|
176
|
-
"accepted_agreement": True,
|
177
|
-
"installed_packages": await self.packages_installed(),
|
178
|
-
}
|
179
|
-
|
180
|
-
try:
|
181
|
-
response = requests.post(WEBHOOK_URI, json=data)
|
182
|
-
except:
|
183
|
-
raise SystemExit("Không thể gửi dữ liệu phân tích. Vui lòng kiểm tra kết nối mạng và thử lại sau.")
|
184
|
-
|
185
|
-
async def check_terms_accepted(self):
|
186
|
-
"""
|
187
|
-
Checks if terms and conditions are accepted.
|
188
|
-
"""
|
189
|
-
if not self.TERMS_FILE_PATH.exists():
|
190
|
-
# If not, ask for acceptance
|
191
|
-
accepted = await self.show_terms_and_conditions()
|
192
|
-
if not accepted:
|
193
|
-
raise SystemExit("Điều khoản và điều kiện không được chấp nhận. Không thể tiếp tục.")
|
194
|
-
else:
|
195
|
-
await self.send_analytics_data()
|
196
|
-
|
197
|
-
async def packages_installed(self):
|
198
|
-
"""
|
199
|
-
Checks installed packages and returns a dictionary.
|
200
|
-
"""
|
201
|
-
# Define package mapping
|
202
|
-
package_mapping = {
|
203
|
-
"vnstock_family": [
|
204
|
-
"vnstock",
|
205
|
-
"vnstock3",
|
206
|
-
"vnstock_ezchart",
|
207
|
-
"vnstock_data_pro"
|
208
|
-
"vnstock_market_data_pipeline",
|
209
|
-
"vnstock_ta"
|
210
|
-
],
|
211
|
-
|
212
|
-
# Analytics
|
213
|
-
"analytics": [
|
214
|
-
"openbb",
|
215
|
-
"pandas_ta"
|
216
|
-
],
|
217
|
-
|
218
|
-
# Static charts
|
219
|
-
"static_charts": [
|
220
|
-
"matplotlib",
|
221
|
-
"seaborn",
|
222
|
-
"altair"
|
223
|
-
],
|
224
|
-
|
225
|
-
# Dashboard
|
226
|
-
"dashboard": [
|
227
|
-
"streamlit",
|
228
|
-
"voila",
|
229
|
-
"panel"
|
230
|
-
],
|
231
|
-
|
232
|
-
# Interactive charts
|
233
|
-
"interactive_charts": [
|
234
|
-
"mplfinance",
|
235
|
-
"plotly",
|
236
|
-
"plotline",
|
237
|
-
"bokeh",
|
238
|
-
"pyecharts",
|
239
|
-
"highcharts-core",
|
240
|
-
"highcharts-stock"
|
241
|
-
],
|
242
|
-
|
243
|
-
# Datafeed
|
244
|
-
"datafeed": [
|
245
|
-
"yfinance",
|
246
|
-
"alpha_vantage",
|
247
|
-
"pandas-datareader",
|
248
|
-
"investpy",
|
249
|
-
],
|
250
|
-
|
251
|
-
# Official API
|
252
|
-
"official_api": [
|
253
|
-
"ssi-fc-data",
|
254
|
-
"ssi-fctrading"
|
255
|
-
],
|
256
|
-
|
257
|
-
# Risk & Return
|
258
|
-
"risk_return": [
|
259
|
-
"pyfolio",
|
260
|
-
"empyrical",
|
261
|
-
"quantstats"
|
262
|
-
],
|
263
|
-
|
264
|
-
# Machine learning
|
265
|
-
"machine_learning": [
|
266
|
-
"scipy",
|
267
|
-
"sklearn",
|
268
|
-
"statsmodels",
|
269
|
-
"pytorch",
|
270
|
-
"tensorflow",
|
271
|
-
"keras",
|
272
|
-
"xgboost"
|
273
|
-
],
|
274
|
-
|
275
|
-
# Indicators
|
276
|
-
"indicators": [
|
277
|
-
"stochastic",
|
278
|
-
"talib",
|
279
|
-
"tqdm",
|
280
|
-
"finta",
|
281
|
-
"financetoolkit",
|
282
|
-
"tulipindicators"
|
283
|
-
],
|
284
|
-
|
285
|
-
# Backtesting
|
286
|
-
"backtesting": [
|
287
|
-
"vectorbt",
|
288
|
-
"backtesting",
|
289
|
-
"bt",
|
290
|
-
"zipline",
|
291
|
-
"pyalgotrade",
|
292
|
-
"backtrader",
|
293
|
-
"pybacktest"
|
294
|
-
],
|
295
|
-
|
296
|
-
# Server
|
297
|
-
"server": [
|
298
|
-
"fastapi",
|
299
|
-
"flask",
|
300
|
-
"uvicorn",
|
301
|
-
"gunicorn"
|
302
|
-
],
|
303
|
-
|
304
|
-
# Framework
|
305
|
-
"framework": [
|
306
|
-
"lightgbm",
|
307
|
-
"catboost",
|
308
|
-
"django",
|
309
|
-
]
|
310
|
-
}
|
311
|
-
|
312
|
-
# installed_packages = {}
|
313
|
-
|
314
|
-
# for category, packages in package_mapping.items():
|
315
|
-
# installed_packages[category] = []
|
316
|
-
# for pkg in packages:
|
317
|
-
# try:
|
318
|
-
# version = pkg_resources.get_distribution(pkg).version
|
319
|
-
# installed_packages[category].append((pkg, version))
|
320
|
-
# except pkg_resources.DistributionNotFound:
|
321
|
-
# pass
|
322
|
-
|
323
|
-
installed_packages = {}
|
324
|
-
|
325
|
-
for category, packages in package_mapping.items():
|
326
|
-
installed_packages[category] = []
|
327
|
-
for pkg in packages:
|
328
|
-
try:
|
329
|
-
version = importlib.metadata.version(pkg)
|
330
|
-
installed_packages[category].append((pkg, version))
|
331
|
-
except importlib.metadata.PackageNotFoundError:
|
332
|
-
pass
|
333
|
-
|
334
|
-
return installed_packages
|
335
|
-
|
336
|
-
async def main(hook_id='79a979882bc330f25b0e785eb13360be'):
|
337
|
-
vnstock_initializer = VnstockInitializer(hook_id)
|
338
|
-
await vnstock_initializer.check_terms_accepted()
|
339
|
-
|
340
|
-
# # Run the event loop
|
341
|
-
asyncio.run(main())
|
raw/setup.py
DELETED
vnai-0.0.5.dist-info/RECORD
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
raw/__init__.py,sha256=SShTBnlw4Lqo4PeJNtPr5-VjPaJqZsArFnugbZ0rg-I,14715
|
2
|
-
raw/analytics.py,sha256=KYGlbdqAkRcv8BLptz3REumyw90iwNc7ACvZ_idVacg,14534
|
3
|
-
raw/setup.py,sha256=FxCov16ZdUdEd6_WE-8msjFN2J9QeiidiU_FixaR9XU,204
|
4
|
-
vnai/__init__.py,sha256=SShTBnlw4Lqo4PeJNtPr5-VjPaJqZsArFnugbZ0rg-I,14715
|
5
|
-
vnai-0.0.5.dist-info/METADATA,sha256=jIO-uLkSr6K4-ZU1b-UMejkGJQZaK9SXPV5o7e5MuW8,576
|
6
|
-
vnai-0.0.5.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
7
|
-
vnai-0.0.5.dist-info/top_level.txt,sha256=ZLryI6oFu_mU1ls4sX_Sr5-MFWmEwlxu2Xe6EaEObI4,9
|
8
|
-
vnai-0.0.5.dist-info/RECORD,,
|
File without changes
|