def get_index_data(self, _date): df = pd.DataFrame() for code, name in ct.TDX_INDEX_DICT.items(): self.mysql_client.changedb(CIndex.get_dbname(code)) data = self.mysql_client.get( "select * from day where date=\"%s\";" % _date) data['name'] = name df = df.append(data) self.mysql_client.changedb() return df
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 for code in ct.INDEX_DICT: df_byte = self.redis.get( CIndex.get_redis_name(CIndex.get_dbname(code))) if df_byte is None: continue df = _pickle.loads(df_byte) price = float(df.last_price.tolist()[0]) p_volume = float(df.volume.tolist()[0]) p_amount = float(df.turnover.tolist()[0]) cdata['name'].append(ct.INDEX_DICT[code]) cdata['price'].append(price) cdata['volume'].append(p_volume) cdata['amount'].append(p_amount) 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['time'] = datetime.fromtimestamp(time.time()).strftime('%H:%M:%S') df['date'] = datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d') self.mysql_client.set(df, self.table) return True
class BullStockRatio: def __init__(self, index_code, dbinfo=ct.DB_INFO, redis_host=None): self.dbinfo = dbinfo self.index_code = index_code self.index_obj = CIndex(index_code, dbinfo=self.dbinfo, redis_host=redis_host) self.db_name = self.index_obj.get_dbname(index_code) self.logger = getLogger(__name__) self.ris = RIndexStock(dbinfo, redis_host) self.bull_stock_ratio_table = self.get_table_name() self.redis = create_redis_obj( ) if redis_host is None else create_redis_obj(redis_host) self.mysql_client = CMySQL(self.dbinfo, dbname=self.db_name, iredis=self.redis) if not self.create(): raise Exception("create emotion table failed") def delete(self): self.mysql_client.delete(self.bull_stock_ratio_table) def get_table_name(self): return "%s_%s" % (self.db_name, ct.BULLSTOCKRATIO_TABLE) def create(self): if self.bull_stock_ratio_table not in self.mysql_client.get_all_tables( ): sql = 'create table if not exists %s(date varchar(10) not null, ratio float, PRIMARY KEY (date))' % self.bull_stock_ratio_table if not self.mysql_client.create(sql, self.bull_stock_ratio_table): return False return True def is_date_exists(self, table_name, cdate): if self.redis.exists(table_name): return cdate in set( str(tdate, encoding=ct.UTF8) for tdate in self.redis.smembers(table_name)) return False def get_k_data_between(self, start_date, end_date): sql = "select * from %s where date between \"%s\" and \"%s\"" % ( self.get_table_name(), start_date, end_date) return self.mysql_client.get(sql) def get_components(self, cdate): df = self.index_obj.get_components_data(cdate) if df is None: return list() if df.empty: return list() if self.index_code == '000001': df = df[df.code.str.startswith('6')] return df.code.tolist() def get_data(self, cdate): return self.ris.get_data(cdate) def update(self, end_date=None, num=30): if end_date is None: end_date = datetime.now().strftime('%Y-%m-%d') #start_date = "1997-12-30" start_date = get_day_nday_ago(end_date, num=num, dformat="%Y-%m-%d") succeed = True code_list = self.get_components(end_date) if 0 == len(code_list): self.logger.error("%s code_list for %s is empty" % (end_date, self.index_code)) return False for mdate in get_dates_array(start_date, end_date): if CCalendar.is_trading_day(mdate, redis=self.redis): if not self.set_ratio(code_list, mdate): self.logger.error("set %s score for %s set failed" % (self.index_code, mdate)) succeed = False return succeed def get_profit_stocks(self, df): data = df[df.profit >= 0] return data.code.tolist() def set_ratio(self, now_code_list, cdate=datetime.now().strftime('%Y-%m-%d')): if self.is_date_exists(self.bull_stock_ratio_table, cdate): self.logger.debug("existed date:%s, date:%s" % (self.bull_stock_ratio_table, cdate)) return True code_list = self.get_components(cdate) if len(code_list) == 0: code_list = now_code_list df = self.get_data(cdate) if df is None: return False if df.empty: return False df = df[df.code.isin(code_list)] if df.empty: return True profit_code_list = self.get_profit_stocks(df) bull_stock_num = len(profit_code_list) bull_ration = 100 * bull_stock_num / len(df) data = {'date': [cdate], 'ratio': [bull_ration]} df = pd.DataFrame.from_dict(data) if self.mysql_client.set(df, self.bull_stock_ratio_table): return self.redis.sadd(self.bull_stock_ratio_table, cdate) return False