From 50428ae2ac9435bce96c9b12277ad95f2d03700e Mon Sep 17 00:00:00 2001 From: Jacky Yang Date: Tue, 27 Jan 2026 17:53:09 +0800 Subject: [PATCH] 1.5.0: Clutch fully recovered. --- ETL/L2_Builder.py | 89 +++++++++++++++++++++++++++++ database/L2/L2_Main.sqlite | Bin 47804416 -> 48009216 bytes web/routes/players.py | 14 +++-- web/services/stats_service.py | 53 ++++++++++++++++- web/templates/players/profile.html | 60 ++++++++++++------- 5 files changed, 187 insertions(+), 29 deletions(-) diff --git a/ETL/L2_Builder.py b/ETL/L2_Builder.py index 849b1f4..83b0dce 100644 --- a/ETL/L2_Builder.py +++ b/ETL/L2_Builder.py @@ -1342,5 +1342,94 @@ def save_match(cursor, m: MatchData): m.match_id, r.round_num, pe.steam_id_64, pe.side, pe.start_money, pe.equipment_value, pe.main_weapon, pe.has_helmet, pe.has_defuser, pe.round_performance_score )) + # 6. Calculate & Save Clutch Attempts + _calculate_and_save_clutch_attempts(cursor, m.match_id, m.round_list_raw) + +def _calculate_and_save_clutch_attempts(cursor, match_id, round_list_raw): + if not round_list_raw: + return + + try: + round_list = json.loads(round_list_raw) + except: + return + + player_attempts = {} + + for round_data in round_list: + all_kills = round_data.get('all_kill', []) + if not all_kills: + continue + + team_members = {1: set(), 2: set()} + + # Scan for team members + for k in all_kills: + if k.get('attacker') and k['attacker'].get('steamid_64'): + tid = k['attacker'].get('team') + if tid in [1, 2]: + team_members[tid].add(k['attacker']['steamid_64']) + if k.get('victim') and k['victim'].get('steamid_64'): + tid = k['victim'].get('team') + if tid in [1, 2]: + team_members[tid].add(k['victim']['steamid_64']) + + if not team_members[1] or not team_members[2]: + continue + + alive = {1: team_members[1].copy(), 2: team_members[2].copy()} + clutch_triggered_players = set() + + # Sort kills by time + sorted_kills = sorted(all_kills, key=lambda x: x.get('pasttime', 0)) + + for k in sorted_kills: + victim = k.get('victim') + if not victim: continue + + v_sid = victim.get('steamid_64') + v_team = victim.get('team') + + if v_team not in [1, 2] or v_sid not in alive[v_team]: + continue + + alive[v_team].remove(v_sid) + + if len(alive[v_team]) == 1: + survivor_sid = list(alive[v_team])[0] + if survivor_sid not in clutch_triggered_players: + opponent_team = 3 - v_team + opponents_alive_count = len(alive[opponent_team]) + + if opponents_alive_count >= 1: + if survivor_sid not in player_attempts: + player_attempts[survivor_sid] = {'1v1': 0, '1v2': 0, '1v3': 0, '1v4': 0, '1v5': 0} + + n = min(opponents_alive_count, 5) + key = f'1v{n}' + player_attempts[survivor_sid][key] += 1 + clutch_triggered_players.add(survivor_sid) + + # Save to DB + cursor.execute(""" + CREATE TABLE IF NOT EXISTS fact_match_clutch_attempts ( + match_id TEXT, + steam_id_64 TEXT, + attempt_1v1 INTEGER DEFAULT 0, + attempt_1v2 INTEGER DEFAULT 0, + attempt_1v3 INTEGER DEFAULT 0, + attempt_1v4 INTEGER DEFAULT 0, + attempt_1v5 INTEGER DEFAULT 0, + PRIMARY KEY (match_id, steam_id_64) + ) + """) + + for pid, att in player_attempts.items(): + cursor.execute(""" + INSERT OR REPLACE INTO fact_match_clutch_attempts + (match_id, steam_id_64, attempt_1v1, attempt_1v2, attempt_1v3, attempt_1v4, attempt_1v5) + VALUES (?, ?, ?, ?, ?, ?, ?) + """, (match_id, pid, att['1v1'], att['1v2'], att['1v3'], att['1v4'], att['1v5'])) + if __name__ == "__main__": process_matches() diff --git a/database/L2/L2_Main.sqlite b/database/L2/L2_Main.sqlite index 81f8ab7817bbfaeae0b03a571c1cb890d52dadb2..d1f04bb8c5348ae1a4d6b40a2a255a12e6cbaf5c 100644 GIT binary patch delta 75258 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�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 delta 3454 zcmYM!DHWxrG?bPi zC>^Dz43v=~DHCO;ER>b9QFh8fIVl(AraY9F@=<;&Kn1A~6{aFol!{StDnTWw6qTkj zRF=w7d8$AasS;JDDpZxKQFW?8HK`WWraDxY>QQ}aKns9@LY1QE%!)eW@SyrvWsO2GL*|LPKd74W|(_l15Q9 zjixa)md4R|nm`k25>2KUnnF`)8cnAeG?Ql0Y??!JX&%j|1+JBXpFGQ5?n7 zaXLXK=@gx&Gjx{D(RsQ+7wHmRrYm%nuF-Y6K{x3Z-KINqm+sMhdO#295k00S^pu{_ zb9#r~rT6H4`hY&9kLY81L7&j4^cj6lFX;>VlD?v^=^Of%zN7Ey2l|nIqMzv%{X)Oe zZ}dC;L4VR;^qSt#-}Dc?rGMwK`-?~dC7}dKB1tU45+X??sU(x+5-KSqOj1g?q>|K< zM$$@zq?7cLK{86DWRlF1MY2jZ$u2o0r{t2{l1K7NKFKcyq@Wa%!cs(vN--%eC8VU3 zlG0K}%1SvYFBPPsRFcY4MXE|QsV+67rqq(!Qb+1aJ*h7Zq@gsD#?nNZN;7FLEu^Ki zlGf5j+DbcVFCC<#bdt`}MY>9qbd&DVLwZUt=`DSvuk@4tGC&5(AQ>z}WT*_2;W9!- z$|#AJ(K1HH$~YM>6J(-HlF1SyQ)H@4lj$-;X38v?Epue9%#-=DKo-g(Su9IrsVtM_ zvO-qMDp@USWUZ`|^|C=W$|l(?TV$(jlUUg8az(DnHMuS~@@}9geAIOLDk$fyK zU*uQ$O@5a@%GF#@zT$v~HWq~Y|MY33y z$WmD*%VmYElvT1?*2r2}C+lT{Y?Mv1S+>Yl*(R~FU3SP$*(JMWkL;CwvR@9!K{+Ic z<%k@WV-hFva$HWxNjW8_<&2z_b8=oT$VIs%m*t9Fm1}ZcZpcl!CAZ~{+?9KBUmnOq Wc_feJi9D5O@;vZ7=P$6q?f(Eb 0 else 0 + stats_map[sid][f'clutch_rate_1v{i}'] = rate + + # Multi-Kill Rates + rounds = r['total_rounds'] or 1 # Avoid div by 0 + total_mk = 0 + for i in range(2, 6): + k = r[f'k{i}'] or 0 + total_mk += k + stats_map[sid][f'multikill_rate_{i}k'] = k / rounds + stats_map[sid]['total_multikill_rate'] = total_mk / rounds + + # Multi-Assist Rates + total_ma = 0 + for i in range(2, 6): + a = r[f'a{i}'] or 0 + total_ma += a + stats_map[sid][f'multiassist_rate_{i}a'] = a / rounds + stats_map[sid]['total_multiassist_rate'] = total_ma / rounds + # 3. Calculate Distribution for ALL metrics # Define metrics list (must match Detailed Panel keys) metrics = [ @@ -658,7 +704,12 @@ class StatsService: # New: Rating Distribution 'rating_dist_carry_rate', 'rating_dist_normal_rate', 'rating_dist_sacrifice_rate', 'rating_dist_sleeping_rate', # New: ELO Stratification - 'elo_lt1200_rating', 'elo_1200_1400_rating', 'elo_1400_1600_rating', 'elo_1600_1800_rating', 'elo_1800_2000_rating', 'elo_gt2000_rating' + 'elo_lt1200_rating', 'elo_1200_1400_rating', 'elo_1400_1600_rating', 'elo_1600_1800_rating', 'elo_1800_2000_rating', 'elo_gt2000_rating', + # New: Clutch & Multi (Real Calculation) + 'clutch_rate_1v1', 'clutch_rate_1v2', 'clutch_rate_1v3', 'clutch_rate_1v4', 'clutch_rate_1v5', + 'multikill_rate_2k', 'multikill_rate_3k', 'multikill_rate_4k', 'multikill_rate_5k', + 'multiassist_rate_2a', 'multiassist_rate_3a', 'multiassist_rate_4a', 'multiassist_rate_5a', + 'total_multikill_rate', 'total_multiassist_rate' ] # Mapping for L2 legacy calls (if any) - mainly map 'rating' to 'basic_avg_rating' etc if needed diff --git a/web/templates/players/profile.html b/web/templates/players/profile.html index 7126d04..1b75614 100644 --- a/web/templates/players/profile.html +++ b/web/templates/players/profile.html @@ -162,12 +162,20 @@ {% endif %} -

- - {{ format_str.format(value if value is not none else 0) }} - - {% if sublabel %} - {{ sublabel }} +
+
+ + {{ format_str.format(value if value is not none else 0) }} + + {% if sublabel %} + {{ sublabel }} + {% endif %} +
+ + {% if count_label is not none %} +
+ {{ count_label }} +
{% endif %}
@@ -186,13 +194,6 @@ H:{{ format_str.format(dist.max) }}
{% endif %} - - - {% if count_label is not none %} -
- {{ count_label }} -
- {% endif %} {% endmacro %} @@ -268,8 +269,8 @@ HPS (Clutch/Pressure) & PTL (Pistol)
- {{ detail_item('1v1 Win% (1v1胜率)', features['hps_clutch_win_rate_1v1'], 'hps_clutch_win_rate_1v1', '{:.1%}') }} - {{ detail_item('1v3+ Win% (残局大神)', features['hps_clutch_win_rate_1v3_plus'], 'hps_clutch_win_rate_1v3_plus', '{:.1%}') }} + {{ detail_item('Avg 1v1 (场均1v1)', features['hps_clutch_win_rate_1v1'], 'hps_clutch_win_rate_1v1', '{:.2f}') }} + {{ detail_item('Avg 1v3+ (场均1v3+)', features['hps_clutch_win_rate_1v3_plus'], 'hps_clutch_win_rate_1v3_plus', '{:.2f}') }} {{ detail_item('Match Pt Win% (赛点胜率)', features['hps_match_point_win_rate'], 'hps_match_point_win_rate', '{:.1%}') }} {{ detail_item('Pressure Entry (逆风首杀)', features['hps_pressure_entry_rate'], 'hps_pressure_entry_rate', '{:.1%}') }} {{ detail_item('Comeback KD (翻盘KD)', features['hps_comeback_kd_diff'], 'hps_comeback_kd_diff') }} @@ -300,19 +301,34 @@

SPECIAL (Clutch & Multi)

+ {% set matches = l2_stats.get('matches', 0) or 1 %} {% set rounds = l2_stats.get('total_rounds', 0) or 1 %}
- {{ detail_item('1v1 Win%', (l2_stats.get('c1', 0) or 0) / rounds, 'l2_c1', '{:.1%}', count_label=l2_stats.get('c1', 0)) }} - {{ detail_item('1v2 Win%', (l2_stats.get('c2', 0) or 0) / rounds, 'l2_c2', '{:.1%}', count_label=l2_stats.get('c2', 0)) }} - {{ detail_item('1v3 Win%', (l2_stats.get('c3', 0) or 0) / rounds, 'l2_c3', '{:.1%}', count_label=l2_stats.get('c3', 0)) }} - {{ detail_item('1v4 Win%', (l2_stats.get('c4', 0) or 0) / rounds, 'l2_c4', '{:.1%}', count_label=l2_stats.get('c4', 0)) }} - {{ detail_item('1v5 Win%', (l2_stats.get('c5', 0) or 0) / rounds, 'l2_c5', '{:.1%}', count_label=l2_stats.get('c5', 0)) }} + {% set c1 = l2_stats.get('c1', 0) or 0 %} + {% set a1 = l2_stats.get('att1', 0) or 0 %} + {{ detail_item('1v1 Win% (1v1胜率)', c1 / a1 if a1 > 0 else 0, 'clutch_rate_1v1', '{:.1%}', count_label=c1 ~ '/' ~ a1) }} + + {% set c2 = l2_stats.get('c2', 0) or 0 %} + {% set a2 = l2_stats.get('att2', 0) or 0 %} + {{ detail_item('1v2 Win% (1v2胜率)', c2 / a2 if a2 > 0 else 0, 'clutch_rate_1v2', '{:.1%}', count_label=c2 ~ '/' ~ a2) }} + + {% set c3 = l2_stats.get('c3', 0) or 0 %} + {% set a3 = l2_stats.get('att3', 0) or 0 %} + {{ detail_item('1v3 Win% (1v3胜率)', c3 / a3 if a3 > 0 else 0, 'clutch_rate_1v3', '{:.1%}', count_label=c3 ~ '/' ~ a3) }} + + {% set c4 = l2_stats.get('c4', 0) or 0 %} + {% set a4 = l2_stats.get('att4', 0) or 0 %} + {{ detail_item('1v4 Win% (1v4胜率)', c4 / a4 if a4 > 0 else 0, 'clutch_rate_1v4', '{:.1%}', count_label=c4 ~ '/' ~ a4) }} + + {% set c5 = l2_stats.get('c5', 0) or 0 %} + {% set a5 = l2_stats.get('att5', 0) or 0 %} + {{ detail_item('1v5 Win% (1v5胜率)', c5 / a5 if a5 > 0 else 0, 'clutch_rate_1v5', '{:.1%}', count_label=c5 ~ '/' ~ a5) }} {% set mk_count = (l2_stats.get('k2', 0) or 0) + (l2_stats.get('k3', 0) or 0) + (l2_stats.get('k4', 0) or 0) + (l2_stats.get('k5', 0) or 0) %} {% set ma_count = (l2_stats.get('a2', 0) or 0) + (l2_stats.get('a3', 0) or 0) + (l2_stats.get('a4', 0) or 0) + (l2_stats.get('a5', 0) or 0) %} - {{ detail_item('Multi-Kill Rate', mk_count / rounds, 'l2_mk', '{:.1%}', count_label=mk_count) }} - {{ detail_item('Multi-Assist Rate', ma_count / rounds, 'l2_ma', '{:.1%}', count_label=ma_count) }} + {{ detail_item('Multi-K Rate (多杀率)', mk_count / rounds, 'total_multikill_rate', '{:.1%}', count_label=mk_count) }} + {{ detail_item('Multi-A Rate (多助率)', ma_count / rounds, 'total_multiassist_rate', '{:.1%}', count_label=ma_count) }}