diff --git a/visual.py b/visual.py index 6fad4a6..f3f5f48 100644 --- a/visual.py +++ b/visual.py @@ -203,8 +203,6 @@ def process_player_data(team_json, player_index): "time": str(player_data["AvgCarPlayedTime"]), } - - return [season_total, season_avg, career_total, career_avg], player_data @@ -440,15 +438,9 @@ cached_referee = st.session_state.get("referee") # standings — может не быть тега/файла league_tag = None if isinstance(cached_game_online, dict): - league_tag = (cached_game_online.get("league") or {}).get( - "tag" - ) + league_tag = (cached_game_online.get("league") or {}).get("tag") print(cached_game_online.get("comp").get("name")) - comp_name = ( - (cached_game_online.get("comp") or {}) - .get("name") - .replace(" ", "_") - ) + comp_name = (cached_game_online.get("comp") or {}).get("name").replace(" ", "_") if league_tag: load_data_from_json(f"standings_{league_tag}_{comp_name}") cached_standings = ( @@ -580,7 +572,7 @@ if isinstance(cached_game_online, dict): t1 = result.get("team1") or {} t2 = result.get("team2") or {} - + if t1.get("logo"): col1.image(t1["logo"], width=100) team1_name = t1.get("name") or "" @@ -834,6 +826,7 @@ columns_game = [ if cached_team1 and cached_team2: team1_data = process_team_data(cached_team1, columns_game) team2_data = process_team_data(cached_team2, columns_game) + # Добавляем звездочку, если pts > PTS_Career_High def _get_first_number(x): """Безопасно вытащить число из строки/значения (например '12 (60%)' -> 12).""" @@ -843,19 +836,21 @@ if cached_team1 and cached_team2: s = str(x) # заберём ведущие число/знак (поддержим +/-) import re + m = re.search(r"[-+]?\d+(\.\d+)?", s) return float(m.group(0)) if m else None except Exception: return None - + CAREER_HIGH_KEYS = { - "pts": ["PTS_Career_High", "CareerHighPoints", "career_high_pts"], - "ast": ["AST_Career_High", "CareerHighAssist", "career_high_ast"], - "stl": ["STL_Career_High", "CareerHighSteal", "career_high_stl"], - "blk": ["BLK_Career_High", "CareerHighBlocks", "career_high_blk"], - "reb": ["REB_Career_High", "CareerHighRebound", "career_high_reb"], - # если нужно — добавь ещё пары "df_column": ["possible_key1","possible_key2"...] -} + "pts": ["PTS_Career_High", "CareerHighPoints", "career_high_pts"], + "ast": ["AST_Career_High", "CareerHighAssist", "career_high_ast"], + "stl": ["STL_Career_High", "CareerHighSteal", "career_high_stl"], + "blk": ["BLK_Career_High", "CareerHighBlocks", "career_high_blk"], + "reb": ["REB_Career_High", "CareerHighRebound", "career_high_reb"], + # если нужно — добавь ещё пары "df_column": ["possible_key1","possible_key2"...] + } + def _build_career_high_map(cached_team_list): """Вернёт словарь: player_id -> {stat_key: value} для всех доступных максимумов.""" out = {} @@ -878,7 +873,9 @@ if cached_team1 and cached_team2: def _ensure_id_column(df, cached_team_list): """Присвоить игрокам id в том же порядке, что и в списке cached_team.""" try: - ids = [p.get("id") if isinstance(p, dict) else None for p in cached_team_list][:len(df)] + ids = [ + p.get("id") if isinstance(p, dict) else None for p in cached_team_list + ][: len(df)] if "id" not in df.columns: df["id"] = ids else: @@ -914,18 +911,25 @@ if cached_team1 and cached_team2: df[col] = new_vals # теперь это текст для отображения STAR_COLUMNS = [ - "pts", "ast", "stl", "blk", "reb", -] + "pts", + "ast", + "stl", + "blk", + "reb", + ] team1_data["_pts_num"] = pd.to_numeric(team1_data["pts"], errors="coerce") team1_data["_kpi_num"] = pd.to_numeric(team1_data["kpi"], errors="coerce") team2_data["_pts_num"] = pd.to_numeric(team2_data["pts"], errors="coerce") team2_data["_kpi_num"] = pd.to_numeric(team2_data["kpi"], errors="coerce") + def highlight_max_by_refcol(df, view_col, ref_col): ref = pd.to_numeric(df[ref_col], errors="coerce") mx = ref.max() - return [("background-color: green" if (pd.notna(v) and v == mx and v > 0) else "") - for v in ref] - + return [ + ("background-color: green" if (pd.notna(v) and v == mx and v > 0) else "") + for v in ref + ] + _mark_star_for_columns(team1_data, cached_team1, STAR_COLUMNS) _mark_star_for_columns(team2_data, cached_team2, STAR_COLUMNS) @@ -943,18 +947,34 @@ if cached_team1 and cached_team2: # .apply(highlight_max, subset="kpi") # ) team1_styled = ( - team1_data[columns_game].style - .apply(highlight_grey, axis=1) - .apply(highlight_foul, subset="foul") - .apply(lambda _: highlight_max_by_refcol(team1_data, "pts", "_pts_num"), axis=0, subset=["pts"]) - .apply(lambda _: highlight_max_by_refcol(team1_data, "kpi", "_kpi_num"), axis=0, subset=["kpi"]) + team1_data[columns_game] + .style.apply(highlight_grey, axis=1) + .apply(highlight_foul, subset="foul") + .apply( + lambda _: highlight_max_by_refcol(team1_data, "pts", "_pts_num"), + axis=0, + subset=["pts"], + ) + .apply( + lambda _: highlight_max_by_refcol(team1_data, "kpi", "_kpi_num"), + axis=0, + subset=["kpi"], + ) ) team2_styled = ( - team2_data[columns_game].style - .apply(highlight_grey, axis=1) + team2_data[columns_game] + .style.apply(highlight_grey, axis=1) .apply(highlight_foul, subset="foul") - .apply(lambda _: highlight_max_by_refcol(team2_data, "pts", "_pts_num"), axis=0, subset=["pts"]) - .apply(lambda _: highlight_max_by_refcol(team2_data, "kpi", "_kpi_num"), axis=0, subset=["kpi"]) + .apply( + lambda _: highlight_max_by_refcol(team2_data, "pts", "_pts_num"), + axis=0, + subset=["pts"], + ) + .apply( + lambda _: highlight_max_by_refcol(team2_data, "kpi", "_kpi_num"), + axis=0, + subset=["kpi"], + ) ) def get_player_all_game(player_data_1): @@ -1238,16 +1258,10 @@ if cached_standings: def highlight_teams(s): try: - t1 = ( - ((cached_game_online or {}).get("result") or {}) - .get("team1", {}) - .get("teamId") - ) - t2 = ( - ((cached_game_online or {}).get("result") or {}) - .get("team2", {}) - .get("teamId") - ) + t1 = (cached_game_online or {}).get("team1", {}).get("teamId") + t2 = (cached_game_online or {}).get("team2", {}).get("teamId") + if s.iloc[0] in (t1, t2): + return ["background-color: #FF4B4B"] * len(s) if s.iloc[0] in (t1, t2): return ["background-color: #FF4B4B"] * len(s) except Exception: @@ -1278,7 +1292,7 @@ if cached_standings: column_config={"logo": st.column_config.ImageColumn("logo")}, hide_index=True, height=610, - width="content" + width="content", )