|
|
import importlib
|
|
|
import pickle
|
|
|
import functools
|
|
|
import abc
|
|
|
|
|
|
from pprint import pprint
|
|
|
from pathlib import Path
|
|
|
|
|
|
import numpy as np
|
|
|
import pandas as pd
|
|
|
|
|
|
import dolphindb as ddb
|
|
|
import dolphindb.settings as keys
|
|
|
|
|
|
import sqlalchemy as sa
|
|
|
|
|
|
from DDBBase import DDBBase
|
|
|
|
|
|
|
|
|
class DDBLoader(DDBBase):
|
|
|
"""
|
|
|
- 放了几个公用的配置字段,包括:
|
|
|
1. SQL-Server的链接参数
|
|
|
2. DolphinDB的链接参数
|
|
|
|
|
|
- 放了几个@abstractmethod在里面,不过如果不需要使用多态特性,那应该用处不大:
|
|
|
1. create_ddb_database
|
|
|
2. create_ddb_partition_table
|
|
|
"""
|
|
|
|
|
|
mssql_config = {
|
|
|
'host' : '192.168.1.7',
|
|
|
'username' : 'sa',
|
|
|
'password' : 'passw0rd!'
|
|
|
}
|
|
|
|
|
|
def __init__(self):
|
|
|
super().__init__()
|
|
|
self.mssql_engine = sa.create_engine(
|
|
|
"mssql+pyodbc://{username}:{password}@{host}/master?driver=ODBC+Driver+18+for+SQL+Server".format(**self.mssql_config),
|
|
|
connect_args = {
|
|
|
"TrustServerCertificate": "yes"
|
|
|
}, echo=False
|
|
|
)
|
|
|
|
|
|
|
|
|
@abc.abstractmethod
|
|
|
def create_ddb_database(self, *args, **kwargs):
|
|
|
"""
|
|
|
创建database函数,需要被子类具体实现。
|
|
|
"""
|
|
|
return
|
|
|
|
|
|
|
|
|
@abc.abstractmethod
|
|
|
def create_ddb_partition_table(self, *args, **kwargs):
|
|
|
"""
|
|
|
创建分区表函数,需要被子类具体实现。
|
|
|
"""
|
|
|
return
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
def tscode_to_windcode(series):
|
|
|
return series.apply(lambda x : x[2:] + '.' + x[:2])
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
def make_symbol(series):
|
|
|
return series.astype('int32').astype('str')\
|
|
|
.apply(str.zfill, args=(6,))\
|
|
|
.apply(lambda code : \
|
|
|
code + '.SH' if code[0] == '6' \
|
|
|
else code + '.SZ')
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
def make_date(series):
|
|
|
# 特别是对于分红表,如果某些关键日期还未公布,则会填充0,导致日期解析失败
|
|
|
series.loc[series == 0] = np.nan
|
|
|
return pd.to_datetime(
|
|
|
series.astype(str), format='%Y%m%d')
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
def make_nparray(series):
|
|
|
return series.apply(lambda x : np.array(x))
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
def make_time(series):
|
|
|
s_hr = series // 10000000 * 3600000
|
|
|
s_min = series % 10000000 // 100000 * 60000
|
|
|
s_sec = series % 100000 // 1000
|
|
|
s_ms = series % 1000
|
|
|
return pd.to_timedelta(s_hr + s_min + s_sec + s_ms, unit='ms')
|
|
|
|
|
|
|
|
|
|
|
|
|