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]
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
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