From 0ed2c53acd278d57a39390fd4db78c5aaf088e0a Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期五, 21 四月 2023 18:03:54 +0800 Subject: [PATCH] 开盘啦数据解析 --- third_data/hot_block_data_process.py | 184 ++++++++++++++++++++++++++++++++++++--------- 1 files changed, 145 insertions(+), 39 deletions(-) diff --git a/third_data/hot_block_data_process.py b/third_data/hot_block_data_process.py index 0138d69..9d3e77e 100644 --- a/third_data/hot_block_data_process.py +++ b/third_data/hot_block_data_process.py @@ -10,8 +10,10 @@ from db import mysql_data import limit_up_time_manager import gpcode_manager +from l2 import code_price_manager __redisManager = redis_manager.RedisManager(0) +INVALID_BLOCKS = ["鍏朵粬", "ST鑲�", "ST鎽樺附", "涓氱哗澧為暱", "涓氱哗棰勫", "鍏憡", "娆℃柊鑲�"] def __get_redis(): @@ -25,7 +27,7 @@ @classmethod def save(cls, day, datas): - cls.latest_datas = datas + mysqldb = mysql_data.Mysqldb() # 缁熻浠g爜鎵�灞炴澘鍧� code_block_dict = {} @@ -36,6 +38,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 +67,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 +81,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 +110,27 @@ 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: @@ -128,49 +164,76 @@ start_date = start_date.strftime("%Y-%m-%d") days = juejin.JueJinManager.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) - if blocks: - for block in blocks: - if block not in latest_blocks: - new_block = block - break - # # 濡傛灉鏉垮潡涓殑娑ㄥ仠绁ㄦ暟銆�=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 < 1: - # # 鏉垮潡涓渶浣庢湁 - # 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 + # 缁熻鏉垮潡涓殑骞冲潎娑ㄥ箙 + 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_info = None + high_block_infos = [] for block in blocks: if block == '鍏憡' or block == '鍏朵粬': continue @@ -178,19 +241,39 @@ 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_set = set() + 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: @@ -198,15 +281,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, high_block_info + + # 鐐告澘鍥炲皝鏁伴噺 + 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 # 淇濆瓨鏁版嵁 @@ -269,5 +376,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