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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gjdatac_api
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: 数据接口打包
5
5
  Author: yin
6
6
  Author-email: 2018209921@qq.com
@@ -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
- 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
- )
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
- frequency=None, fields=None, start_date=None, end_date=None):
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 = self.format_date(start_date)
3449
- conv_end_date = self.format_date(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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gjdatac-api
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: 数据接口打包
5
5
  Author: yin
6
6
  Author-email: 2018209921@qq.com
@@ -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.0', # 版本号
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