From 18cd3598a6abf19dac1a02eb19c9db8edae8cc0c Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 11 七月 2023 16:45:56 +0800 Subject: [PATCH] 华鑫适配 --- third_data/hot_block_data_process.py | 218 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 177 insertions(+), 41 deletions(-) diff --git a/third_data/hot_block_data_process.py b/third_data/hot_block_data_process.py index f83f800..72866b0 100644 --- a/third_data/hot_block_data_process.py +++ b/third_data/hot_block_data_process.py @@ -4,14 +4,15 @@ import datetime import json -import juejin -import tool +from utils import tool from db import redis_manager from db import mysql_data -import limit_up_time_manager -import gpcode_manager +from code_attribute import limit_up_time_manager, gpcode_manager +from l2 import code_price_manager +from third_data.history_k_data_util import HistoryKDatasUtils __redisManager = redis_manager.RedisManager(0) +INVALID_BLOCKS = ["鍏朵粬", "ST鑲�", "ST鎽樺附", "涓氱哗澧為暱", "涓氱哗棰勫", "鍏憡", "娆℃柊鑲�"] def __get_redis(): @@ -25,7 +26,7 @@ @classmethod def save(cls, day, datas): - cls.latest_datas = datas + mysqldb = mysql_data.Mysqldb() # 缁熻浠g爜鎵�灞炴澘鍧� code_block_dict = {} @@ -36,6 +37,26 @@ code_block_dict[code] = set() code_block_dict[code].add(data[0]) + # 濡傛灉鏈鍜屼笂娆$浉宸殑浠g爜涓斾箣鍓嶆湁杩囨定鍋滃氨鍒ゆ柇涓虹偢鏉� + if cls.latest_datas: + latest_codes = set() + for data in cls.latest_datas: + for code_info in data[2]: + code = code_info[0][1].split(".")[0] + latest_codes.add(code) + now_codes = set(code_block_dict.keys()) + del_set = latest_codes - now_codes + for code in del_set: + # 鑾峰彇涔嬪墠鏄惁娑ㄥ仠杩� + results = cls.list_by_code(code, tool.get_now_date()) + if results: + first_limit_up_time = results[0][8] + if len(first_limit_up_time) > 6: + # 涔嬪墠娑ㄥ仠杩囷紝鏇存柊鐐告澘鏃堕棿 + for result in results: + mysqldb.execute( + f"update xgb_hot_block set _open_limit_up_time='{tool.get_now_time_str()}',_update_time=now() where _id='{result[0]}'") + cls.latest_datas = datas for data in datas: for code_info in data[2]: code = code_info[0][1].split(".")[0] @@ -45,6 +66,11 @@ limit_up_time = code_info[4] if len(limit_up_time) <= 6: limit_up_time = '' + # 00/60寮�澶翠唬鐮� 鏈夋定鍋滄椂闂� + if code.find("00") == 0 or code.find("60") == 0: + if len(limit_up_time) > 6: + code_price_manager.Buy1PriceManager.set_limit_up_time(code, limit_up_time) + if not result: mysqldb.execute( f"insert into xgb_hot_block(_id,_day,_block_name,_code,_limit_up_time,_price,_rate,_update_time,_first_limit_up_time,_code_name) values('{_id}','{day}','{data[0]}','{code}','{code_info[4]}','{code_info[2]}','{code_info[3]}',now(),'{limit_up_time}','{code_info[0][0]}')") @@ -54,9 +80,9 @@ mysqldb.execute( f"update xgb_hot_block set _limit_up_time='{code_info[4]}',_price='{code_info[2]}',_rate='{code_info[3]}',_update_time=now(),_code_name='{code_info[0][0]}' where _id='{_id}'") if (not result[8] or len(result[8]) <= 6) and len(limit_up_time) >= 6: + # 娌℃湁棣栨娑ㄥ仠鏃堕棿 mysqldb.execute( f"update xgb_hot_block set _first_limit_up_time='{limit_up_time}',_update_time=now() where _id='{_id}'") - cls.__last_datas[_id] = code_info # 鑾峰彇鍘熸潵鐨勪唬鐮佹墍灞炴澘鍧�,鍒犻櫎涔嬪墠閿欒鐨勬澘鍧� old_datas = XGBHotBlockDataManager.list_by_code(code, day) @@ -83,18 +109,45 @@ return mysqldb.select_all(f"select * from xgb_hot_block where _block_name='{block_name}' and _day='{day}'") @staticmethod - def list_blocks(days): + def list_blocks_with_day(days): mysqldb = mysql_data.Mysqldb() - sql = "select distinct(_block_name) from xgb_hot_block where " + sql = "select _block_name,_day from xgb_hot_block where " wheres = [] for day in days: wheres.append(f"_day = '{day}'") sql += " or ".join(wheres) + sql += " group by _block_name,_day" + results = mysqldb.select_all(sql) - fresult = set() - for result in results: - fresult.add(result[0]) - return fresult + return results + + @staticmethod + def get_latest_blocks(code): + wheres = [] + for b in INVALID_BLOCKS: + wheres.append(f"hb.`_block_name` != '{b}'") + wheres = " and ".join(wheres) + sql = f"SELECT GROUP_CONCAT(_block_name) FROM (SELECT hb.`_block_name`,hb.`_day` FROM `xgb_hot_block` hb WHERE hb.`_code`='{code}' AND {wheres} ORDER BY hb.`_day` DESC LIMIT 10) a GROUP BY a._day ORDER BY a._day DESC LIMIT 1" + mysqldb = mysql_data.Mysqldb() + return mysqldb.select_one(sql) + + +class XGBDataUtil: + + # 鏉垮潡涓槸鍚︽湁楂樹綅绁� + @classmethod + def is_has_high_code(cls, block_name, latest_datas): + if not latest_datas: + return False + for block in latest_datas: + if block[0] != block_name: + continue + for code_data in block[2]: + if code_data[1] and code_data[1].find("鏉�") >= 0: + day = code_data[1][-2:-1] + if int(day) >= 2: + return True, code_data + return False, None __blocks_dict = {} @@ -105,61 +158,121 @@ if now_day in __blocks_dict: return __blocks_dict[now_day] now_date = datetime.datetime.now() - end_date = juejin.JueJinManager.get_previous_trading_date(tool.get_now_date_str()) + end_date = HistoryKDatasUtils.get_previous_trading_date(tool.get_now_date_str()) start_date = now_date - datetime.timedelta(days=(day_count * 2 + 10)) start_date = start_date.strftime("%Y-%m-%d") - days = juejin.JueJinManager.get_trading_dates(start_date, end_date) + days = HistoryKDatasUtils.get_trading_dates(start_date, end_date) days = days[0 - day_count:] - results = XGBHotBlockDataManager.list_blocks(days) + results = XGBHotBlockDataManager.list_blocks_with_day(days) __blocks_dict[now_day] = results return results + + +# 鍔犺浇涔嬪墠鐨勬澘鍧� +__before_block_dict = {} + + +def __load_before_block(code): + if code not in __before_block_dict: + blocks = XGBHotBlockDataManager.get_latest_blocks(code) + if blocks: + blocks = blocks[0].split(',') + __before_block_dict[code] = blocks + + return __before_block_dict.get(code) + + +def __get_code_from_code_info(code_info): + code = code_info[0][1].split(".")[0] + return code # 鑾峰彇浠g爜鎵�鍦ㄦ澘鍧椾俊鎭� def get_info(code): blocks = get_code_blocks(code) - # 鍒ゆ柇鏄惁鏈夋柊姒傚康 - # 鏂版蹇� - new_block = None - latest_blocks = get_latest_block(15) - for block in blocks: - if block not in latest_blocks: - new_block = block - # 濡傛灉鏉垮潡涓殑娑ㄥ仠绁ㄦ暟銆�=2鎵嶇畻鏂伴鏉� - count = 0 - if XGBHotBlockDataManager.latest_datas: - for b in XGBHotBlockDataManager.latest_datas: - if b[0] == new_block: - for code_data in b[2]: - if len(code_data[4]) > 6: - count += 0 - if count < 2: - new_block = None - if not new_block: - break + if not blocks: + blocks = __load_before_block(code) + latest_blocks_info = get_latest_block(15) + # 缁熻鏉垮潡鍑虹幇娆℃暟 + # 鑾峰彇鐩爣鏉垮潡 target_block = None if blocks: for block in blocks: - if block == '鍏憡' or block == '鍏朵粬': + if block in INVALID_BLOCKS: continue target_block = block break if not target_block: return None - limit_up_codes_set = set() + # 缁熻鏉垮潡涓殑骞冲潎娑ㄥ箙 + total_rates = 0 + total_count = 0 + target_block_rate = 0 + if XGBHotBlockDataManager.latest_datas: + for b in XGBHotBlockDataManager.latest_datas: + if b[0] != target_block: + continue + if b[1]: + target_block_rate = float(b[1].strip().replace("%", '')) + for code_info in b[2]: + code__ = __get_code_from_code_info(code_info) + rate = float(code_info[3].strip().replace("%", '')) + if code__ != code: + total_rates += rate + total_count += 1 + + # 缁熻鏉垮潡鍑虹幇鐨勬鏁� + target_block_histry_count = 0 + if blocks: + for block_info in latest_blocks_info: + if block_info[0] != target_block: + continue + target_block_histry_count += 1 + + # 鏄惁鍑虹幇杩囬珮浣嶆澘 + high_block_infos = [] + for block in blocks: + if block == '鍏憡' or block == '鍏朵粬': + continue + if XGBHotBlockDataManager.latest_datas: + has_high, high_code_info = XGBDataUtil.is_has_high_code(block, XGBHotBlockDataManager.latest_datas) + if has_high: + high_block_info = (high_code_info[0], high_code_info[1]) + high_block_infos.append(high_block_info) + + limit_up_codes_info_set = set() + # 鏉垮潡涓嬬殑浠g爜鏁伴噺 + block_codes_set = set() if XGBHotBlockDataManager.latest_datas: for block in XGBHotBlockDataManager.latest_datas: if block[0] == target_block: for code_data in block[2]: + code_ = code_data[0][1].split('.')[0] if len(code_data[4]) > 6: - limit_up_codes_set.add(code_data[0][1].split('.')[0]) + limit_up_codes_info_set.add((code_, code_data[4])) + block_codes_set.add(code_) + # 鑾峰彇娑ㄥ仠鐨勯『搴� + limit_up_index = -1 + limit_up_codes_info_list = list(limit_up_codes_info_set) + limit_up_codes_info_list.sort(key=lambda x: x[1]) + for i in range(0, len(limit_up_codes_info_list)): + if limit_up_codes_info_list[i][0] == code: + limit_up_index = i + if limit_up_index < 0: + limit_up_index = len(limit_up_codes_info_list) + + # 娑ㄥ仠浠g爜闆嗗悎 + limit_up_codes_set = set([k[0] for k in limit_up_codes_info_list]) + limit_up_codes_set.discard(code) - limit_up_count = len(limit_up_codes_set) + block_codes_set.discard(code) + limit_up_codes_count = len(block_codes_set) total_datas = XGBHotBlockDataManager.total_datas break_codes = set() + re_limit_codes = set() for data in total_datas: block = data[2] if block != target_block: @@ -167,15 +280,39 @@ code = data[3] limit_up_time = data[4] first_limit_up_time = data[8] + open_limit_up_time = data[10] if len(limit_up_time) <= 6 and first_limit_up_time and len(first_limit_up_time) > 6: break_codes.add(code) + if len(limit_up_time) > 6 and open_limit_up_time and len(open_limit_up_time) > 6: + re_limit_codes.add(code) + # 鎺掗櫎鑷繁 break_codes.discard(code) # 鎺掗櫎宸茬粡娑ㄥ仠鐨勪唬鐮� break_codes = break_codes.difference(limit_up_codes_set) # 鐐告澘涓暟 break_size = len(break_codes) - return target_block, limit_up_count, break_size, new_block + + # 鐐告澘鍥炲皝鏁伴噺 + re_limit_up_size = len(re_limit_codes) + fresult = { + # 鐩爣鏉垮潡淇℃伅锛堟澘鍧楀悕绉�,鏉垮潡娑ㄥ箙,鍘嗗彶鏉垮潡鍑虹幇娆℃暟锛� + "target_block_info": (target_block, target_block_rate, target_block_histry_count), + # 娑ㄥ仠椤哄簭 + "limit_up_index": limit_up_index, + # 娑ㄥ仠浠g爜鏁伴噺 + "limit_up_codes_count": limit_up_codes_count, + # 鏉垮潡浠g爜娑ㄥ箙淇℃伅 + "block_codes_rates_info": (total_rates, total_count), + # 鐐告澘浠g爜鏁伴噺 + "break_size": break_size, + # 鐐告澘鍥炲皝鏁伴噺 + "re_limit_up_size": re_limit_up_size, + # 楂樹綅鐗堜俊鎭� + "high_block_infos": high_block_infos, + } + + return fresult # 淇濆瓨鏁版嵁 @@ -238,5 +375,4 @@ if __name__ == "__main__": # XGBHotBlockDataManager.total_datas=XGBHotBlockDataManager.list_all("2023-03-23") # get_info('002230') - print(get_latest_block()) - print(get_latest_block()) + print(__load_before_block("603163")) -- Gitblit v1.8.0