DIS_IPL / app.py
jarajpu
DIS IPL App - Base
d89cb7d
raw
history blame
8.29 kB
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")