import os import re import pandas as pd import plotly.express as px def parse_log_file(file_path): """ 解析单个日志文件以提取股票排名数据。 """ # 从文件名提取时间戳 filename = os.path.basename(file_path) timestamp_str = filename.replace('.log', '') # 一个更稳健的方法来处理文件名末尾可能的变化 timestamp_str = '-'.join(timestamp_str.split('-')[:6]) timestamp = pd.to_datetime(timestamp_str, format='%Y-%m-%d-%H-%M-%S') data = [] with open(file_path, 'r', encoding='utf-8') as f: in_data_section = False for line in f: if "=== 🔥 热门个股整合榜(按平均排名排序) ===" in line: in_data_section = True continue if "=== 📊 概念热度排行榜 ===" in line: in_data_section = False break if in_data_section and line.strip(): # 使用正则表达式处理不固定的空白字符 match = re.match(r'\s*(\d+)\s+([0-9A-Z]+)\s+([\S]+)', line) if match: rank = int(match.group(1)) stock_code = match.group(2) stock_name = match.group(3) data.append({ 'timestamp': timestamp, 'rank': rank, 'stock_code': stock_code, 'stock_name': stock_name }) return data def main(): """ 主函数,用于处理日志文件并生成可交互的图表。 """ # --- 已将目录更新为您提供的路径 --- log_directory = '/ql/data/scripts/rmg/mrlog' # 检查目录是否存在 if not os.path.isdir(log_directory): print(f"错误:目录 '{log_directory}' 不存在。") return # 查找指定目录下的所有日志文件 log_filenames = [f for f in os.listdir(log_directory) if f.endswith('.log')] if not log_filenames: print(f"在目录 '{log_directory}' 中未找到日志文件。") return # 对文件进行排序,以便轻松找到最新的文件 log_filenames.sort() # 处理所有日志文件 all_data = [] for filename in log_filenames: full_path = os.path.join(log_directory, filename) # 拼接成完整路径 all_data.extend(parse_log_file(full_path)) if not all_data: print("未能从日志文件中提取任何数据。") return # 创建DataFrame df = pd.DataFrame(all_data) # 从最新的日志文件中获取排名前50的股票 most_recent_timestamp = df['timestamp'].max() top_50_stocks = df[df['timestamp'] == most_recent_timestamp] top_50_stocks = top_50_stocks[top_50_stocks['rank'] <= 50] top_50_stock_codes = top_50_stocks['stock_code'].unique() # 筛选DataFrame,只保留这50只股票的数据 df_top_50 = df[df['stock_code'].isin(top_50_stock_codes)] # --- 使用 Plotly 生成可交互图表 --- if df_top_50.empty: print("没有足够的数据来生成图表。") return fig = px.line( df_top_50, x='timestamp', y='rank', color='stock_name', markers=True, title='前50名热门股排名变化趋势 (可交互)', labels={ "timestamp": "时间", "rank": "排名", "stock_name": "股票名称" }, hover_data=["stock_code", "stock_name", "rank"] # 鼠标悬停时显示的数据 ) # 美化图表 fig.update_layout( xaxis_title='时间', yaxis_title='排名', legend_title='股票名称' ) # 反转Y轴,使排名第一的在最上方 fig.update_yaxes(autorange="reversed") # 保存为HTML文件 output_filename = 'rpmbh.html' fig.write_html(output_filename) print(f"可交互图表已保存为 {output_filename}") if __name__ == '__main__': main()