libs.commands.graph.rating
libs/commands/graph/rating.py
1""" 2libs/commands/graph/rating.py 3""" 4 5import os 6 7import matplotlib.font_manager as fm 8import matplotlib.pyplot as plt 9 10import libs.global_value as g 11from cls.types import GameInfoDict 12from libs.data import aggregate 13from libs.functions import message 14from libs.functions.configuration import graph_setup 15from libs.utils import formatter 16 17 18def plot() -> tuple[int, str]: 19 """レーティング推移グラフを生成する 20 21 Returns: 22 tuple[int,str]: 23 - int: グラフにプロットしたゲーム数 24 - str: 検索結果が0件のときのメッセージ or グラフ画像保存パス 25 """ 26 27 plt.close() 28 # データ収集 29 game_info: GameInfoDict = aggregate.game_info() 30 df_ratings = aggregate.calculation_rating() 31 32 if df_ratings.empty: 33 return (0, message.reply(message="no_hits")) 34 35 # 足切り 36 df_dropped = df_ratings.dropna(axis=1, thresh=g.params["stipulated"]).ffill() 37 38 # 並び変え 39 sorted_columns = df_dropped.iloc[-1].sort_values(ascending=False).index 40 df_sorted = df_dropped[sorted_columns] 41 42 new_index = {} 43 for x in df_sorted[1:].index: 44 new_index[x] = str(x).replace("-", "/") 45 df_sorted = df_sorted.rename(index=new_index) 46 47 if g.params.get("anonymous"): 48 mapping_dict = formatter.anonymous_mapping(df_sorted.columns.to_list()) 49 df_sorted = df_sorted.rename(columns=mapping_dict) 50 51 # --- グラフ生成 52 graph_setup(plt, fm) 53 54 save_file = os.path.join( 55 g.cfg.setting.work_dir, 56 f"{g.params["filename"]}.png" if g.params.get("filename") else "rating.png", 57 ) 58 59 title_text = f"レーティング推移 ({message.item_date_range("ymdhm")})" 60 61 legend_text = [] 62 count = 1 63 for name, rate in df_sorted.iloc[-1].items(): 64 legend_text.append(f"{count:2d}位:{name} ({rate:.1f})") 65 count += 1 66 67 # --- 68 df_sorted.plot( 69 figsize=(21, 7), 70 xlabel=f"集計日(総ゲーム数:{game_info["game_count"]})", 71 ylabel="レート", 72 marker="." if len(df_sorted) < 50 else None, 73 ) 74 plt.title(title_text, fontsize=16) 75 plt.legend( 76 legend_text, 77 bbox_to_anchor=(1, 1), 78 loc="upper left", 79 borderaxespad=0.5, 80 ncol=int(len(sorted_columns) / 25 + 1), 81 ) 82 plt.xticks( 83 list(range(len(df_sorted)))[1::int(len(df_sorted) / 25) + 1], 84 list(df_sorted.index)[1::int(len(df_sorted) / 25) + 1], 85 rotation=45, 86 ha="right", 87 ) 88 plt.axhline(y=1500, linewidth=0.5, ls="dashed", color="grey") 89 90 plt.savefig(save_file, bbox_inches="tight") 91 92 return (len(df_sorted), save_file)
def
plot() -> tuple[int, str]:
19def plot() -> tuple[int, str]: 20 """レーティング推移グラフを生成する 21 22 Returns: 23 tuple[int,str]: 24 - int: グラフにプロットしたゲーム数 25 - str: 検索結果が0件のときのメッセージ or グラフ画像保存パス 26 """ 27 28 plt.close() 29 # データ収集 30 game_info: GameInfoDict = aggregate.game_info() 31 df_ratings = aggregate.calculation_rating() 32 33 if df_ratings.empty: 34 return (0, message.reply(message="no_hits")) 35 36 # 足切り 37 df_dropped = df_ratings.dropna(axis=1, thresh=g.params["stipulated"]).ffill() 38 39 # 並び変え 40 sorted_columns = df_dropped.iloc[-1].sort_values(ascending=False).index 41 df_sorted = df_dropped[sorted_columns] 42 43 new_index = {} 44 for x in df_sorted[1:].index: 45 new_index[x] = str(x).replace("-", "/") 46 df_sorted = df_sorted.rename(index=new_index) 47 48 if g.params.get("anonymous"): 49 mapping_dict = formatter.anonymous_mapping(df_sorted.columns.to_list()) 50 df_sorted = df_sorted.rename(columns=mapping_dict) 51 52 # --- グラフ生成 53 graph_setup(plt, fm) 54 55 save_file = os.path.join( 56 g.cfg.setting.work_dir, 57 f"{g.params["filename"]}.png" if g.params.get("filename") else "rating.png", 58 ) 59 60 title_text = f"レーティング推移 ({message.item_date_range("ymdhm")})" 61 62 legend_text = [] 63 count = 1 64 for name, rate in df_sorted.iloc[-1].items(): 65 legend_text.append(f"{count:2d}位:{name} ({rate:.1f})") 66 count += 1 67 68 # --- 69 df_sorted.plot( 70 figsize=(21, 7), 71 xlabel=f"集計日(総ゲーム数:{game_info["game_count"]})", 72 ylabel="レート", 73 marker="." if len(df_sorted) < 50 else None, 74 ) 75 plt.title(title_text, fontsize=16) 76 plt.legend( 77 legend_text, 78 bbox_to_anchor=(1, 1), 79 loc="upper left", 80 borderaxespad=0.5, 81 ncol=int(len(sorted_columns) / 25 + 1), 82 ) 83 plt.xticks( 84 list(range(len(df_sorted)))[1::int(len(df_sorted) / 25) + 1], 85 list(df_sorted.index)[1::int(len(df_sorted) / 25) + 1], 86 rotation=45, 87 ha="right", 88 ) 89 plt.axhline(y=1500, linewidth=0.5, ls="dashed", color="grey") 90 91 plt.savefig(save_file, bbox_inches="tight") 92 93 return (len(df_sorted), save_file)
レーティング推移グラフを生成する
Returns:
tuple[int,str]:
- int: グラフにプロットしたゲーム数
- str: 検索結果が0件のときのメッセージ or グラフ画像保存パス