gjdatac-api 0.3.0__tar.gz → 0.3.1__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.3.0 → gjdatac_api-0.3.1}/PKG-INFO +1 -1
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api/data_api_class.py +108 -23
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api.egg-info/PKG-INFO +1 -1
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/setup.py +1 -1
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api/__init__.py +0 -0
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api/dict_data.py +0 -0
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api/dolphindb_info.py +0 -0
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api/instrument_class.py +0 -0
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api.egg-info/SOURCES.txt +0 -0
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api.egg-info/dependency_links.txt +0 -0
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api.egg-info/requires.txt +0 -0
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/gjdatac_api.egg-info/top_level.txt +0 -0
- {gjdatac_api-0.3.0 → gjdatac_api-0.3.1}/setup.cfg +0 -0
|
@@ -11,13 +11,13 @@ import pandas as pd
|
|
|
11
11
|
import dolphindb as ddb
|
|
12
12
|
|
|
13
13
|
from .dict_data import (get_price_frequency_dict, get_price_data_type_dict, get_instruments_type_dict,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
future_delivery_fee_return_fields, future_delivery_fee_return_fields_rename,
|
|
15
|
+
future_margin_ratio_return_fields, future_margin_ratio_return_fields_rename,
|
|
16
|
+
future_limit_position_return_fields, future_limit_position_return_fields_rename,
|
|
17
|
+
main_contract_return_fields, main_contract_return_fields_rename,
|
|
18
|
+
tick_main_contract_return_fields, tick_main_contract_return_fields_rename,
|
|
19
|
+
gtja_mink_main_contract_return_fields, gtja_mink_main_contract_return_fields_rename
|
|
20
|
+
)
|
|
21
21
|
from .dolphindb_info import *
|
|
22
22
|
from .instrument_class import Instrument
|
|
23
23
|
|
|
@@ -406,6 +406,69 @@ class GJDataC:
|
|
|
406
406
|
else:
|
|
407
407
|
raise TypeError("输入类型必须是 datetime、date 或 对应格式的str")
|
|
408
408
|
|
|
409
|
+
@staticmethod
|
|
410
|
+
def validate_dates(start_date, end_date):
|
|
411
|
+
"""
|
|
412
|
+
校验日期合法性并比较先后关系
|
|
413
|
+
|
|
414
|
+
参数:
|
|
415
|
+
start_date: 开始日期(可以是str/datetime/date类型)
|
|
416
|
+
end_date: 结束日期(可以是str/datetime/date类型)
|
|
417
|
+
|
|
418
|
+
返回:
|
|
419
|
+
如果日期合法且start_date <= end_date,返回(parsed_start, parsed_end)
|
|
420
|
+
否则返回None
|
|
421
|
+
"""
|
|
422
|
+
|
|
423
|
+
def parse_date(date_obj):
|
|
424
|
+
"""将各种类型的日期统一转换为datetime.datetime对象"""
|
|
425
|
+
if isinstance(date_obj, datetime.datetime):
|
|
426
|
+
return date_obj
|
|
427
|
+
if isinstance(date_obj, datetime.date):
|
|
428
|
+
# 将date转换为datetime,时间部分设为00:00:00
|
|
429
|
+
return datetime.datetime.combine(date_obj, datetime.time.min)
|
|
430
|
+
if not isinstance(date_obj, str):
|
|
431
|
+
return None
|
|
432
|
+
|
|
433
|
+
# 移除可能存在的单引号
|
|
434
|
+
date_str = date_obj.strip("'\"")
|
|
435
|
+
|
|
436
|
+
# 尝试匹配各种日期格式
|
|
437
|
+
patterns = [
|
|
438
|
+
r'(\d{4})[-.](\d{1,2})[-.](\d{1,2})(?:\s+(\d{1,2}):(\d{1,2}):(\d{1,2}))?', # 带时间的格式
|
|
439
|
+
r'(\d{4})[-.](\d{1,2})[-.](\d{1,2})', # 不带时间的格式
|
|
440
|
+
r'(\d{4})(\d{2})(\d{2})' # 紧凑格式
|
|
441
|
+
]
|
|
442
|
+
|
|
443
|
+
for pattern in patterns:
|
|
444
|
+
match = re.fullmatch(pattern, date_str)
|
|
445
|
+
if match:
|
|
446
|
+
groups = match.groups()
|
|
447
|
+
year, month, day = map(int, groups[:3])
|
|
448
|
+
try:
|
|
449
|
+
# 如果有时间部分则解析时间,否则设为00:00:00
|
|
450
|
+
if len(groups) > 3 and all(groups[3:6]):
|
|
451
|
+
hour, minute, second = map(int, groups[3:6])
|
|
452
|
+
return datetime.datetime(year, month, day, hour, minute, second)
|
|
453
|
+
return datetime.datetime(year, month, day)
|
|
454
|
+
except ValueError:
|
|
455
|
+
return None
|
|
456
|
+
return None
|
|
457
|
+
|
|
458
|
+
# 解析日期(统一转换为datetime对象)
|
|
459
|
+
parsed_start = parse_date(start_date)
|
|
460
|
+
parsed_end = parse_date(end_date)
|
|
461
|
+
|
|
462
|
+
# 检查日期是否有效
|
|
463
|
+
if not parsed_start or not parsed_end:
|
|
464
|
+
return None
|
|
465
|
+
|
|
466
|
+
# 比较日期时间
|
|
467
|
+
if parsed_start > parsed_end:
|
|
468
|
+
return None
|
|
469
|
+
|
|
470
|
+
return (parsed_start, parsed_end)
|
|
471
|
+
|
|
409
472
|
""" get_price(获取行情数据接口) """
|
|
410
473
|
|
|
411
474
|
def get_price(self, order_book_ids=None, asset_type="future", frequency=None, start_date=None, end_date=None,
|
|
@@ -427,6 +490,10 @@ class GJDataC:
|
|
|
427
490
|
# self.get_price_data = self.get_price_data.sort_values(by='datetime', ascending=True)
|
|
428
491
|
|
|
429
492
|
''' 数据校验 (先对必填参数进行校验)'''
|
|
493
|
+
if start_date and end_date:
|
|
494
|
+
if not self.validate_dates(start_date, end_date):
|
|
495
|
+
return None
|
|
496
|
+
|
|
430
497
|
# 对order_book_ids进行校验
|
|
431
498
|
self.get_price_validate_order_book_ids(order_book_ids)
|
|
432
499
|
|
|
@@ -1105,6 +1172,10 @@ class GJDataC:
|
|
|
1105
1172
|
"""
|
|
1106
1173
|
|
|
1107
1174
|
""" 校验参数 """
|
|
1175
|
+
if start_date and end_date:
|
|
1176
|
+
if not self.validate_dates(start_date, end_date):
|
|
1177
|
+
return None
|
|
1178
|
+
|
|
1108
1179
|
data = self.get_trading_dates_validate_date_n_start_end(date, n, start_date, end_date, is_include_start,
|
|
1109
1180
|
is_include_end, trade_time, date_count, date_type)
|
|
1110
1181
|
|
|
@@ -1186,7 +1257,6 @@ class GJDataC:
|
|
|
1186
1257
|
if isinstance(end_date, str):
|
|
1187
1258
|
end_date = self._get_trading_dates_by_start_end(end_date)
|
|
1188
1259
|
|
|
1189
|
-
|
|
1190
1260
|
# 筛选 trading_day_str 列在 start_date 和 end_date 之间的数据
|
|
1191
1261
|
# filtered_df = trading_params_data.loc[
|
|
1192
1262
|
# (trading_params_data['trading_day_str'] >= start_date) & (
|
|
@@ -1799,6 +1869,10 @@ class GJDataC:
|
|
|
1799
1869
|
"""
|
|
1800
1870
|
|
|
1801
1871
|
""" 校验参数 """
|
|
1872
|
+
if start_date and end_date:
|
|
1873
|
+
if not self.validate_dates(start_date, end_date):
|
|
1874
|
+
return None
|
|
1875
|
+
|
|
1802
1876
|
self.get_active_contract_validate_params(commodity, start_date, end_date, frequency, compute_type, adjust_type,
|
|
1803
1877
|
adjust_method)
|
|
1804
1878
|
|
|
@@ -2004,7 +2078,6 @@ class GJDataC:
|
|
|
2004
2078
|
# 先从数据库获取数据
|
|
2005
2079
|
tick_data, db_session = self.connect_db(table_name, db_path)
|
|
2006
2080
|
|
|
2007
|
-
|
|
2008
2081
|
# 根据日期筛选数据
|
|
2009
2082
|
start_dolphin_date = self.format_date(start_date)
|
|
2010
2083
|
end_dolphin_date = self.format_date(end_date)
|
|
@@ -2051,8 +2124,6 @@ class GJDataC:
|
|
|
2051
2124
|
# else:
|
|
2052
2125
|
# raise ValueError("start_date or end_date type error, please enter datetime.date type")
|
|
2053
2126
|
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
2127
|
self.format_date(start_date)
|
|
2057
2128
|
self.format_date(end_date)
|
|
2058
2129
|
|
|
@@ -2203,6 +2274,10 @@ class GJDataC:
|
|
|
2203
2274
|
"""
|
|
2204
2275
|
|
|
2205
2276
|
""" 校验参数 """
|
|
2277
|
+
if start_date and end_date:
|
|
2278
|
+
if not self.validate_dates(start_date, end_date):
|
|
2279
|
+
return None
|
|
2280
|
+
|
|
2206
2281
|
self.get_basic_data_validate_params(order_book_id, asset_type, start_date, end_date)
|
|
2207
2282
|
|
|
2208
2283
|
""" 获取数据 """
|
|
@@ -2321,7 +2396,6 @@ class GJDataC:
|
|
|
2321
2396
|
start_dolphin_date = self.format_date(start_date)
|
|
2322
2397
|
end_dolphin_date = self.format_date(end_date)
|
|
2323
2398
|
|
|
2324
|
-
|
|
2325
2399
|
# 此处还需要判断的原因是,因为对 dolphindb 中不同的日期数据类型查询数据的语法不同
|
|
2326
2400
|
asset_type_data = product_data.where(
|
|
2327
2401
|
f"data_date>={start_dolphin_date} and data_date<={end_dolphin_date}") if asset_type == '库存' \
|
|
@@ -2404,6 +2478,10 @@ class GJDataC:
|
|
|
2404
2478
|
"""
|
|
2405
2479
|
|
|
2406
2480
|
""" 校验必填参数 """
|
|
2481
|
+
if start_date and end_date:
|
|
2482
|
+
if not self.validate_dates(start_date, end_date):
|
|
2483
|
+
return None
|
|
2484
|
+
|
|
2407
2485
|
# 校验commodity, start_date, end_date 是否为必填参数
|
|
2408
2486
|
self.get_warehouse_stocks_future_validate_required_params(commodity, start_date, end_date)
|
|
2409
2487
|
|
|
@@ -2499,8 +2577,6 @@ class GJDataC:
|
|
|
2499
2577
|
:return: 过滤后的数据
|
|
2500
2578
|
"""
|
|
2501
2579
|
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
2580
|
start_date = self._get_warehouse_stocks_future_date_conversion(start_date)
|
|
2505
2581
|
end_date = self._get_warehouse_stocks_future_date_conversion(end_date)
|
|
2506
2582
|
|
|
@@ -2544,6 +2620,10 @@ class GJDataC:
|
|
|
2544
2620
|
"""
|
|
2545
2621
|
|
|
2546
2622
|
""" 校验必填参数 """
|
|
2623
|
+
if start_date and end_date:
|
|
2624
|
+
if not self.validate_dates(start_date, end_date):
|
|
2625
|
+
return None
|
|
2626
|
+
|
|
2547
2627
|
# 校验oder_book_ids, start_date, end_date, frequency 是否为必填参数
|
|
2548
2628
|
self.get_vwap_validate_required_params(order_book_ids, start_date, end_date, frequency)
|
|
2549
2629
|
|
|
@@ -2790,6 +2870,9 @@ class GJDataC:
|
|
|
2790
2870
|
"""
|
|
2791
2871
|
|
|
2792
2872
|
""" 校验必填参数 """
|
|
2873
|
+
if start_date and end_date:
|
|
2874
|
+
if not self.validate_dates(start_date, end_date):
|
|
2875
|
+
return None
|
|
2793
2876
|
# 校验oder_book_ids, start_date, end_date, frequency 是否为必填参数
|
|
2794
2877
|
self.get_twap_validate_required_params(order_book_ids, start_date, end_date, frequency)
|
|
2795
2878
|
|
|
@@ -3079,7 +3162,7 @@ class GJDataC:
|
|
|
3079
3162
|
"""
|
|
3080
3163
|
|
|
3081
3164
|
def get_history_bars(self, datetime_str=None, instrument_id=None, bar_count=None,
|
|
3082
|
-
|
|
3165
|
+
frequency=None, fields=None, start_date=None, end_date=None):
|
|
3083
3166
|
"""
|
|
3084
3167
|
(此接口根据接收的参数调用不同的功能函数)
|
|
3085
3168
|
查询合约指定日期时间前的行情数据
|
|
@@ -3100,7 +3183,6 @@ class GJDataC:
|
|
|
3100
3183
|
ValueError: 参数验证失败时抛出
|
|
3101
3184
|
"""
|
|
3102
3185
|
|
|
3103
|
-
|
|
3104
3186
|
''' 根据参数的不同,调用不同的函数 '''
|
|
3105
3187
|
if datetime_str and bar_count is not None:
|
|
3106
3188
|
# 参数验证
|
|
@@ -3198,7 +3280,6 @@ class GJDataC:
|
|
|
3198
3280
|
# except ValueError:
|
|
3199
3281
|
# raise ValueError("Invalid datetime format, should be 'YYYY-MM-DD HH:MM:SS'")
|
|
3200
3282
|
|
|
3201
|
-
|
|
3202
3283
|
def _get_history_bar_execute_query(self, frequency, instrument_id, datetime_str, bar_count):
|
|
3203
3284
|
"""
|
|
3204
3285
|
执行查询
|
|
@@ -3237,7 +3318,6 @@ class GJDataC:
|
|
|
3237
3318
|
"""
|
|
3238
3319
|
contract_type = self.filter_contract_type(instrument_id)
|
|
3239
3320
|
|
|
3240
|
-
|
|
3241
3321
|
if contract_type == "future":
|
|
3242
3322
|
return {
|
|
3243
3323
|
"1d": (history_future_day_db_table_name, history_future_day_db_path),
|
|
@@ -3351,6 +3431,10 @@ class GJDataC:
|
|
|
3351
3431
|
"""
|
|
3352
3432
|
|
|
3353
3433
|
# 校验参数
|
|
3434
|
+
if start_date and end_date:
|
|
3435
|
+
if not self.validate_dates(start_date, end_date):
|
|
3436
|
+
return None
|
|
3437
|
+
|
|
3354
3438
|
self.get_history_bars_validate_params(instrument_id, start_date, end_date, frequency, fields)
|
|
3355
3439
|
|
|
3356
3440
|
# 查询数据
|
|
@@ -3445,9 +3529,8 @@ class GJDataC:
|
|
|
3445
3529
|
table_data, bars_db_session = self.connect_db(table_info[0], table_info[1])
|
|
3446
3530
|
|
|
3447
3531
|
# 转换日期格式
|
|
3448
|
-
conv_start_date =
|
|
3449
|
-
conv_end_date =
|
|
3450
|
-
|
|
3532
|
+
conv_start_date = self.format_date(start_date)
|
|
3533
|
+
conv_end_date = self.format_date(end_date)
|
|
3451
3534
|
|
|
3452
3535
|
# 筛选数据
|
|
3453
3536
|
query_data = self._get_history_bars_filter_data(table_data, instrument_id, conv_start_date, conv_end_date)
|
|
@@ -3747,6 +3830,9 @@ class GJDataC:
|
|
|
3747
3830
|
"""
|
|
3748
3831
|
|
|
3749
3832
|
""" 获取数据 """
|
|
3833
|
+
if start_date and end_date:
|
|
3834
|
+
if not self.validate_dates(start_date, end_date):
|
|
3835
|
+
return None
|
|
3750
3836
|
result, db_session = self.get_trading__dates_get_data(start_date, end_date, is_include_start, is_include_end)
|
|
3751
3837
|
db_session.close()
|
|
3752
3838
|
|
|
@@ -3804,7 +3890,6 @@ class GJDataC:
|
|
|
3804
3890
|
# 将 trade_time 转换为 datetime 对象
|
|
3805
3891
|
trade_time = self.format_date(trade_time)
|
|
3806
3892
|
|
|
3807
|
-
|
|
3808
3893
|
# 获取交易日历数据
|
|
3809
3894
|
trading_dates = self.get_trading_dates_data()
|
|
3810
3895
|
|
|
@@ -3889,6 +3974,7 @@ class GJDataC:
|
|
|
3889
3974
|
time_points = pd.date_range(start=trade_time - datetime.timedelta(minutes=abs(date_count)),
|
|
3890
3975
|
end=trade_time + datetime.timedelta(minutes=abs(date_count)),
|
|
3891
3976
|
freq='min') # 'T' 表示分钟频率
|
|
3977
|
+
|
|
3892
3978
|
def _before_trading_day(_date):
|
|
3893
3979
|
if _date in trading_dates['trading_day'].dt.date.values:
|
|
3894
3980
|
return _date
|
|
@@ -3968,7 +4054,6 @@ class GJDataC:
|
|
|
3968
4054
|
data, db_session = self.connect_db(trading_dates_db_table_name, trading_dates_db_path)
|
|
3969
4055
|
date = self.format_date(date)
|
|
3970
4056
|
|
|
3971
|
-
|
|
3972
4057
|
# 根据条件筛选数据
|
|
3973
4058
|
# 筛选 trade_flag 列等于 T 的数据(是交易日的数据)
|
|
3974
4059
|
filtered_data = data.where(f"trading_day = {date}").where("trade_flag = 'T'").toDF()
|
|
@@ -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.3.
|
|
8
|
+
version='0.3.1', # 版本号
|
|
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
|
|
File without changes
|