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 グラフ画像保存パス