Spaces:
Sleeping
Sleeping
File size: 8,289 Bytes
d89cb7d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | import json
from datetime import datetime
import pandas as pd
import pytz
import streamlit as st
# File paths
predictions_csv = 'predictions.csv'
users_json = 'users.json'
matches_json = 'matches.json'
outcomes_json = 'match_outcomes.json'
# Initialize CSV and JSON files if they don't exist
def initialize_files():
# Initialize predictions CSV
try:
pd.read_csv(predictions_csv)
except FileNotFoundError:
df = pd.DataFrame(columns=['user_name', 'match_id', 'predicted_winner', 'predicted_motm', 'bid_points'])
df.to_csv(predictions_csv, index=False)
# Load users from JSON
def get_users():
try:
with open(users_json, 'r') as file:
users = json.load(file)
return list(users.keys())
except FileNotFoundError:
return []
# Load matches from JSON
def load_matches():
try:
with open(matches_json, 'r') as f:
return json.load(f)
except FileNotFoundError:
return []
def load_match_outcomes():
try:
with open(outcomes_json, 'r') as file:
return json.load(file)
except FileNotFoundError:
return []
# Get today's date in IST to load today's match
def get_current_date_ist():
tz_IST = pytz.timezone('Asia/Kolkata')
datetime_ist = datetime.now(tz_IST)
return datetime_ist.strftime('%Y-%m-%d')
# Function to get matches for today
def get_today_matches():
today = get_current_date_ist()
matches = load_matches()
today_matches = [match for match in matches if match['date'] == today]
return today_matches
# Submit prediction function
def submit_prediction(user_name, match_id, predicted_winner, predicted_motm, bid_points):
# Ensure predictions DataFrame is loaded or initialized correctly
try:
predictions = pd.read_csv(predictions_csv)
# Check if all expected columns are present, if not, reinitialize the DataFrame
expected_columns = ['user_name', 'match_id', 'predicted_winner', 'predicted_motm', 'bid_points']
if not all(column in predictions.columns for column in expected_columns):
raise ValueError("CSV file missing one or more columns; Reinitializing.")
except (FileNotFoundError, ValueError) as e:
predictions = pd.DataFrame(columns=expected_columns)
# Check for duplicate prediction for the same match by the same user
if user_name == "Select a user...":
st.warning("Please select a valid user.")
return
else:
existing_predictions = predictions[(predictions['user_name'] == user_name) & (predictions['match_id'] == match_id)]
if not existing_predictions.empty:
st.error("You've already submitted a prediction for this match.")
return
# Append new prediction
new_prediction = {
'user_name': user_name,
'match_id': match_id,
'predicted_winner': predicted_winner,
'predicted_motm': predicted_motm,
'bid_points': bid_points
}
predictions = pd.concat([predictions, pd.DataFrame([new_prediction])], ignore_index=True)
predictions.to_csv(predictions_csv, index=False)
st.success("Prediction submitted successfully!")
# Streamlit UI
st.title("DIS IPL Match Predictions")
# Prediction form
with st.expander("Submit Prediction"):
# User selection
user_name = st.selectbox("Select User", ["Select a user..."] + get_users())
# Match selection
matches = get_today_matches()
if matches:
match_choice = st.selectbox("Select Today's Match", matches, format_func=lambda match: f"{match['teams'][0]} vs {match['teams'][1]}")
match_id = match_choice['match_id']
teams = match_choice['teams']
else:
st.write("No matches are scheduled for today.")
st.stop()
# Predictions
predicted_winner = st.selectbox("Predicted Winner", teams)
predicted_motm = st.text_input("Predicted Man of the Match")
bid_points = st.number_input("Bid Points", min_value=1, value=100)
# Submit button
if st.button("Submit Prediction"):
submit_prediction(user_name, match_id, predicted_winner, predicted_motm, bid_points)
# Show predictions
with st.expander("Predictions"):
# Display predictions
if st.button("Show Predictions"):
try:
df = pd.read_csv(predictions_csv)
st.dataframe(df)
except FileNotFoundError:
st.write("No predictions have been submitted yet.")
# Show leaderboard
with st.expander("Leaderboard"):
# Display leaderboard
if st.button("Show Leaderboard"):
try:
with open(users_json, 'r') as f:
users = json.load(f)
leaderboard = sorted(users.items(), key=lambda x: x[1], reverse=True)
df_leaderboard = pd.DataFrame(leaderboard, columns=['User', 'Points'])
# Add a 'Rank' column starting from 1
df_leaderboard['Rank'] = range(1, len(df_leaderboard) + 1)
# Reorder DataFrame columns so 'Rank' is first
df_leaderboard = df_leaderboard[['Rank', 'User', 'Points']]
st.dataframe(df_leaderboard)
except FileNotFoundError:
st.write("Leaderboard data not available.")
ADMIN_PASSPHRASE = "admin123"
def load_predictions():
# loading predictions from 'predictions.csv'
try:
return pd.read_csv(predictions_csv)
except FileNotFoundError:
return pd.DataFrame(columns=['user_name', 'match_id', 'predicted_winner', 'predicted_motm', 'bid_points'])
def load_users():
with open(users_json, 'r') as file:
return json.load(file)
def save_users(users):
with open(users_json, 'w') as file:
json.dump(users, file, indent=4)
def save_match_outcomes(outcomes):
with open(outcomes_json, 'w') as file:
json.dump(outcomes, file, indent=4)
def update_leaderboard_and_outcomes(match_id, winning_team, man_of_the_match):
outcomes = load_match_outcomes() # Load existing match outcomes
predictions = load_predictions() # Load existing predictions
users = load_users() # Load existing user points
# Update match outcomes
match_outcome = next((outcome for outcome in outcomes if outcome['match_id'] == match_id), None)
if match_outcome:
match_outcome['winning_team'] = winning_team
match_outcome['man_of_the_match'] = man_of_the_match
else:
outcomes.append({
"match_id": match_id,
"winning_team": winning_team,
"man_of_the_match": man_of_the_match
})
# Update user points based on prediction accuracy
match_predictions = predictions[predictions['match_id'] == match_id]
for _, prediction in match_predictions.iterrows():
user_name = prediction['user_name']
# Initialize user points if not present
users[user_name] = users.get(user_name, 1000)
if prediction['predicted_winner'] == winning_team:
users[user_name] += prediction['bid_points'] * 2 # Correct team prediction
else:
users[user_name] -= prediction['bid_points'] # Deduct points for incorrect prediction
if prediction['predicted_motm'] == man_of_the_match:
users[user_name] += 100 # Correct man of the match prediction
# Save updated outcomes and user points
save_match_outcomes(outcomes)
save_users(users)
with st.sidebar.expander("Admin Panel", expanded=False):
admin_pass = st.text_input("Enter admin passphrase:", type="password")
if admin_pass == ADMIN_PASSPHRASE:
st.success("Authenticated")
matches = get_today_matches() # this function gets matches for today
match_id_selection = st.selectbox("Select Match ID", [match['match_id'] for match in matches])
winning_team = st.text_input("Winning Team")
man_of_the_match = st.text_input("Man of the Match")
if st.button("Submit Match Outcome"):
update_leaderboard_and_outcomes(match_id_selection, winning_team, man_of_the_match)
st.success("Match outcome submitted and leaderboard updated!")
else:
st.error("Not authenticated")
|