Пример #1
0
class CHalted:
    @trace_func(log=logger)
    def __init__(self, dbinfo, table):
        self.table = table
        self.redis = create_redis_obj()
        self.mysql_client = CMySQL(dbinfo)
        self.trigger = ct.SYNC_HALTED_2_REDIS
        if not self.create(): raise Exception("create chalted table failed")
        if not self.init(True): raise Exception("init chalted table failed")
        if not self.register():
            raise Exception("create chalted trigger failed")

    @trace_func(log=logger)
    def create(self):
        sql = 'create table if not exists %s(code varchar(6) not null, name varchar(20), stopTime varchar(20), stopDate varchar(20), showDate varchar(20), market varchar(20), stopReason varchar(100), PRIMARY KEY (code))' % self.table
        return True if self.table in self.mysql_client.get_all_tables(
        ) else self.mysql_client.create(sql, self.table)

    @trace_func(log=logger)
    def register(self):
        sql = "create trigger %s after insert on %s for each row set @set=gman_do_background('%s', json_object('name', NEW.name, 'code', NEW.code, 'market', NEW.market, 'stopReason', NEW.stopReason, 'showDate', NEW.showDate, 'stopDate', NEW.stopDate, 'stopTime', NEW.stopTime));" % (
            self.trigger, self.table, self.trigger)
        return True if self.trigger in self.mysql_client.get_all_triggers(
        ) else self.mysql_client.register(sql, self.trigger)

    @trace_func(log=logger)
    def init(self, status):
        df = ts.get_halted()
        if df is None: return False
        if not self.mysql_client.set(df, self.table): return False
        if status: return self.redis.set(ct.HALTED_INFO, _pickle.dumps(df, 2))

    @trace_func(log=logger)
    def is_halted(self, code_id, _date=None):
        if _date is None: _date = datetime.now().strftime('%Y-%m-%d')
        df = self.get(_date)
        if df is None: raise Exception("get chalted list failed")
        if df.empty: return False
        return True if code_id in df['code'].tolist() else False

    @trace_func(log=logger)
    def get(self, _date=None):
        df_byte = self.redis.get(ct.HALTED_INFO)
        if df_byte is None: return pd.DataFrame()
        df = _pickle.loads(df_byte)
        if _date is None:
            return df
        else:
            return df.loc[df.date == _date]
Пример #2
0
class CAnimation:
    def __init__(self, dbinfo):
        self.redis = create_redis_obj()
        self.mysql_client = CMySQL(dbinfo)
        self.table = ct.ANIMATION_INFO
        self.trigger = ct.SYNC_ANIMATION_2_REDIS
        if not self.create(): raise Exception("create animation table %s table failed" % self.table)
        if not self.register(): raise Exception("create animation trigger %s failed" % self.trigger)

    def register(self):
        sql = "create trigger %s after insert on %s for each row set @set=gman_do_background('%s', json_object('cdate', NEW.cdate, 'ctime', NEW.ctime, 'price', NEW.price, 'volume', NEW.volume, 'amount', NEW.amount, 'name', NEW.name));" % (self.trigger, self.table, self.trigger)
        return True if self.trigger in self.mysql_client.get_all_triggers() else self.mysql_client.register(sql, self.trigger)

    def create(self):
        sql = 'create table if not exists %s(ctime varchar(10) not null, cdate varchar(10) not null, price float, volume float, amount float, name varchar(30) not null, PRIMARY KEY (cdate, ctime, name))' % self.table
        return True if self.table in self.mysql_client.get_all_tables() else self.mysql_client.create(sql, self.table)

    @staticmethod
    def get_combination_dict():
        df = CombinationInfo.get()
        cdict = dict()
        for _index, code in df['code'].items():
            cdict[code] = df.loc[_index]['name']
        return cdict

    def collect(self):
        cdata = dict()
        cdata['name'] = list()
        cdata['price'] = list()
        cdata['volume'] = list()
        cdata['amount'] = list()
        cdict = self.get_combination_dict()
        if 0 == len(cdict): return False
        try:
            df = ts.get_realtime_quotes('sh')
            price = float(df.price.tolist()[0])
            p_volume = float(df.volume.tolist()[0])
            p_amount = float(df.amount.tolist()[0])
            cdata['name'].append("上证指数")
            cdata['price'].append(price)
            cdata['volume'].append(p_volume)
            cdata['amount'].append(p_amount)
        except Exception as e:
            logger.info(e)
            return False
        for code in cdict:
            key = cdict[code]
            df_byte = self.redis.get(Combination.get_redis_name(code))
            if df_byte is None: continue
            df = _pickle.loads(df_byte)
            price = float(df.price.tolist()[0])
            p_volume = float(df.volume.tolist()[0])
            p_amount = float(df.amount.tolist()[0])
            cdata['name'].append(key)
            cdata['price'].append(price)
            cdata['volume'].append(p_volume)
            cdata['amount'].append(p_amount)
        df = pd.DataFrame.from_dict(cdata)
        df['ctime'] = datetime.fromtimestamp(time.time()).strftime('%H:%M:%S')
        df['cdate'] = datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d')
        self.mysql_client.set(df, self.table)
        return True
Пример #3
0
class CDelisted:
    @trace_func(log=logger)
    def __init__(self, dbinfo=ct.DB_INFO, redis_host=None):
        self.table = ct.DELISTED_INFO_TABLE
        self.trigger = ct.SYNC_DELISTED_2_REDIS
        self.mysql_client = CMySQL(dbinfo)
        self.redis = create_redis_obj(
        ) if redis_host is None else create_redis_obj(host=redis_host)
        if not self.create(): raise Exception("create delisted table failed")
        if not self.init(True): raise Exception("init delisted table failed")
        if not self.register():
            raise Exception("create delisted trigger failed")

    @trace_func(log=logger)
    def register(self):
        sql = "create trigger %s after insert on %s for each row set @set=gman_do_background('%s', json_object('name', NEW.name, 'code', NEW.code, 'oDate', NEW.oDate, 'tDate', NEW.tDate));" % (
            self.trigger, self.table, self.trigger)
        return True if self.trigger in self.mysql_client.get_all_triggers(
        ) else self.mysql_client.register(sql, self.trigger)

    @trace_func(log=logger)
    def create(self):
        sql = 'create table if not exists %s(code varchar(6) not null, name varchar(8), oDate varchar(10), tDate varchar(10), PRIMARY KEY (code))' % self.table
        return True if self.table in self.mysql_client.get_all_tables(
        ) else self.mysql_client.create(sql, self.table)

    @trace_func(log=logger)
    def init(self, status):
        #get new delisted data info
        df_terminated = ts.get_terminated()
        if df_terminated is None: return False
        if not df_terminated.empty:
            df = df_terminated
        df_suspended = ts.get_suspended()
        if df_suspended is None: return False
        if not df_suspended.empty:
            df = df.append(df_suspended)
        if not df.empty:
            df = df.reset_index(drop=True)
        #get old delisted data info
        old_df_all = self.get()
        if not old_df_all.empty:
            df = df_delta(df, old_df_all, ['code'])
        if df.empty: return True
        res = self.mysql_client.set(df, self.table)
        if not res: return False
        if status:
            self.redis.set(ct.DELISTED_INFO, _pickle.dumps(df, 2))
        return True

    @trace_func(log=logger)
    def get_list(self):
        old_df_all = self.get()
        return old_df_all['code'].tolist()

    @trace_func(log=logger)
    def get(self, code=None, column=None):
        df_byte = self.redis.get(ct.DELISTED_INFO)
        if df_byte is None: return pd.DataFrame()
        df = _pickle.loads(df_byte)
        if code is None: return df
        if column is None:
            return df.loc[df.code == code]
        else:
            return df.loc[df.code == code][column][0]

    @trace_func(log=logger)
    def is_dlisted(self, code_id, _date):
        if code_id not in self.get_list(): return False
        terminatedTime = self.get(code=code_id, column='tDate')
        if terminatedTime == '-': return True
        if terminatedTime:
            t = time.strptime(terminatedTime, "%Y-%m-%d")
            y, m, d = t[0:3]
            terminatedTime = datetime(y, m, d)
            return (datetime.strptime(_date, "%Y-%m-%d") -
                    terminatedTime).days > 0
        return False