95 lines
3.4 KiB
Python
95 lines
3.4 KiB
Python
|
|
|
||
|
|
import sqlite3
|
||
|
|
import pandas as pd
|
||
|
|
import os
|
||
|
|
|
||
|
|
# Config
|
||
|
|
L2_DB_PATH = r'database/L2/L2_Main.sqlite'
|
||
|
|
|
||
|
|
def debug_player_data(username_pattern='jAckY'):
|
||
|
|
if not os.path.exists(L2_DB_PATH):
|
||
|
|
print(f"Error: L2 DB not found at {L2_DB_PATH}")
|
||
|
|
return
|
||
|
|
|
||
|
|
conn_l2 = sqlite3.connect(L2_DB_PATH)
|
||
|
|
|
||
|
|
print(f"--- Debugging Player: {username_pattern} ---")
|
||
|
|
|
||
|
|
try:
|
||
|
|
# 1. Find the player ID
|
||
|
|
q_id = f"SELECT steam_id_64, username FROM dim_players WHERE username LIKE '%{username_pattern}%'"
|
||
|
|
df_player = pd.read_sql_query(q_id, conn_l2)
|
||
|
|
|
||
|
|
if df_player.empty:
|
||
|
|
print("Player not found.")
|
||
|
|
return
|
||
|
|
|
||
|
|
target_id = df_player.iloc[0]['steam_id_64']
|
||
|
|
name = df_player.iloc[0]['username']
|
||
|
|
print(f"Found: {name} ({target_id})")
|
||
|
|
|
||
|
|
# 2. Check Match Stats (ADR, Rounds)
|
||
|
|
q_matches = f"""
|
||
|
|
SELECT match_id, round_total, adr, (adr * round_total) as damage_calc
|
||
|
|
FROM fact_match_players
|
||
|
|
WHERE steam_id_64 = '{target_id}'
|
||
|
|
"""
|
||
|
|
df_matches = pd.read_sql_query(q_matches, conn_l2)
|
||
|
|
|
||
|
|
total_dmg = df_matches['damage_calc'].sum()
|
||
|
|
total_rounds = df_matches['round_total'].sum()
|
||
|
|
print(f"\nMatch Stats:")
|
||
|
|
print(f"Matches Played: {len(df_matches)}")
|
||
|
|
print(f"Total Rounds: {total_rounds}")
|
||
|
|
print(f"Total Damage (Calc): {total_dmg:,.0f}")
|
||
|
|
|
||
|
|
# 3. Check Economy Stats (Spend)
|
||
|
|
q_eco = f"""
|
||
|
|
SELECT match_id, COUNT(*) as rounds_with_eco, SUM(equipment_value) as spend
|
||
|
|
FROM fact_round_player_economy
|
||
|
|
WHERE steam_id_64 = '{target_id}'
|
||
|
|
GROUP BY match_id
|
||
|
|
"""
|
||
|
|
df_eco = pd.read_sql_query(q_eco, conn_l2)
|
||
|
|
|
||
|
|
total_spend = df_eco['spend'].sum()
|
||
|
|
total_eco_rounds = df_eco['rounds_with_eco'].sum()
|
||
|
|
|
||
|
|
print(f"\nEconomy Stats:")
|
||
|
|
print(f"Matches with Eco Data: {len(df_eco)}")
|
||
|
|
print(f"Rounds with Eco Data: {total_eco_rounds}")
|
||
|
|
print(f"Total Spend: ${total_spend:,.0f}")
|
||
|
|
|
||
|
|
# 4. Compare
|
||
|
|
print(f"\nComparison:")
|
||
|
|
print(f"Rounds in Match Stats: {total_rounds}")
|
||
|
|
print(f"Rounds in Eco Stats: {total_eco_rounds}")
|
||
|
|
|
||
|
|
if total_eco_rounds < total_rounds:
|
||
|
|
print(f"⚠️ WARNING: Missing economy data for {total_rounds - total_eco_rounds} rounds!")
|
||
|
|
|
||
|
|
# Find matches with missing eco data
|
||
|
|
merged = df_matches.merge(df_eco, on='match_id', how='left')
|
||
|
|
missing = merged[merged['spend'].isna() | (merged['spend'] == 0)]
|
||
|
|
|
||
|
|
if not missing.empty:
|
||
|
|
print(f"\nMatches with ZERO spend/Missing Eco:")
|
||
|
|
print(missing[['match_id', 'round_total', 'damage_calc']])
|
||
|
|
|
||
|
|
# Check calculation impact
|
||
|
|
valid_dmg = merged[merged['spend'] > 0]['damage_calc'].sum()
|
||
|
|
print(f"\nRecalculation ignoring missing matches:")
|
||
|
|
print(f"Valid Damage: {valid_dmg:,.0f}")
|
||
|
|
print(f"Total Spend: ${total_spend:,.0f}")
|
||
|
|
if total_spend > 0:
|
||
|
|
new_val = valid_dmg / (total_spend / 1000)
|
||
|
|
print(f"Corrected Dmg/$1k: {new_val:.2f}")
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
print(f"Error: {e}")
|
||
|
|
finally:
|
||
|
|
conn_l2.close()
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
debug_player_data()
|