gjdatac-api 0.2.5__tar.gz → 0.2.7__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.
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/PKG-INFO +1 -1
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api/data_api_class.py +271 -95
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api/dolphindb_info.py +0 -3
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api.egg-info/PKG-INFO +1 -1
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/setup.py +1 -1
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api/__init__.py +0 -0
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api/dict_data.py +0 -0
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api/instrument_class.py +0 -0
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api.egg-info/SOURCES.txt +0 -0
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api.egg-info/dependency_links.txt +0 -0
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api.egg-info/requires.txt +0 -0
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/gjdatac_api.egg-info/top_level.txt +0 -0
- {gjdatac_api-0.2.5 → gjdatac_api-0.2.7}/setup.cfg +0 -0
|
@@ -24,7 +24,7 @@ from .instrument_class import Instrument
|
|
|
24
24
|
|
|
25
25
|
class GJDataC:
|
|
26
26
|
|
|
27
|
-
def __init__(self, host, port, user_id, password):
|
|
27
|
+
def __init__(self, host, port, user_id, password, dolphindb_service):
|
|
28
28
|
"""
|
|
29
29
|
用于定义一些不同接口所需的变量以及一些初始化操作
|
|
30
30
|
:param host: 数据库地址
|
|
@@ -56,11 +56,12 @@ class GJDataC:
|
|
|
56
56
|
# 连接数据库
|
|
57
57
|
db_session = ddb.session()
|
|
58
58
|
# 原始方式
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
if not self.sites:
|
|
60
|
+
success = db_session.connect(self.host, self.port, self.user_id, self.password)
|
|
61
|
+
else:
|
|
62
|
+
# 创建连接;开启高可用,并指定sites为所有可用节点的ip:port
|
|
63
|
+
success = db_session.connect(self.host, self.port, self.user_id, self.password, highAvailability=True,
|
|
64
|
+
highAvailabilitySites=self.sites)
|
|
64
65
|
if not success:
|
|
65
66
|
raise Exception("please check your database connection information")
|
|
66
67
|
|
|
@@ -295,6 +296,116 @@ class GJDataC:
|
|
|
295
296
|
bar_db_session.close()
|
|
296
297
|
return 'option'
|
|
297
298
|
|
|
299
|
+
@staticmethod
|
|
300
|
+
def format_date(input_date):
|
|
301
|
+
"""
|
|
302
|
+
将输入的日期转换为指定格式的字符串。
|
|
303
|
+
|
|
304
|
+
参数:
|
|
305
|
+
input_date: 输入的日期,可以是 datetime、date 或 str 类型。
|
|
306
|
+
支持的字符串格式包括:
|
|
307
|
+
- "YYYY-MM-DD HH:MM:SS"
|
|
308
|
+
- "YYYY-MM-DD"
|
|
309
|
+
- "YYYY.MM.DD HH:MM:SS"
|
|
310
|
+
- "YYYY.MM.DD"
|
|
311
|
+
|
|
312
|
+
返回:
|
|
313
|
+
str: 转换后的日期字符串,格式为 "YYYY.MM.DD HH:MM:SS" 或 "YYYY.MM.DD"。
|
|
314
|
+
"""
|
|
315
|
+
# 如果输入是 datetime 类型
|
|
316
|
+
if isinstance(input_date, datetime.datetime):
|
|
317
|
+
if input_date.hour == 0 and input_date.minute == 0 and input_date.second == 0:
|
|
318
|
+
return input_date.strftime("%Y.%m.%d")
|
|
319
|
+
else:
|
|
320
|
+
return input_date.strftime("%Y.%m.%d %H:%M:%S")
|
|
321
|
+
|
|
322
|
+
# 如果输入是 date 类型
|
|
323
|
+
elif isinstance(input_date, datetime.date):
|
|
324
|
+
return input_date.strftime("%Y.%m.%d")
|
|
325
|
+
|
|
326
|
+
# 如果输入是字符串类型
|
|
327
|
+
elif isinstance(input_date, str):
|
|
328
|
+
try:
|
|
329
|
+
# 尝试解析包含时间的格式
|
|
330
|
+
dt = datetime.datetime.strptime(input_date, "%Y-%m-%d %H:%M:%S")
|
|
331
|
+
return dt.strftime("%Y.%m.%d %H:%M:%S")
|
|
332
|
+
except ValueError:
|
|
333
|
+
try:
|
|
334
|
+
# 尝试解析不包含时间的格式
|
|
335
|
+
dt = datetime.datetime.strptime(input_date, "%Y-%m-%d")
|
|
336
|
+
return dt.strftime("%Y.%m.%d")
|
|
337
|
+
except ValueError:
|
|
338
|
+
try:
|
|
339
|
+
# 尝试解析包含时间的点分隔格式
|
|
340
|
+
dt = datetime.datetime.strptime(input_date, "%Y.%m.%d %H:%M:%S")
|
|
341
|
+
return dt.strftime("%Y.%m.%d %H:%M:%S")
|
|
342
|
+
except ValueError:
|
|
343
|
+
try:
|
|
344
|
+
# 尝试解析不包含时间的点分隔格式
|
|
345
|
+
dt = datetime.datetime.strptime(input_date, "%Y.%m.%d")
|
|
346
|
+
return dt.strftime("%Y.%m.%d")
|
|
347
|
+
except ValueError:
|
|
348
|
+
raise ValueError("输入的日期格式不支持")
|
|
349
|
+
|
|
350
|
+
# 如果输入类型不支持
|
|
351
|
+
else:
|
|
352
|
+
raise TypeError("输入类型必须是 datetime、date 或 对应格式的str")
|
|
353
|
+
|
|
354
|
+
@staticmethod
|
|
355
|
+
def format_date_split_by_(input_date):
|
|
356
|
+
"""
|
|
357
|
+
将输入的日期转换为指定格式的字符串。
|
|
358
|
+
|
|
359
|
+
参数:
|
|
360
|
+
input_date: 输入的日期,可以是 datetime、date 或 str 类型。
|
|
361
|
+
支持的字符串格式包括:
|
|
362
|
+
- "YYYY-MM-DD HH:MM:SS"
|
|
363
|
+
- "YYYY-MM-DD"
|
|
364
|
+
- "YYYY.MM.DD HH:MM:SS"
|
|
365
|
+
- "YYYY.MM.DD"
|
|
366
|
+
|
|
367
|
+
返回:
|
|
368
|
+
str: 转换后的日期字符串,格式为 "YYYY.MM.DD HH:MM:SS" 或 "YYYY.MM.DD"。
|
|
369
|
+
"""
|
|
370
|
+
# 如果输入是 datetime 类型
|
|
371
|
+
if isinstance(input_date, datetime.datetime):
|
|
372
|
+
if input_date.hour == 0 and input_date.minute == 0 and input_date.second == 0:
|
|
373
|
+
return input_date.strftime("%Y-%m-%d")
|
|
374
|
+
else:
|
|
375
|
+
return input_date.strftime("%Y-%m-%d %H:%M:%S")
|
|
376
|
+
|
|
377
|
+
# 如果输入是 date 类型
|
|
378
|
+
elif isinstance(input_date, datetime.date):
|
|
379
|
+
return input_date.strftime("%Y-%m-%d")
|
|
380
|
+
|
|
381
|
+
# 如果输入是字符串类型
|
|
382
|
+
elif isinstance(input_date, str):
|
|
383
|
+
try:
|
|
384
|
+
# 尝试解析包含时间的格式
|
|
385
|
+
dt = datetime.datetime.strptime(input_date, "%Y-%m-%d %H:%M:%S")
|
|
386
|
+
return dt.strftime("%Y-%m-%d %H:%M:%S")
|
|
387
|
+
except ValueError:
|
|
388
|
+
try:
|
|
389
|
+
# 尝试解析不包含时间的格式
|
|
390
|
+
dt = datetime.datetime.strptime(input_date, "%Y-%m-%d")
|
|
391
|
+
return dt.strftime("%Y-%m-%d")
|
|
392
|
+
except ValueError:
|
|
393
|
+
try:
|
|
394
|
+
# 尝试解析包含时间的点分隔格式
|
|
395
|
+
dt = datetime.datetime.strptime(input_date, "%Y.%m.%d %H:%M:%S")
|
|
396
|
+
return dt.strftime("%Y-%m-%d %H:%M:%S")
|
|
397
|
+
except ValueError:
|
|
398
|
+
try:
|
|
399
|
+
# 尝试解析不包含时间的点分隔格式
|
|
400
|
+
dt = datetime.datetime.strptime(input_date, "%Y.%m.%d")
|
|
401
|
+
return dt.strftime("%Y-%m-%d")
|
|
402
|
+
except ValueError:
|
|
403
|
+
raise ValueError("输入的日期格式不支持")
|
|
404
|
+
|
|
405
|
+
# 如果输入类型不支持
|
|
406
|
+
else:
|
|
407
|
+
raise TypeError("输入类型必须是 datetime、date 或 对应格式的str")
|
|
408
|
+
|
|
298
409
|
""" get_price(获取行情数据接口) """
|
|
299
410
|
|
|
300
411
|
def get_price(self, order_book_ids=None, asset_type="future", frequency=None, start_date=None, end_date=None,
|
|
@@ -411,18 +522,20 @@ class GJDataC:
|
|
|
411
522
|
if (start_date and not end_date) or (not start_date and end_date):
|
|
412
523
|
raise ValueError("start_date and end_date should be both provided or not provided at all")
|
|
413
524
|
if start_date and end_date:
|
|
525
|
+
self.format_date(start_date)
|
|
526
|
+
self.format_date(end_date)
|
|
414
527
|
# 如果提供了,则进行进一步校验
|
|
415
|
-
is_start_datetime = self._is_convertible_datetime(start_date)
|
|
416
|
-
is_end_datetime = self._is_convertible_datetime(end_date)
|
|
417
|
-
if not is_end_datetime or not is_start_datetime:
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
# 如果传入的数据类型符合要求,进行转换
|
|
423
|
-
start_date, end_date = self._get_price_convert_start_end_date(start_date, end_date)
|
|
424
|
-
if start_date > end_date:
|
|
425
|
-
|
|
528
|
+
# is_start_datetime = self._is_convertible_datetime(start_date)
|
|
529
|
+
# is_end_datetime = self._is_convertible_datetime(end_date)
|
|
530
|
+
# if not is_end_datetime or not is_start_datetime:
|
|
531
|
+
# raise ValueError(
|
|
532
|
+
# "start_date and end_date should be datetime.datetime objects or "
|
|
533
|
+
# "convertible to datetime.datetime objects")
|
|
534
|
+
#
|
|
535
|
+
# # 如果传入的数据类型符合要求,进行转换
|
|
536
|
+
# start_date, end_date = self._get_price_convert_start_end_date(start_date, end_date)
|
|
537
|
+
# if start_date > end_date:
|
|
538
|
+
# raise ValueError("start_date should be earlier than end_date")
|
|
426
539
|
|
|
427
540
|
@staticmethod
|
|
428
541
|
def _get_price_convert_start_end_date(start_date, end_date):
|
|
@@ -618,8 +731,10 @@ class GJDataC:
|
|
|
618
731
|
limit_data = get_price_data.where(f"instrument_id in {order_book_ids}")
|
|
619
732
|
|
|
620
733
|
# 将日期转换成 DolphinDB 识别的日期格式,用于筛选数据
|
|
621
|
-
format_start_date = self.get_price_format_date(start_date)
|
|
622
|
-
format_end_date = self.get_price_format_date(end_date)
|
|
734
|
+
# format_start_date = self.get_price_format_date(start_date)
|
|
735
|
+
# format_end_date = self.get_price_format_date(end_date)
|
|
736
|
+
format_start_date = self.format_date(start_date)
|
|
737
|
+
format_end_date = self.format_date(end_date)
|
|
623
738
|
|
|
624
739
|
# 根据日期对数据再次进行筛选,最大程度减轻数据库压力
|
|
625
740
|
limit_data = limit_data.where(f"trade_time >= {format_start_date} and trade_time <= {format_end_date}")
|
|
@@ -1041,6 +1156,7 @@ class GJDataC:
|
|
|
1041
1156
|
raise ValueError("date parameter error, type should be str or datetime.date")
|
|
1042
1157
|
|
|
1043
1158
|
if isinstance(date, str):
|
|
1159
|
+
date = self.format_date_split_by_(date)
|
|
1044
1160
|
date = datetime.datetime.strptime(date, "%Y-%m-%d").date()
|
|
1045
1161
|
|
|
1046
1162
|
return self.get_dates_in_n(date, n)
|
|
@@ -1069,6 +1185,8 @@ class GJDataC:
|
|
|
1069
1185
|
start_date = self._get_trading_dates_by_start_end(start_date)
|
|
1070
1186
|
if isinstance(end_date, str):
|
|
1071
1187
|
end_date = self._get_trading_dates_by_start_end(end_date)
|
|
1188
|
+
|
|
1189
|
+
|
|
1072
1190
|
# 筛选 trading_day_str 列在 start_date 和 end_date 之间的数据
|
|
1073
1191
|
# filtered_df = trading_params_data.loc[
|
|
1074
1192
|
# (trading_params_data['trading_day_str'] >= start_date) & (
|
|
@@ -1304,7 +1422,8 @@ class GJDataC:
|
|
|
1304
1422
|
|
|
1305
1423
|
# 根据 date 筛选数据
|
|
1306
1424
|
# 将日期转换成 DolphinDB 识别的日期格式,用于筛选数据
|
|
1307
|
-
dolphin_date = self.get_margin_ratio_date_to_dolphin_time(date)
|
|
1425
|
+
# dolphin_date = self.get_margin_ratio_date_to_dolphin_time(date)
|
|
1426
|
+
dolphin_date = self.format_date(date)
|
|
1308
1427
|
date_data = data.where(f"trading_day = {dolphin_date}")
|
|
1309
1428
|
|
|
1310
1429
|
# 根据 exchange 筛选数据
|
|
@@ -1369,11 +1488,13 @@ class GJDataC:
|
|
|
1369
1488
|
:return: None
|
|
1370
1489
|
"""
|
|
1371
1490
|
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1491
|
+
self.format_date(date)
|
|
1492
|
+
|
|
1493
|
+
# if isinstance(date, (str, datetime.date, datetime.datetime)):
|
|
1494
|
+
# if isinstance(date, str) and not self.general_validate_date(date):
|
|
1495
|
+
# raise ValueError("date is not a valid date string format")
|
|
1496
|
+
# else:
|
|
1497
|
+
# raise ValueError("date type error, please pass in str, datetime.date or datetime.datetime type")
|
|
1377
1498
|
|
|
1378
1499
|
""" get_fee 期货交割手续费 """
|
|
1379
1500
|
|
|
@@ -1470,7 +1591,8 @@ class GJDataC:
|
|
|
1470
1591
|
|
|
1471
1592
|
# 根据 date 筛选数据
|
|
1472
1593
|
# 将日期转换成 DolphinDB 识别的日期格式,用于筛选数据
|
|
1473
|
-
dolphin_date = self.get_fee_datetime_to_dolphin_time(date)
|
|
1594
|
+
# dolphin_date = self.get_fee_datetime_to_dolphin_time(date)
|
|
1595
|
+
dolphin_date = self.format_date(date)
|
|
1474
1596
|
|
|
1475
1597
|
date_data = get_fee_data.where(f"trading_day = {dolphin_date}")
|
|
1476
1598
|
|
|
@@ -1502,12 +1624,14 @@ class GJDataC:
|
|
|
1502
1624
|
# 校验参数是否必填
|
|
1503
1625
|
self.general_validate_params_required(date, "date")
|
|
1504
1626
|
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1627
|
+
self.format_date(date)
|
|
1628
|
+
|
|
1629
|
+
# # 校验参数类型格式
|
|
1630
|
+
# if isinstance(date, (str, datetime.date, datetime.datetime)):
|
|
1631
|
+
# if isinstance(date, str) and not self.general_validate_date(date):
|
|
1632
|
+
# raise ValueError("date is not a valid date string format")
|
|
1633
|
+
# else:
|
|
1634
|
+
# raise ValueError("date type error, please pass in str, datetime.date or datetime.datetime type")
|
|
1511
1635
|
|
|
1512
1636
|
@staticmethod
|
|
1513
1637
|
def get_fee_handle_data(data):
|
|
@@ -1590,7 +1714,8 @@ class GJDataC:
|
|
|
1590
1714
|
|
|
1591
1715
|
# 根据 date 筛选数据
|
|
1592
1716
|
# 将日期转换成 DolphinDB 识别的日期格式,用于筛选数据
|
|
1593
|
-
dolphin_date = self.get_limit_position_date_to_dolphin_time(date)
|
|
1717
|
+
# dolphin_date = self.get_limit_position_date_to_dolphin_time(date)
|
|
1718
|
+
dolphin_date = self.format_date(date)
|
|
1594
1719
|
date_data = data.where(f"trading_day = {dolphin_date}")
|
|
1595
1720
|
|
|
1596
1721
|
# 根据 order_book_id 和 commodity 获取数据
|
|
@@ -1627,11 +1752,13 @@ class GJDataC:
|
|
|
1627
1752
|
:return: None
|
|
1628
1753
|
"""
|
|
1629
1754
|
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1755
|
+
self.format_date(date)
|
|
1756
|
+
|
|
1757
|
+
# if isinstance(date, (str, datetime.date, datetime.datetime)):
|
|
1758
|
+
# if isinstance(date, str) and not self.general_validate_date(date):
|
|
1759
|
+
# raise ValueError("date is not a valid date string format")
|
|
1760
|
+
# else:
|
|
1761
|
+
# raise ValueError("date type error, please pass in str, datetime.date or datetime.datetime type")
|
|
1635
1762
|
|
|
1636
1763
|
@staticmethod
|
|
1637
1764
|
def get_limit_position_handle_data(data):
|
|
@@ -1808,8 +1935,12 @@ class GJDataC:
|
|
|
1808
1935
|
|
|
1809
1936
|
# 根据日期筛选数据
|
|
1810
1937
|
# 将日期转换成 DolphinDB 识别的日期格式,用于筛选数据
|
|
1811
|
-
start_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(start_date)
|
|
1812
|
-
end_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(end_date)
|
|
1938
|
+
# start_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(start_date)
|
|
1939
|
+
# end_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(end_date)
|
|
1940
|
+
|
|
1941
|
+
start_dolphin_date = self.format_date(start_date)
|
|
1942
|
+
end_dolphin_date = self.format_date(end_date)
|
|
1943
|
+
|
|
1813
1944
|
date_data = code_data.where(f"trading_day >= {start_dolphin_date} and trading_day <= {end_dolphin_date}")
|
|
1814
1945
|
|
|
1815
1946
|
if compute_type:
|
|
@@ -1844,8 +1975,11 @@ class GJDataC:
|
|
|
1844
1975
|
|
|
1845
1976
|
# 根据日期筛选数据
|
|
1846
1977
|
# 将日期转换成 DolphinDB 识别的日期格式,用于筛选数据
|
|
1847
|
-
start_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(start_date)
|
|
1848
|
-
end_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(end_date)
|
|
1978
|
+
# start_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(start_date)
|
|
1979
|
+
# end_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(end_date)
|
|
1980
|
+
start_dolphin_date = self.format_date(start_date)
|
|
1981
|
+
end_dolphin_date = self.format_date(end_date)
|
|
1982
|
+
|
|
1849
1983
|
date_data = code_data.where(f"trading_day >= {start_dolphin_date} and trading_day <= {end_dolphin_date}")
|
|
1850
1984
|
|
|
1851
1985
|
# 根据表中的 rank 字段筛选主力/次主力合约,rank == 1是主力合约, 2 是次主力合约
|
|
@@ -1875,8 +2009,10 @@ class GJDataC:
|
|
|
1875
2009
|
|
|
1876
2010
|
# 根据日期筛选数据
|
|
1877
2011
|
# 将日期转换成 DolphinDB 识别的日期格式,用于筛选数据
|
|
1878
|
-
start_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(start_date)
|
|
1879
|
-
end_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(end_date)
|
|
2012
|
+
# start_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(start_date)
|
|
2013
|
+
# end_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(end_date)
|
|
2014
|
+
start_dolphin_date = self.format_date(start_date)
|
|
2015
|
+
end_dolphin_date = self.format_date(end_date)
|
|
1880
2016
|
date_data = tick_data.where(f"trading_day >= {start_dolphin_date} and trading_day <= {end_dolphin_date}")
|
|
1881
2017
|
|
|
1882
2018
|
instrument_data = date_data.where(f"instrument_id in {data['instrument_id'].tolist()}")
|
|
@@ -1912,13 +2048,18 @@ class GJDataC:
|
|
|
1912
2048
|
:return: None
|
|
1913
2049
|
"""
|
|
1914
2050
|
# 校验start_date 和 end_date 是否为datetime.date类型或者可以转换成该类型的str
|
|
1915
|
-
if isinstance(start_date, (str, datetime.date)) and isinstance(end_date, (str, datetime.date)):
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
else:
|
|
1921
|
-
|
|
2051
|
+
# if isinstance(start_date, (str, datetime.date)) and isinstance(end_date, (str, datetime.date)):
|
|
2052
|
+
# if isinstance(start_date, str) and not self.general_validate_date_str_is_date_type(start_date):
|
|
2053
|
+
# raise ValueError("start_date type error, please enter datetime.date type")
|
|
2054
|
+
# if isinstance(end_date, str) and not self.general_validate_date_str_is_date_type(end_date):
|
|
2055
|
+
# raise ValueError("start_date type error, please enter datetime.date type")
|
|
2056
|
+
# else:
|
|
2057
|
+
# raise ValueError("start_date or end_date type error, please enter datetime.date type")
|
|
2058
|
+
|
|
2059
|
+
|
|
2060
|
+
|
|
2061
|
+
self.format_date(start_date)
|
|
2062
|
+
self.format_date(end_date)
|
|
1922
2063
|
|
|
1923
2064
|
# 校验begin_date 是否为datetime.datetime类型或者为可以转换为该类型的字符串
|
|
1924
2065
|
# if isinstance(begin_date, (str, datetime.datetime)):
|
|
@@ -2135,17 +2276,21 @@ class GJDataC:
|
|
|
2135
2276
|
:param end_date: 结束日期
|
|
2136
2277
|
:return: None
|
|
2137
2278
|
"""
|
|
2138
|
-
error_msg = "start_date or end_date type error, datetime.date, datetime.datetime, pandasTimestamp type or can be converted to the type"
|
|
2139
2279
|
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2280
|
+
self.format_date(start_date)
|
|
2281
|
+
self.format_date(end_date)
|
|
2282
|
+
|
|
2283
|
+
# error_msg = "start_date or end_date type error, datetime.date, datetime.datetime, pandasTimestamp type or can be converted to the type"
|
|
2284
|
+
|
|
2285
|
+
# # 校验start_date 和 end_date 是否为datetime.date, datetime.datetime, pandasTimestamp类型或者可以转换成该类型的str
|
|
2286
|
+
# if isinstance(start_date, (str, datetime.date, datetime.datetime, pd.Timestamp)) and isinstance(end_date, (
|
|
2287
|
+
# str, datetime.date, datetime.datetime, pd.Timestamp)):
|
|
2288
|
+
# if isinstance(start_date, str) and not self.general_validate_date(start_date):
|
|
2289
|
+
# raise ValueError(error_msg)
|
|
2290
|
+
# if isinstance(end_date, str) and not self.general_validate_date(end_date):
|
|
2291
|
+
# raise ValueError(error_msg)
|
|
2292
|
+
# else:
|
|
2293
|
+
# raise ValueError(error_msg)
|
|
2149
2294
|
|
|
2150
2295
|
def get_basic_data_get_data(self, order_book_id, asset_type, start_date, end_date):
|
|
2151
2296
|
"""
|
|
@@ -2176,12 +2321,15 @@ class GJDataC:
|
|
|
2176
2321
|
库存表的 data_date 字段为 STRING 类型,筛选日期时,需要提供和表中格式一致的数据,才能筛选,例如:2024-12-01
|
|
2177
2322
|
'''
|
|
2178
2323
|
# 将日期转换为 DolphinDB 的时间格式
|
|
2179
|
-
start_dolphin_date = self._get_basic_data_date_to_dolphin_time(start_date, asset_type)
|
|
2180
|
-
end_dolphin_date = self._get_basic_data_date_to_dolphin_time(end_date, asset_type)
|
|
2324
|
+
# start_dolphin_date = self._get_basic_data_date_to_dolphin_time(start_date, asset_type)
|
|
2325
|
+
# end_dolphin_date = self._get_basic_data_date_to_dolphin_time(end_date, asset_type)
|
|
2326
|
+
start_dolphin_date = self.format_date(start_date)
|
|
2327
|
+
end_dolphin_date = self.format_date(end_date)
|
|
2328
|
+
|
|
2181
2329
|
|
|
2182
2330
|
# 此处还需要判断的原因是,因为对 dolphindb 中不同的日期数据类型查询数据的语法不同
|
|
2183
2331
|
asset_type_data = product_data.where(
|
|
2184
|
-
f"data_date>=
|
|
2332
|
+
f"data_date>={start_dolphin_date} and data_date<={end_dolphin_date}") if asset_type == '库存' \
|
|
2185
2333
|
else product_data.where(f"date>={start_dolphin_date} and date<={end_dolphin_date}")
|
|
2186
2334
|
|
|
2187
2335
|
return asset_type_data.toDF(), db_session
|
|
@@ -2243,10 +2391,10 @@ class GJDataC:
|
|
|
2243
2391
|
}, inplace=True)
|
|
2244
2392
|
# 处理库存
|
|
2245
2393
|
else:
|
|
2246
|
-
new_df.rename(columns={'product_id': 'order_book_id', '
|
|
2394
|
+
new_df.rename(columns={'product_id': 'order_book_id', 'data_date': 'date', 'inventory_value': 'value'},
|
|
2247
2395
|
inplace=True)
|
|
2248
2396
|
|
|
2249
|
-
return new_df[['order_book_id', 'asset_type', '
|
|
2397
|
+
return new_df[['order_book_id', 'asset_type', 'date', 'value']]
|
|
2250
2398
|
|
|
2251
2399
|
""" get_warehouse_stocks_future 仓单数据 """
|
|
2252
2400
|
|
|
@@ -2265,7 +2413,11 @@ class GJDataC:
|
|
|
2265
2413
|
self.get_warehouse_stocks_future_validate_required_params(commodity, start_date, end_date)
|
|
2266
2414
|
|
|
2267
2415
|
# 校验commodity, start_date, end_date 是否为str类型
|
|
2268
|
-
self.get_warehouse_stocks_future_validate_type_str(commodity
|
|
2416
|
+
self.get_warehouse_stocks_future_validate_type_str(commodity)
|
|
2417
|
+
|
|
2418
|
+
# 校验start_date, end_date
|
|
2419
|
+
start_date = self.format_date_split_by_(start_date)
|
|
2420
|
+
end_date = self.format_date_split_by_(end_date)
|
|
2269
2421
|
|
|
2270
2422
|
""" 获取数据 """
|
|
2271
2423
|
# 从数据库中获取数据
|
|
@@ -2296,7 +2448,7 @@ class GJDataC:
|
|
|
2296
2448
|
for key, value in params_dict.items():
|
|
2297
2449
|
self.general_validate_params_required(value, key)
|
|
2298
2450
|
|
|
2299
|
-
def get_warehouse_stocks_future_validate_type_str(self, commodity
|
|
2451
|
+
def get_warehouse_stocks_future_validate_type_str(self, commodity):
|
|
2300
2452
|
"""
|
|
2301
2453
|
校验参数类型是否为str
|
|
2302
2454
|
:param commodity: str--必填,期货合约品种
|
|
@@ -2307,8 +2459,8 @@ class GJDataC:
|
|
|
2307
2459
|
|
|
2308
2460
|
params_dict = {
|
|
2309
2461
|
"commodity": commodity,
|
|
2310
|
-
"start_date": start_date,
|
|
2311
|
-
"end_date": end_date
|
|
2462
|
+
# "start_date": start_date,
|
|
2463
|
+
# "end_date": end_date
|
|
2312
2464
|
}
|
|
2313
2465
|
|
|
2314
2466
|
for key, value in params_dict.items():
|
|
@@ -2354,6 +2506,8 @@ class GJDataC:
|
|
|
2354
2506
|
:return: 过滤后的数据
|
|
2355
2507
|
"""
|
|
2356
2508
|
|
|
2509
|
+
|
|
2510
|
+
|
|
2357
2511
|
start_date = self._get_warehouse_stocks_future_date_conversion(start_date)
|
|
2358
2512
|
end_date = self._get_warehouse_stocks_future_date_conversion(end_date)
|
|
2359
2513
|
|
|
@@ -2495,8 +2649,10 @@ class GJDataC:
|
|
|
2495
2649
|
:return: None
|
|
2496
2650
|
"""
|
|
2497
2651
|
|
|
2498
|
-
self._get_vwap_validate_date_type(start_date, "start_date")
|
|
2499
|
-
self._get_vwap_validate_date_type(end_date, "end_date")
|
|
2652
|
+
# self._get_vwap_validate_date_type(start_date, "start_date")
|
|
2653
|
+
# self._get_vwap_validate_date_type(end_date, "end_date")
|
|
2654
|
+
self.format_date(start_date)
|
|
2655
|
+
self.format_date(end_date)
|
|
2500
2656
|
|
|
2501
2657
|
def _get_vwap_validate_date_type(self, date_str, date_str_name):
|
|
2502
2658
|
"""
|
|
@@ -2587,8 +2743,10 @@ class GJDataC:
|
|
|
2587
2743
|
limit_data = get_vwap_data.where(f"instrument_id in {order_book_ids}")
|
|
2588
2744
|
|
|
2589
2745
|
# 将日期转换成 DolphinDB 识别的日期格式,用于筛选数据
|
|
2590
|
-
format_start_date = self.get_vwap_format_date(start_date)
|
|
2591
|
-
format_end_date = self.get_vwap_format_date(end_date)
|
|
2746
|
+
# format_start_date = self.get_vwap_format_date(start_date)
|
|
2747
|
+
# format_end_date = self.get_vwap_format_date(end_date)
|
|
2748
|
+
format_start_date = self.format_date(start_date)
|
|
2749
|
+
format_end_date = self.format_date(end_date)
|
|
2592
2750
|
|
|
2593
2751
|
# 根据日期对数据再次进行筛选,最大程度减轻数据库压力
|
|
2594
2752
|
limit_data = limit_data.where(f"trade_time >= {format_start_date} and trade_time <= {format_end_date}").where(
|
|
@@ -2736,8 +2894,11 @@ class GJDataC:
|
|
|
2736
2894
|
:return: None
|
|
2737
2895
|
"""
|
|
2738
2896
|
|
|
2739
|
-
self.
|
|
2740
|
-
self.
|
|
2897
|
+
self.format_date(start_date)
|
|
2898
|
+
self.format_date(end_date)
|
|
2899
|
+
|
|
2900
|
+
# self._get_twap_validate_date_type(start_date, "start_date")
|
|
2901
|
+
# self._get_twap_validate_date_type(end_date, "end_date")
|
|
2741
2902
|
|
|
2742
2903
|
def _get_twap_validate_date_type(self, date_str, date_str_name):
|
|
2743
2904
|
"""
|
|
@@ -2801,8 +2962,11 @@ class GJDataC:
|
|
|
2801
2962
|
limit_data = get_vwap_data.where(f"instrument_id in {order_book_ids}")
|
|
2802
2963
|
|
|
2803
2964
|
# 将日期转换成 DolphinDB 识别的日期格式,用于筛选数据
|
|
2804
|
-
format_start_date = self.get_twap_format_date(start_date)
|
|
2805
|
-
format_end_date = self.get_twap_format_date(end_date)
|
|
2965
|
+
# format_start_date = self.get_twap_format_date(start_date)
|
|
2966
|
+
# format_end_date = self.get_twap_format_date(end_date)
|
|
2967
|
+
|
|
2968
|
+
format_start_date = self.format_date(start_date)
|
|
2969
|
+
format_end_date = self.format_date(end_date)
|
|
2806
2970
|
|
|
2807
2971
|
# 根据日期对数据再次进行筛选,最大程度减轻数据库压力
|
|
2808
2972
|
limit_data = limit_data.where(f"trade_time >= {format_start_date} and trade_time <= {format_end_date}").where(
|
|
@@ -2950,10 +3114,10 @@ class GJDataC:
|
|
|
2950
3114
|
self._get_history_bar_validate_params(datetime_str, instrument_id, bar_count, frequency, fields)
|
|
2951
3115
|
|
|
2952
3116
|
# 转换日期格式
|
|
2953
|
-
|
|
3117
|
+
query_time = self._get_history_bar_parse_datetime(datetime_str)
|
|
2954
3118
|
|
|
2955
3119
|
# 执行查询并筛选数据
|
|
2956
|
-
result, bar_db_session = self._get_history_bar_execute_query(frequency, instrument_id,
|
|
3120
|
+
result, bar_db_session = self._get_history_bar_execute_query(frequency, instrument_id, query_time,
|
|
2957
3121
|
bar_count)
|
|
2958
3122
|
# 此处在所有的查询筛选都在数据库层面进行完后,再关闭连接
|
|
2959
3123
|
# 如果将dolphindb的Table对象转换成DataFrame时,如果数据量较大,那么需要耗费的时间较长,所以尽可能将所有的筛选在数据库层面完成
|
|
@@ -2962,7 +3126,6 @@ class GJDataC:
|
|
|
2962
3126
|
# 处理结果
|
|
2963
3127
|
return self._get_history_bar_process_result(result, instrument_id, fields, bar_count)
|
|
2964
3128
|
else:
|
|
2965
|
-
print("22222")
|
|
2966
3129
|
return self.get_history_bar(instrument_id, start_date, end_date, frequency, fields)
|
|
2967
3130
|
|
|
2968
3131
|
def _get_history_bar_validate_params(self, datetime_str, instrument_id, bar_count,
|
|
@@ -3021,8 +3184,8 @@ class GJDataC:
|
|
|
3021
3184
|
else:
|
|
3022
3185
|
return False
|
|
3023
3186
|
|
|
3024
|
-
@staticmethod
|
|
3025
|
-
def _get_history_bar_parse_datetime(datetime_str):
|
|
3187
|
+
# @staticmethod
|
|
3188
|
+
def _get_history_bar_parse_datetime(self, datetime_str):
|
|
3026
3189
|
"""
|
|
3027
3190
|
解析日期时间字符串
|
|
3028
3191
|
Args:
|
|
@@ -3034,11 +3197,14 @@ class GJDataC:
|
|
|
3034
3197
|
|
|
3035
3198
|
"""
|
|
3036
3199
|
|
|
3037
|
-
|
|
3038
|
-
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
|
|
3200
|
+
return self.format_date(datetime_str)
|
|
3201
|
+
|
|
3202
|
+
# try:
|
|
3203
|
+
# return datetime.datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S') if isinstance(datetime_str, str) \
|
|
3204
|
+
# else datetime_str
|
|
3205
|
+
# except ValueError:
|
|
3206
|
+
# raise ValueError("Invalid datetime format, should be 'YYYY-MM-DD HH:MM:SS'")
|
|
3207
|
+
|
|
3042
3208
|
|
|
3043
3209
|
def _get_history_bar_execute_query(self, frequency, instrument_id, datetime_str, bar_count):
|
|
3044
3210
|
"""
|
|
@@ -3092,7 +3258,8 @@ class GJDataC:
|
|
|
3092
3258
|
else:
|
|
3093
3259
|
raise Exception("frequency is not valid or frequency is not valid for this frequency")
|
|
3094
3260
|
|
|
3095
|
-
|
|
3261
|
+
@staticmethod
|
|
3262
|
+
def _get_history_bar_filter_data(table_data, instrument_id, datetime_str, bar_count):
|
|
3096
3263
|
"""
|
|
3097
3264
|
筛选数据
|
|
3098
3265
|
Args:
|
|
@@ -3115,6 +3282,7 @@ class GJDataC:
|
|
|
3115
3282
|
.where(f"trading_day <= {dolphin_date}")
|
|
3116
3283
|
.sort("trading_day", ascending=False)
|
|
3117
3284
|
.limit(bar_count))
|
|
3285
|
+
|
|
3118
3286
|
else:
|
|
3119
3287
|
query_data = (table_data.where(f"instrument_id in {instrument_id}")
|
|
3120
3288
|
.where(f"trading_day <= {dolphin_date}")
|
|
@@ -3283,8 +3451,13 @@ class GJDataC:
|
|
|
3283
3451
|
# 获取数据
|
|
3284
3452
|
table_data, bars_db_session = self.connect_db(table_info[0], table_info[1])
|
|
3285
3453
|
|
|
3454
|
+
# 转换日期格式
|
|
3455
|
+
conv_start_date = self.format_date(start_date)
|
|
3456
|
+
conv_end_date = self.format_date(end_date)
|
|
3457
|
+
|
|
3458
|
+
|
|
3286
3459
|
# 筛选数据
|
|
3287
|
-
query_data = self._get_history_bars_filter_data(table_data, instrument_id,
|
|
3460
|
+
query_data = self._get_history_bars_filter_data(table_data, instrument_id, conv_start_date, conv_end_date)
|
|
3288
3461
|
|
|
3289
3462
|
return query_data.toDF(), bars_db_session
|
|
3290
3463
|
|
|
@@ -3636,7 +3809,8 @@ class GJDataC:
|
|
|
3636
3809
|
:return: 查询到的交易日或时间点列表
|
|
3637
3810
|
"""
|
|
3638
3811
|
# 将 trade_time 转换为 datetime 对象
|
|
3639
|
-
trade_time =
|
|
3812
|
+
trade_time = self.format_date(trade_time)
|
|
3813
|
+
|
|
3640
3814
|
|
|
3641
3815
|
# 获取交易日历数据
|
|
3642
3816
|
trading_dates = self.get_trading_dates_data()
|
|
@@ -3747,6 +3921,8 @@ class GJDataC:
|
|
|
3747
3921
|
"""
|
|
3748
3922
|
|
|
3749
3923
|
data, db_session = self.connect_db(trading_dates_db_table_name, trading_dates_db_path)
|
|
3924
|
+
date = self.format_date(date)
|
|
3925
|
+
|
|
3750
3926
|
|
|
3751
3927
|
# 根据条件筛选数据
|
|
3752
3928
|
# 筛选 trade_flag 列等于 T 的数据(是交易日的数据)
|
|
@@ -3757,13 +3933,13 @@ class GJDataC:
|
|
|
3757
3933
|
|
|
3758
3934
|
""" 节假日判断 """
|
|
3759
3935
|
|
|
3760
|
-
|
|
3761
|
-
def is_holiday(date):
|
|
3936
|
+
def is_holiday(self, date):
|
|
3762
3937
|
"""
|
|
3763
3938
|
判断给定日期是否为节假日
|
|
3764
3939
|
:param date: 给定的日期
|
|
3765
3940
|
:return: True 或 False
|
|
3766
3941
|
"""
|
|
3942
|
+
date = self.format_date(date)
|
|
3767
3943
|
|
|
3768
3944
|
# 将输入日期字符串转换为 datetime 对象
|
|
3769
3945
|
date = datetime.datetime.strptime(date, '%Y.%m.%d').date()
|
|
@@ -3772,13 +3948,13 @@ class GJDataC:
|
|
|
3772
3948
|
|
|
3773
3949
|
""" 周末判断 """
|
|
3774
3950
|
|
|
3775
|
-
|
|
3776
|
-
def is_weekend(date):
|
|
3951
|
+
def is_weekend(self, date):
|
|
3777
3952
|
"""
|
|
3778
3953
|
判断给定日期是否为周末
|
|
3779
3954
|
:param date: 给定日期
|
|
3780
3955
|
:return: True 或 False
|
|
3781
3956
|
"""
|
|
3957
|
+
date = self.format_date(date)
|
|
3782
3958
|
|
|
3783
3959
|
# 将输入日期字符串转换为 datetime 对象
|
|
3784
3960
|
date = datetime.datetime.strptime(date, '%Y.%m.%d')
|
|
@@ -5,7 +5,7 @@ with open('description_info.md', 'r', encoding='utf-8') as f:
|
|
|
5
5
|
|
|
6
6
|
setup(
|
|
7
7
|
name='gjdatac_api', # 你的包名
|
|
8
|
-
version='0.2.
|
|
8
|
+
version='0.2.7', # 版本号
|
|
9
9
|
description='数据接口打包', # 包的简要描述
|
|
10
10
|
long_description=long_description, # 包的详细描述
|
|
11
11
|
long_description_content_type='text/markdown', # 描述文件的类型
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|