diff --git a/database/L1A/L1A.sqlite b/database/L1A/L1A.sqlite index d94fcbd..0f441f4 100644 Binary files a/database/L1A/L1A.sqlite and b/database/L1A/L1A.sqlite differ diff --git a/database/L2/L2_Main.sqlite b/database/L2/L2_Main.sqlite index c488c63..bb8414f 100644 Binary files a/database/L2/L2_Main.sqlite and b/database/L2/L2_Main.sqlite differ diff --git a/database/L3/L3_Features.sqlite b/database/L3/L3_Features.sqlite index 7b9b1f3..4f65b92 100644 Binary files a/database/L3/L3_Features.sqlite and b/database/L3/L3_Features.sqlite differ diff --git a/web/services/feature_service.py b/web/services/feature_service.py index e971083..a5114b3 100644 --- a/web/services/feature_service.py +++ b/web/services/feature_service.py @@ -1001,7 +1001,6 @@ class FeatureService: WHERE match_id IN ({match_id_ph}) AND match_team_id > 0 GROUP BY match_id, match_team_id """ - # Split match_ids into chunks if too many chunk_size = 900 party_sizes_list = [] for i in range(0, len(match_ids), chunk_size): @@ -1012,44 +1011,40 @@ class FeatureService: if party_sizes_list: df_party_sizes = pd.concat(party_sizes_list) - - # Merge party size to base data df_base_party = df_base.merge(df_party_sizes, on=['match_id', 'match_team_id'], how='left') - - # Calculate Stats per Party Size (1-5) - # We want columns like party_1_win_rate, party_1_rating, party_1_adr - party_stats = df_base_party.groupby(['steam_id_64', 'party_size']).agg({ - 'is_win': 'mean', - 'rating': 'mean', - 'adr': 'mean' - }).reset_index() - - # Pivot - pivoted_party = party_stats.pivot(index='steam_id_64', columns='party_size').reset_index() - - # Flatten and rename - new_party_cols = ['steam_id_64'] - for col in pivoted_party.columns: - if col[0] == 'steam_id_64': continue - metric, size = col - if size in [1, 2, 3, 4, 5]: - # metric is is_win, rating, adr - metric_name = 'win_rate' if metric == 'is_win' else metric - new_party_cols.append(f"party_{int(size)}_{metric_name}") - - # Handle MultiIndex column flattening properly - # The pivot creates MultiIndex. We need to construct a flat DataFrame. - flat_data = {'steam_id_64': pivoted_party['steam_id_64']} - for size in [1, 2, 3, 4, 5]: - if size in pivoted_party['is_win'].columns: - flat_data[f"party_{size}_win_rate"] = pivoted_party['is_win'][size] - if size in pivoted_party['rating'].columns: - flat_data[f"party_{size}_rating"] = pivoted_party['rating'][size] - if size in pivoted_party['adr'].columns: - flat_data[f"party_{size}_adr"] = pivoted_party['adr'][size] - - df_party_flat = pd.DataFrame(flat_data) - df = df.merge(df_party_flat, on='steam_id_64', how='left') + else: + df_base_party = df_base.copy() + + df_base_party['party_size'] = df_base_party['party_size'].fillna(1) + df_base_party = df_base_party[df_base_party['party_size'].isin([1, 2, 3, 4, 5])] + + party_stats = df_base_party.groupby(['steam_id_64', 'party_size']).agg({ + 'is_win': 'mean', + 'rating': 'mean', + 'adr': 'mean' + }).reset_index() + + pivoted_party = party_stats.pivot(index='steam_id_64', columns='party_size').reset_index() + + new_party_cols = ['steam_id_64'] + for col in pivoted_party.columns: + if col[0] == 'steam_id_64': continue + metric, size = col + if size in [1, 2, 3, 4, 5]: + metric_name = 'win_rate' if metric == 'is_win' else metric + new_party_cols.append(f"party_{int(size)}_{metric_name}") + + flat_data = {'steam_id_64': pivoted_party['steam_id_64']} + for size in [1, 2, 3, 4, 5]: + if size in pivoted_party['is_win'].columns: + flat_data[f"party_{size}_win_rate"] = pivoted_party['is_win'][size] + if size in pivoted_party['rating'].columns: + flat_data[f"party_{size}_rating"] = pivoted_party['rating'][size] + if size in pivoted_party['adr'].columns: + flat_data[f"party_{size}_adr"] = pivoted_party['adr'][size] + + df_party_flat = pd.DataFrame(flat_data) + df = df.merge(df_party_flat, on='steam_id_64', how='left') # 8.2 Rating Distribution # rating_dist_carry_rate (>1.5), normal (1.0-1.5), sacrifice (0.6-1.0), sleeping (<0.6)