Commit
·
0c6b2bb
1
Parent(s):
663f0b2
Update app.py
Browse files
app.py
CHANGED
@@ -113,6 +113,34 @@ def get_match_with_longest_game(df: pd.DataFrame, is_tournament: bool) -> Option
|
|
113 |
return df.loc[[np.argmax(df.scores.apply(get_max_int))]]
|
114 |
|
115 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
def get_opponent_rating_distr_fig(df: pd.DataFrame):
|
117 |
fig = plt.figure()
|
118 |
plt.title('Opponent rating distribution')
|
@@ -159,6 +187,8 @@ def usatt_rating_analyzer(file_obj):
|
|
159 |
matches_per_competition_fig = get_matches_per_competition_fig(df, is_tournament)
|
160 |
opponent_name_word_cloud_fig = get_opponent_name_word_cloud_fig(df)
|
161 |
competition_name_word_cloud_fig = get_competition_name_word_cloud_fig(df, is_tournament)
|
|
|
|
|
162 |
rating_over_time_fig = get_rating_over_time_fig(df, is_tournament)
|
163 |
match_with_longest_game = get_match_with_longest_game(df, is_tournament)
|
164 |
opponent_rating_distr_fig = get_opponent_rating_distr_fig(df)
|
@@ -169,6 +199,8 @@ def usatt_rating_analyzer(file_obj):
|
|
169 |
matches_per_competition_fig,
|
170 |
opponent_name_word_cloud_fig,
|
171 |
competition_name_word_cloud_fig,
|
|
|
|
|
172 |
rating_over_time_fig,
|
173 |
match_with_longest_game,
|
174 |
opponent_rating_distr_fig,
|
@@ -213,6 +245,11 @@ with gr.Blocks() as demo:
|
|
213 |
with gr.Column():
|
214 |
comp_names_plot = gr.Plot(label="Competition names")
|
215 |
|
|
|
|
|
|
|
|
|
|
|
216 |
match_longest_game_gdf = gr.Dataframe(label="Match with longest game", max_rows=1)
|
217 |
|
218 |
with gr.Row():
|
@@ -228,12 +265,15 @@ with gr.Blocks() as demo:
|
|
228 |
matches_per_comp_plot,
|
229 |
opponent_names_plot,
|
230 |
comp_names_plot,
|
|
|
|
|
231 |
rating_over_time_plot,
|
232 |
match_longest_game_gdf,
|
233 |
opponent_rating_dist_plot,
|
234 |
opponent_rating_dist_over_time_plot,
|
235 |
]
|
236 |
|
|
|
237 |
btn.click(usatt_rating_analyzer, inputs=inputs, outputs=outputs)
|
238 |
|
239 |
if __name__ == "__main__":
|
|
|
113 |
return df.loc[[np.argmax(df.scores.apply(get_max_int))]]
|
114 |
|
115 |
|
116 |
+
def get_win_loss_record_str(group_df) -> str:
|
117 |
+
if len(group_df) > 0:
|
118 |
+
win_loss_counts = group_df.value_counts()
|
119 |
+
n_wins = win_loss_counts.Won if hasattr(win_loss_counts, "Won") else 0
|
120 |
+
n_losses = win_loss_counts.Lost if hasattr(win_loss_counts, "Lost") else 0
|
121 |
+
else:
|
122 |
+
n_wins = 0
|
123 |
+
n_losses = 0
|
124 |
+
|
125 |
+
return f"{n_wins}, {n_losses}"
|
126 |
+
|
127 |
+
|
128 |
+
def get_most_frequent_opponents(df: pd.DataFrame, top_n: int = 5) -> pd.DataFrame:
|
129 |
+
df_with_opponents = df.loc[df.opponent != "-, -"]
|
130 |
+
|
131 |
+
most_common_opponents_df = df_with_opponents.groupby('opponent').agg({"result": [get_win_loss_record_str, "size"]})
|
132 |
+
most_common_opponents_df.columns = most_common_opponents_df.columns.get_level_values(1)
|
133 |
+
most_common_opponents_df.rename({"get_win_loss_record_str": "Win/loss record", "size": "Number of matches"}, axis=1,
|
134 |
+
inplace=True)
|
135 |
+
most_common_opponents_df["Opponent"] = most_common_opponents_df.index
|
136 |
+
return most_common_opponents_df.sort_values("Number of matches", ascending=False)[
|
137 |
+
["Opponent", "Number of matches", "Win/loss record"]].head(top_n)
|
138 |
+
|
139 |
+
|
140 |
+
def get_highest_rated_opponent(df: pd.DataFrame) -> pd.DataFrame:
|
141 |
+
return df.iloc[df.opponent_rating.idxmax()].to_frame().transpose()
|
142 |
+
|
143 |
+
|
144 |
def get_opponent_rating_distr_fig(df: pd.DataFrame):
|
145 |
fig = plt.figure()
|
146 |
plt.title('Opponent rating distribution')
|
|
|
187 |
matches_per_competition_fig = get_matches_per_competition_fig(df, is_tournament)
|
188 |
opponent_name_word_cloud_fig = get_opponent_name_word_cloud_fig(df)
|
189 |
competition_name_word_cloud_fig = get_competition_name_word_cloud_fig(df, is_tournament)
|
190 |
+
most_frequent_opponents = get_most_frequent_opponents(df)
|
191 |
+
highest_rated_opponent = get_highest_rated_opponent(df)
|
192 |
rating_over_time_fig = get_rating_over_time_fig(df, is_tournament)
|
193 |
match_with_longest_game = get_match_with_longest_game(df, is_tournament)
|
194 |
opponent_rating_distr_fig = get_opponent_rating_distr_fig(df)
|
|
|
199 |
matches_per_competition_fig,
|
200 |
opponent_name_word_cloud_fig,
|
201 |
competition_name_word_cloud_fig,
|
202 |
+
most_frequent_opponents,
|
203 |
+
highest_rated_opponent,
|
204 |
rating_over_time_fig,
|
205 |
match_with_longest_game,
|
206 |
opponent_rating_distr_fig,
|
|
|
245 |
with gr.Column():
|
246 |
comp_names_plot = gr.Plot(label="Competition names")
|
247 |
|
248 |
+
with gr.Row():
|
249 |
+
with gr.Column():
|
250 |
+
most_frequent_opponents_gdf = gr.Dataframe(label="Most frequent opponents", max_rows=5)
|
251 |
+
highest_rated_opponent_gdf = gr.Dataframe(label="Best opponent", max_rows=1)
|
252 |
+
|
253 |
match_longest_game_gdf = gr.Dataframe(label="Match with longest game", max_rows=1)
|
254 |
|
255 |
with gr.Row():
|
|
|
265 |
matches_per_comp_plot,
|
266 |
opponent_names_plot,
|
267 |
comp_names_plot,
|
268 |
+
most_frequent_opponents_gdf,
|
269 |
+
highest_rated_opponent_gdf,
|
270 |
rating_over_time_plot,
|
271 |
match_longest_game_gdf,
|
272 |
opponent_rating_dist_plot,
|
273 |
opponent_rating_dist_over_time_plot,
|
274 |
]
|
275 |
|
276 |
+
|
277 |
btn.click(usatt_rating_analyzer, inputs=inputs, outputs=outputs)
|
278 |
|
279 |
if __name__ == "__main__":
|