gjdatac-api 0.1.6__tar.gz → 0.1.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.
Potentially problematic release.
This version of gjdatac-api might be problematic. Click here for more details.
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/PKG-INFO +1 -1
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api/data_api_class.py +254 -57
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api/dolphindb_info.py +4 -0
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api.egg-info/PKG-INFO +1 -1
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/setup.py +1 -1
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api/__init__.py +0 -0
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api/dict_data.py +0 -0
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api/instrument_class.py +0 -0
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api.egg-info/SOURCES.txt +0 -0
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api.egg-info/dependency_links.txt +0 -0
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api.egg-info/requires.txt +0 -0
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/gjdatac_api.egg-info/top_level.txt +0 -0
- {gjdatac_api-0.1.6 → gjdatac_api-0.1.7}/setup.cfg +0 -0
|
@@ -10,12 +10,15 @@ import chinese_calendar as calendar
|
|
|
10
10
|
import pandas as pd
|
|
11
11
|
import dolphindb as ddb
|
|
12
12
|
|
|
13
|
-
from .dict_data import (get_price_frequency_dict, get_price_data_type_dict, get_instruments_type_dict,
|
|
13
|
+
from utils.dict_data import (get_price_frequency_dict, get_price_data_type_dict, get_instruments_type_dict,
|
|
14
14
|
future_delivery_fee_return_fields, future_delivery_fee_return_fields_rename,
|
|
15
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
|
-
|
|
18
|
-
|
|
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
|
+
)
|
|
20
|
+
from utils.dolphindb_info import *
|
|
21
|
+
from utils.instrument_class import Instrument
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
class GJDataC:
|
|
@@ -38,6 +41,10 @@ class GJDataC:
|
|
|
38
41
|
self.user_id = user_id
|
|
39
42
|
self.password = password
|
|
40
43
|
|
|
44
|
+
# 创建向量,包含所有可用节点的地址和端口
|
|
45
|
+
self.sites = dolphindb_service
|
|
46
|
+
|
|
47
|
+
|
|
41
48
|
def connect_db(self, table_name, db_path):
|
|
42
49
|
"""
|
|
43
50
|
此方法用于根据不同的数据表及数据库获取数据,只返回Table对象,对应的数据处理在对应的数据接口处理
|
|
@@ -48,7 +55,12 @@ class GJDataC:
|
|
|
48
55
|
|
|
49
56
|
# 连接数据库
|
|
50
57
|
db_session = ddb.session()
|
|
51
|
-
|
|
58
|
+
# 原始方式
|
|
59
|
+
# success = db_session.connect(self.host, self.port, self.user_id, self.password)
|
|
60
|
+
|
|
61
|
+
# 创建连接;开启高可用,并指定sites为所有可用节点的ip:port
|
|
62
|
+
success = db_session.connect(self.host, self.port, self.user_id, self.password, highAvailability=True,
|
|
63
|
+
highAvailabilitySites=self.sites)
|
|
52
64
|
if not success:
|
|
53
65
|
raise Exception("please check your database connection information")
|
|
54
66
|
|
|
@@ -1641,47 +1653,69 @@ class GJDataC:
|
|
|
1641
1653
|
|
|
1642
1654
|
""" get_active_contract 主力/次主力合约 """
|
|
1643
1655
|
|
|
1644
|
-
def get_active_contract(self,
|
|
1645
|
-
end_date=datetime.date.today(),
|
|
1646
|
-
fields=None, source=None):
|
|
1656
|
+
def get_active_contract(self, commodity=None, start_date=datetime.date.today(),
|
|
1657
|
+
end_date=datetime.date.today(), frequency=None, compute_type=None,
|
|
1658
|
+
fields=None, adjust_type=None, adjust_method=None, source=None):
|
|
1647
1659
|
"""
|
|
1648
1660
|
获取主力/次主力合约信息接口
|
|
1649
|
-
:param
|
|
1661
|
+
:param commodity: str or str list--必填,品种
|
|
1650
1662
|
:param start_date: date--必填,默认当天
|
|
1651
1663
|
:param end_date: date--必填,默认当天
|
|
1652
|
-
:param
|
|
1664
|
+
:param frequency: str--必填
|
|
1665
|
+
:param compute_type: str--必填,active指主力;next_active次主力
|
|
1653
1666
|
:param fields: str or str list--选填,返回字段,默认全部
|
|
1667
|
+
:param adjust_type: str--选填,复权方式:不复权 - none,后复权 - post
|
|
1668
|
+
:param adjust_method: str--选填,复权方法
|
|
1654
1669
|
:param source: str--选填,数据源,默认研究所, 3个来源可选:1-数据中台, 2-米筐, 3-研究所(表中无研究所的source)
|
|
1655
1670
|
|
|
1656
1671
|
:return: 主力/次主力合约
|
|
1657
1672
|
"""
|
|
1658
1673
|
|
|
1659
1674
|
""" 校验参数 """
|
|
1660
|
-
self.get_active_contract_validate_params(
|
|
1675
|
+
self.get_active_contract_validate_params(commodity, start_date, end_date, frequency, compute_type, adjust_type,
|
|
1676
|
+
adjust_method)
|
|
1661
1677
|
|
|
1662
1678
|
""" 获取、筛选数据 """
|
|
1663
|
-
|
|
1679
|
+
if frequency in ['1min', '1d', '1min_gtja']:
|
|
1680
|
+
data, db_session = self.get_active_contract_get_data(commodity, start_date, end_date, frequency,
|
|
1681
|
+
compute_type,
|
|
1682
|
+
source)
|
|
1683
|
+
else:
|
|
1684
|
+
data, db_session = self.get_active_contract_get_data_tick(commodity, start_date, end_date, frequency,
|
|
1685
|
+
compute_type,
|
|
1686
|
+
source)
|
|
1687
|
+
data = self.get_active_contract_tick_data(data, frequency, start_date, end_date)
|
|
1664
1688
|
db_session.close()
|
|
1665
1689
|
|
|
1666
|
-
"""
|
|
1667
|
-
data = self.
|
|
1690
|
+
""" 处理字段名 """
|
|
1691
|
+
data = self.get_active_contract_rename(data, adjust_method, frequency)
|
|
1692
|
+
|
|
1693
|
+
""" 根据是否复权计算价格数据 """
|
|
1694
|
+
data = self.get_active_contract_adjust_price(data, adjust_type, adjust_method, frequency)
|
|
1695
|
+
|
|
1696
|
+
""" 处理返回字段 """
|
|
1697
|
+
data = self.get_active_contract_process_return_fields(data, fields)
|
|
1668
1698
|
|
|
1669
1699
|
return data
|
|
1670
1700
|
|
|
1671
|
-
def get_active_contract_validate_params(self, code, start_date, end_date, asset_type
|
|
1701
|
+
def get_active_contract_validate_params(self, code, start_date, end_date, frequency, asset_type, adjust_type,
|
|
1702
|
+
adjust_method):
|
|
1672
1703
|
"""
|
|
1673
1704
|
校验参数
|
|
1674
1705
|
Args:
|
|
1675
1706
|
code: str or str list--选填,合约代码,默认全部
|
|
1676
1707
|
start_date: str--选填,开始日期,默认全部
|
|
1677
1708
|
end_date: str--选填,结束日期,默认全部
|
|
1709
|
+
frequency: str--必填
|
|
1678
1710
|
asset_type: str--选填,合约类型,默认全部
|
|
1711
|
+
adjust_type: str--选填,复权类型
|
|
1712
|
+
adjust_method: str--选填,复权方法
|
|
1679
1713
|
Raises:
|
|
1680
1714
|
ValueError: 参数错误
|
|
1681
1715
|
"""
|
|
1682
1716
|
|
|
1683
1717
|
# 校验必填参数
|
|
1684
|
-
self.get_active_contract_validate_required_params(code, start_date, end_date, asset_type)
|
|
1718
|
+
self.get_active_contract_validate_required_params(code, start_date, end_date, frequency, asset_type)
|
|
1685
1719
|
|
|
1686
1720
|
# 校验日期参数类型
|
|
1687
1721
|
self.get_active_contract_validate_date_type(start_date, end_date)
|
|
@@ -1689,12 +1723,17 @@ class GJDataC:
|
|
|
1689
1723
|
# 校验code类型
|
|
1690
1724
|
self.get_active_contract_validate_code(code)
|
|
1691
1725
|
|
|
1692
|
-
|
|
1726
|
+
# 校验 adjust_type, adjust_method
|
|
1727
|
+
self.general_validate_param_is_str("adjust_type", adjust_type)
|
|
1728
|
+
self.general_validate_param_is_str("adjust_method", adjust_method)
|
|
1729
|
+
|
|
1730
|
+
def get_active_contract_validate_required_params(self, code, start_date, end_date, frequency, asset_type):
|
|
1693
1731
|
"""
|
|
1694
1732
|
校验参数是否必填
|
|
1695
1733
|
:param code: str or str list--必填,品种
|
|
1696
1734
|
:param start_date: date--必填,默认当天
|
|
1697
1735
|
:param end_date: date--必填,默认当天
|
|
1736
|
+
:param frequency: str--必填
|
|
1698
1737
|
:param asset_type: str--必填,active指主力;next_active次主力
|
|
1699
1738
|
:return: None
|
|
1700
1739
|
"""
|
|
@@ -1703,7 +1742,8 @@ class GJDataC:
|
|
|
1703
1742
|
"code": code,
|
|
1704
1743
|
"start_date": start_date,
|
|
1705
1744
|
"end_date": end_date,
|
|
1706
|
-
"asset_type": asset_type
|
|
1745
|
+
"asset_type": asset_type,
|
|
1746
|
+
"frequency": frequency
|
|
1707
1747
|
}
|
|
1708
1748
|
for key, value in params_dict.items():
|
|
1709
1749
|
self.general_validate_params_required(value, key) # 校验必填参数
|
|
@@ -1716,20 +1756,86 @@ class GJDataC:
|
|
|
1716
1756
|
"""
|
|
1717
1757
|
self.general_validate_field_str_or_list(code, "code")
|
|
1718
1758
|
|
|
1719
|
-
|
|
1759
|
+
@staticmethod
|
|
1760
|
+
def get_active_contract_get_table(frequency):
|
|
1761
|
+
"""
|
|
1762
|
+
获取表信息
|
|
1763
|
+
:param frequency: 频率
|
|
1764
|
+
:return: 表信息
|
|
1765
|
+
"""
|
|
1766
|
+
|
|
1767
|
+
return {
|
|
1768
|
+
'1d': (qc_future_maincontract_dayk, dayk_future_maincontract_db),
|
|
1769
|
+
'1min': (qc_future_maincontract_minutek, minutek_future_maincontract_db),
|
|
1770
|
+
'1min_gtja': (qc_future_maincontract_minutek, minutek_future_maincontract_db)
|
|
1771
|
+
}.get(frequency, (None, None))
|
|
1772
|
+
|
|
1773
|
+
@staticmethod
|
|
1774
|
+
def get_active_contract_get_table_tick(frequency):
|
|
1775
|
+
"""
|
|
1776
|
+
获取表信息
|
|
1777
|
+
:param frequency: 频率
|
|
1778
|
+
:return: 表信息
|
|
1779
|
+
"""
|
|
1780
|
+
|
|
1781
|
+
return {
|
|
1782
|
+
'tick_l1': (tick_main_contract_db_table_name, tick_main_contract_db_path),
|
|
1783
|
+
'tick_l2': (tick_main_contract_db_table_name, tick_main_contract_db_path),
|
|
1784
|
+
}.get(frequency, (None, None))
|
|
1785
|
+
|
|
1786
|
+
def get_active_contract_get_data(self, code, start_date, end_date, frequency, compute_type, source):
|
|
1720
1787
|
"""
|
|
1721
1788
|
获取数据
|
|
1722
1789
|
:param code: str or str list--必填,品种
|
|
1723
1790
|
:param start_date: str--必填,开始日期
|
|
1724
1791
|
:param end_date: str--必填,结束日期
|
|
1725
|
-
:param
|
|
1792
|
+
:param compute_type: str--必填,资产类型
|
|
1793
|
+
:param frequency: str--必填
|
|
1726
1794
|
:param source: str--选填,数据来源
|
|
1727
1795
|
|
|
1728
1796
|
:return: 主力/次主力合约数据
|
|
1729
1797
|
"""
|
|
1730
1798
|
|
|
1799
|
+
# 根据频率获取对应的表
|
|
1800
|
+
table_name, db_path = self.get_active_contract_get_table(frequency)
|
|
1801
|
+
|
|
1731
1802
|
# 先从数据库获取数据
|
|
1803
|
+
data, db_session = self.connect_db(table_name, db_path)
|
|
1804
|
+
|
|
1805
|
+
# 根据code筛选数据
|
|
1806
|
+
code_data = data.where(f"product_id in {code}") if isinstance(code, list) else \
|
|
1807
|
+
data.where(f"product_id = '{code}'")
|
|
1808
|
+
|
|
1809
|
+
# 根据日期筛选数据
|
|
1810
|
+
# 将日期转换成 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)
|
|
1813
|
+
date_data = code_data.where(f"trading_day >= {start_dolphin_date} and trading_day <= {end_dolphin_date}")
|
|
1814
|
+
|
|
1815
|
+
if compute_type:
|
|
1816
|
+
# 根据表中的 rank 字段筛选主力/次主力合约,rank == 1是主力合约, 2 是次主力合约
|
|
1817
|
+
rank = 'MAIN' if compute_type == "main" else 'SUB_MAIN'
|
|
1818
|
+
rank_data = date_data.where(f"compute_type = '{rank}'")
|
|
1819
|
+
|
|
1820
|
+
return rank_data.toDF(), db_session
|
|
1821
|
+
return date_data.toDF(), db_session
|
|
1822
|
+
|
|
1823
|
+
def get_active_contract_get_data_tick(self, code, start_date, end_date, frequency, compute_type, source):
|
|
1824
|
+
"""
|
|
1825
|
+
获取tick数据
|
|
1826
|
+
:param code: str or str list--必填,品种
|
|
1827
|
+
:param start_date: str--必填,开始日期
|
|
1828
|
+
:param end_date: str--必填,结束日期
|
|
1829
|
+
:param compute_type: str--必填,资产类型
|
|
1830
|
+
:param frequency: str--必填
|
|
1831
|
+
:param source: str--选填,数据来源
|
|
1832
|
+
|
|
1833
|
+
:return: 主力/次主力合约数据
|
|
1834
|
+
"""
|
|
1835
|
+
|
|
1732
1836
|
table_name, db_path = main_contract_db_table_name, main_contract_db_path
|
|
1837
|
+
|
|
1838
|
+
# 先从数据库获取数据
|
|
1733
1839
|
data, db_session = self.connect_db(table_name, db_path)
|
|
1734
1840
|
|
|
1735
1841
|
# 根据code筛选数据
|
|
@@ -1742,24 +1848,43 @@ class GJDataC:
|
|
|
1742
1848
|
end_dolphin_date = self.get_active_contract_datetime_to_dolphin_time(end_date)
|
|
1743
1849
|
date_data = code_data.where(f"trading_day >= {start_dolphin_date} and trading_day <= {end_dolphin_date}")
|
|
1744
1850
|
|
|
1745
|
-
# 根据 asset_type 筛选数据 (现无次主力合约信息,不清楚数据结构和字段信息,后续需要根据实际数据进行调整)
|
|
1746
1851
|
# 根据表中的 rank 字段筛选主力/次主力合约,rank == 1是主力合约, 2 是次主力合约
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
if source:
|
|
1752
|
-
source_dict = {
|
|
1753
|
-
"1": "dc",
|
|
1754
|
-
"2": "mick",
|
|
1755
|
-
# "3": "研究所" # 表中没有研究所的数据来源
|
|
1756
|
-
}
|
|
1852
|
+
if compute_type:
|
|
1853
|
+
rank = 'MAIN' if compute_type == "main" else 'SUB_MAIN'
|
|
1854
|
+
rank_data = date_data.where(f"compute_type = '{rank}'")
|
|
1855
|
+
return rank_data.toDF(), db_session
|
|
1757
1856
|
|
|
1758
|
-
|
|
1857
|
+
return date_data.toDF(), db_session
|
|
1759
1858
|
|
|
1760
|
-
|
|
1859
|
+
def get_active_contract_tick_data(self, data, frequency, start_date, end_date):
|
|
1860
|
+
"""
|
|
1861
|
+
根据主力合约表查询tick表
|
|
1862
|
+
:param data: 数据
|
|
1863
|
+
:param frequency: 频率
|
|
1864
|
+
:param start_date: 开始日期
|
|
1865
|
+
:param end_date: 结束日期
|
|
1866
|
+
:return: 查询后的数据
|
|
1867
|
+
"""
|
|
1761
1868
|
|
|
1762
|
-
|
|
1869
|
+
table_name, db_path = self.get_active_contract_get_table_tick(frequency)
|
|
1870
|
+
# 先从数据库获取数据
|
|
1871
|
+
tick_data, db_session = self.connect_db(table_name, db_path)
|
|
1872
|
+
|
|
1873
|
+
# 使用 strftime 方法将 Timestamp 转换为所需格式
|
|
1874
|
+
formatted_dates = [ts.strftime('%Y.%m.%d') for ts in data['trading_day'].tolist()]
|
|
1875
|
+
|
|
1876
|
+
# 根据日期筛选数据
|
|
1877
|
+
# 将日期转换成 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)
|
|
1880
|
+
date_data = tick_data.where(f"trading_day >= {start_dolphin_date} and trading_day <= {end_dolphin_date}")
|
|
1881
|
+
|
|
1882
|
+
instrument_data = date_data.where(f"instrument_id in {data['instrument_id'].tolist()}")
|
|
1883
|
+
|
|
1884
|
+
fina_data = instrument_data.toDF()
|
|
1885
|
+
db_session.close()
|
|
1886
|
+
|
|
1887
|
+
return fina_data
|
|
1763
1888
|
|
|
1764
1889
|
@staticmethod
|
|
1765
1890
|
def get_active_contract_datetime_to_dolphin_time(datetime_str):
|
|
@@ -1769,9 +1894,15 @@ class GJDataC:
|
|
|
1769
1894
|
格式化后的日期字符串,例如 '2018.01.04 09:01:00'。
|
|
1770
1895
|
"""
|
|
1771
1896
|
if isinstance(datetime_str, str):
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1897
|
+
try:
|
|
1898
|
+
datetime.datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
|
|
1899
|
+
date_obj = datetime.datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
|
|
1900
|
+
return date_obj.strftime('%Y.%m.%d %H:%M:%S')
|
|
1901
|
+
except ValueError:
|
|
1902
|
+
date_obj = datetime.datetime.strptime(datetime_str, '%Y-%m-%d')
|
|
1903
|
+
return date_obj.strftime('%Y.%m.%d')
|
|
1904
|
+
else:
|
|
1905
|
+
return datetime_str.strftime('%Y.%m.%d %H:%M:%S')
|
|
1775
1906
|
|
|
1776
1907
|
def get_active_contract_validate_date_type(self, start_date, end_date):
|
|
1777
1908
|
"""
|
|
@@ -1796,10 +1927,85 @@ class GJDataC:
|
|
|
1796
1927
|
# else:
|
|
1797
1928
|
# raise ValueError("begin_date type error, please enter datetime.datetime type")
|
|
1798
1929
|
|
|
1799
|
-
|
|
1800
|
-
def
|
|
1930
|
+
@staticmethod
|
|
1931
|
+
def get_active_contract_rename(data, ex_factor, frequency):
|
|
1801
1932
|
"""
|
|
1802
1933
|
处理返回结果
|
|
1934
|
+
:param data: 数据
|
|
1935
|
+
:param ex_factor: 复权因子
|
|
1936
|
+
:param frequency: 频率
|
|
1937
|
+
:return: 处理后的返回结果
|
|
1938
|
+
"""
|
|
1939
|
+
new_df = data.copy()
|
|
1940
|
+
|
|
1941
|
+
if frequency in ['1min', '1d', '1min_gtja']:
|
|
1942
|
+
return_fields = main_contract_return_fields
|
|
1943
|
+
return_fields_rename = main_contract_return_fields_rename
|
|
1944
|
+
else:
|
|
1945
|
+
return_fields = tick_main_contract_return_fields
|
|
1946
|
+
return_fields_rename = tick_main_contract_return_fields_rename
|
|
1947
|
+
|
|
1948
|
+
# 筛选出需求文档中指定的字段
|
|
1949
|
+
new_df = new_df[return_fields]
|
|
1950
|
+
|
|
1951
|
+
# 将实际数据字段转换成需求文档中指定的字段
|
|
1952
|
+
new_df.rename(columns=return_fields_rename, inplace=True)
|
|
1953
|
+
|
|
1954
|
+
if frequency in ['1min', '1d', '1min_gtja']:
|
|
1955
|
+
new_df['none_close'] = new_df['close']
|
|
1956
|
+
new_df['none_prev_close'] = new_df['prev_close']
|
|
1957
|
+
new_df['ex_factor'] = ex_factor
|
|
1958
|
+
else:
|
|
1959
|
+
new_df['total_turnover'] = new_df.groupby(['order_book_ids', 'trading_day'])['turnover'].transform('sum')
|
|
1960
|
+
|
|
1961
|
+
return new_df
|
|
1962
|
+
|
|
1963
|
+
@staticmethod
|
|
1964
|
+
def get_active_contract_adjust_price(data, adjust_type, adjust_method, frequency):
|
|
1965
|
+
"""
|
|
1966
|
+
根据参数计算是否复权
|
|
1967
|
+
:param data: 数据
|
|
1968
|
+
:param adjust_type: 复权类型
|
|
1969
|
+
:param adjust_method: 复权因子
|
|
1970
|
+
:param frequency: 频率
|
|
1971
|
+
:return: 计算后的数据
|
|
1972
|
+
"""
|
|
1973
|
+
|
|
1974
|
+
if not adjust_type or frequency in ['tick_l1', 'tick_l2']:
|
|
1975
|
+
return data
|
|
1976
|
+
|
|
1977
|
+
adjust_fields = ['open', 'close', 'high', 'low', 'limit_up', 'limit_down', 'settlement', 'prev_settlement',
|
|
1978
|
+
'prev_close']
|
|
1979
|
+
if adjust_type == 'post':
|
|
1980
|
+
if adjust_method in ['prev_close_spread', 'open_spread']:
|
|
1981
|
+
for field in adjust_fields:
|
|
1982
|
+
data[field] = data[field] + data[adjust_method]
|
|
1983
|
+
else:
|
|
1984
|
+
for field in adjust_fields:
|
|
1985
|
+
data[field] = data[field] * data[adjust_method]
|
|
1986
|
+
|
|
1987
|
+
return data
|
|
1988
|
+
|
|
1989
|
+
@staticmethod
|
|
1990
|
+
def get_active_contract_process_return_fields(data, fields):
|
|
1991
|
+
"""
|
|
1992
|
+
处理返回字段
|
|
1993
|
+
:param data: 主力/次主力合约数据
|
|
1994
|
+
:param fields: str or str list--选填,返回字段,默认全部
|
|
1995
|
+
:return: 筛选后的主力/次主力合约数据
|
|
1996
|
+
"""
|
|
1997
|
+
|
|
1998
|
+
if not fields:
|
|
1999
|
+
return data
|
|
2000
|
+
|
|
2001
|
+
if isinstance(fields, str):
|
|
2002
|
+
return data[[fields]]
|
|
2003
|
+
else:
|
|
2004
|
+
return data[fields]
|
|
2005
|
+
|
|
2006
|
+
def get_active_contract_process_result(self, data, fields):
|
|
2007
|
+
"""
|
|
2008
|
+
处理返回字段
|
|
1803
2009
|
:param data: 主力/次主力合约数据
|
|
1804
2010
|
:param fields: str or str list--选填,返回字段,默认全部
|
|
1805
2011
|
:return: 筛选后的主力/次主力合约数据
|
|
@@ -1984,21 +2190,12 @@ class GJDataC:
|
|
|
1984
2190
|
格式化后的日期字符串,例如 '2018.01.04 09:01:00'。
|
|
1985
2191
|
"""
|
|
1986
2192
|
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
return date.strftime('%Y-%m-%d %H:%M:%S') if (
|
|
1994
|
-
self.general_validate_date_str_is_datetime_type(date)) else date.strftime('%Y-%m-%d')
|
|
1995
|
-
else:
|
|
1996
|
-
if isinstance(date, str):
|
|
1997
|
-
return datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S').strftime('%Y.%m.%d %H:%M:%S') if (
|
|
1998
|
-
self.general_validate_date_str_is_datetime_type(date)) else (
|
|
1999
|
-
datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%Y.%m.%d'))
|
|
2000
|
-
return date.strftime('%Y.%m.%d %H:%M:%S') if (
|
|
2001
|
-
self.general_validate_date_str_is_datetime_type(date)) else date.strftime('%Y.%m.%d')
|
|
2193
|
+
if isinstance(date, str):
|
|
2194
|
+
return datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S').strftime('%Y.%m.%d %H:%M:%S') if (
|
|
2195
|
+
self.general_validate_date_str_is_datetime_type(date)) else (
|
|
2196
|
+
datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%Y.%m.%d'))
|
|
2197
|
+
return date.strftime('%Y.%m.%d %H:%M:%S') if (
|
|
2198
|
+
self.general_validate_date_str_is_datetime_type(date)) else date.strftime('%Y.%m.%d')
|
|
2002
2199
|
|
|
2003
2200
|
@staticmethod
|
|
2004
2201
|
def _get_basic_data_get_table_info(asset_type):
|
|
@@ -2044,7 +2241,7 @@ class GJDataC:
|
|
|
2044
2241
|
new_df.rename(columns={'product_id': 'order_book_id', ' data_date': 'date', 'inventory_value': 'value'},
|
|
2045
2242
|
inplace=True)
|
|
2046
2243
|
|
|
2047
|
-
return new_df[['order_book_id', 'asset_type', '
|
|
2244
|
+
return new_df[['order_book_id', 'asset_type', 'data_date', 'value']]
|
|
2048
2245
|
|
|
2049
2246
|
""" get_warehouse_stocks_future 仓单数据 """
|
|
2050
2247
|
|
|
@@ -2710,7 +2907,7 @@ class GJDataC:
|
|
|
2710
2907
|
except KeyboardInterrupt:
|
|
2711
2908
|
print("Subscription stopped by user.")
|
|
2712
2909
|
# 关闭连接和资源释放逻辑
|
|
2713
|
-
s.unsubscribe(subscribe_ip, subscribe_port,
|
|
2910
|
+
s.unsubscribe(subscribe_ip, subscribe_port, subscribe_min_db_table_name)
|
|
2714
2911
|
except Exception as e:
|
|
2715
2912
|
raise e
|
|
2716
2913
|
|
|
@@ -3567,4 +3764,4 @@ class GJDataC:
|
|
|
3567
3764
|
date = datetime.datetime.strptime(date, '%Y.%m.%d')
|
|
3568
3765
|
|
|
3569
3766
|
# 判断是否是周末(周六或周日)
|
|
3570
|
-
return date.weekday() >= 5 # weekday() 返回 5(周六)或 6(周日)
|
|
3767
|
+
return date.weekday() >= 5 # weekday() 返回 5(周六)或 6(周日)
|
|
@@ -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.1.
|
|
8
|
+
version='0.1.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
|