teresa / app.py
ogegadavis254's picture
Update app.py
9d150a9 verified
import streamlit as st
import requests
import os
import json
import pandas as pd
import plotly.graph_objects as go
import time
# Function to call the Together AI model for the initial analysis
def call_ai_model_initial(all_message):
url = "https://api.together.xyz/v1/chat/completions"
payload = {
"model": "NousResearch/Nous-Hermes-2-Yi-34B",
"temperature": 1.05,
"top_p": 0.9,
"top_k": 50,
"repetition_penalty": 1,
"n": 1,
"messages": [{"role": "user", "content": all_message}],
"stream_tokens": True,
}
TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY')
if TOGETHER_API_KEY is None:
raise ValueError("TOGETHER_API_KEY environment variable not set.")
headers = {
"accept": "application/json",
"content-type": "application/json",
"Authorization": f"Bearer {TOGETHER_API_KEY}",
}
response = requests.post(url, json=payload, headers=headers, stream=True)
response.raise_for_status() # Ensure HTTP request was successful
return response
# Function to call the Together AI model for analyzing the text and computing performance score
def call_ai_model_analysis(analysis_text):
url = "https://api.together.xyz/v1/chat/completions"
payload = {
"model": "NousResearch/Nous-Hermes-2-Yi-34B",
"temperature": 1.05,
"top_p": 0.9,
"top_k": 50,
"repetition_penalty": 1,
"n": 1,
"messages": [{"role": "user", "content": analysis_text}],
"stream_tokens": True,
}
TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY')
if TOGETHER_API_KEY is None:
raise ValueError("TOGETHER_API_KEY environment variable not set.")
headers = {
"accept": "application/json",
"content-type": "application/json",
"Authorization": f"Bearer {TOGETHER_API_KEY}",
}
response = requests.post(url, json=payload, headers=headers, stream=True)
response.raise_for_status() # Ensure HTTP request was successful
return response
# Streamlit app layout
st.title("Climate Impact on Sports Performance and Infrastructure in Kenya")
st.write("Analyze and visualize the impact of climate conditions on sports performance and infrastructure, with a focus on Kenya.")
# Inputs for climate conditions
temperature = st.number_input("Temperature (°C):", min_value=-50, max_value=50, value=25)
humidity = st.number_input("Humidity (%):", min_value=0, max_value=100, value=50)
wind_speed = st.number_input("Wind Speed (km/h):", min_value=0.0, max_value=200.0, value=15.0)
uv_index = st.number_input("UV Index:", min_value=0, max_value=11, value=5)
air_quality_index = st.number_input("Air Quality Index:", min_value=0, max_value=500, value=100)
precipitation = st.number_input("Precipitation (mm):", min_value=0.0, max_value=500.0, value=10.0)
atmospheric_pressure = st.number_input("Atmospheric Pressure (hPa):", min_value=900, max_value=1100, value=1013)
# Kenya-specific inputs
region = st.text_input("Enter region in Kenya:")
elevation = st.number_input("Elevation (m):", min_value=0, max_value=5000, value=1000)
# Sports and athlete inputs
sports = st.multiselect("Select sports:", ["Athletics", "Football", "Rugby", "Volleyball", "Boxing", "Swimming"])
athlete_types = st.multiselect("Select athlete types:", ["Professional", "Amateur", "Youth", "Senior"])
# Infrastructure inputs
infrastructure_types = st.multiselect("Select infrastructure types:", ["Outdoor Stadium", "Indoor Arena", "Training Facility", "Community Sports Ground"])
if st.button("Generate Prediction and Analysis"):
all_message = (
f"Assess the impact on sports performance, athletes, and infrastructure in Kenya based on climate conditions: "
f"Temperature {temperature}°C, Humidity {humidity}%, Wind Speed {wind_speed} km/h, UV Index {uv_index}, "
f"Air Quality Index {air_quality_index}, Precipitation {precipitation} mm, Atmospheric Pressure {atmospheric_pressure} hPa. "
f"Region: {region}, Elevation: {elevation}m. "
f"Sports: {', '.join(sports)}. Athlete types: {', '.join(athlete_types)}. "
f"Infrastructure types: {', '.join(infrastructure_types)}. "
f"Provide a detailed analysis of how these conditions affect performance, health, and infrastructure in Kenya. "
f"Include specific impacts for each sport, athlete type, and infrastructure type. "
f"Also, provide an overall performance score and an infrastructure impact score, both as percentages. "
f"Suggest mitigation strategies for both performance and infrastructure. "
f"Assess the socio-economic implications of these climate impacts on sports in Kenya, including equitable access to sports facilities. "
f"Organize the information in tables with the following columns: Climate Conditions, Impact on Sports Performance, "
f"Impact on Athletes' Health, Impact on Infrastructure, Mitigation Strategies, Socio-Economic Implications. "
f"Be as accurate and specific to Kenya as possible in your analysis. And please do not generate long texts, make it as short and precise as possible, i am stressing on this please, generate something short."
)
try:
stages = [
"Analyzing climate conditions...",
"Checking location data...",
"Fetching historical data...",
"Running simulations...",
"Processing current weather...",
"Assessing environmental factors...",
"Calculating predictions...",
"Compiling results...",
"Finalizing analysis...",
"Preparing output..."
]
with st.spinner("Analyzing climate conditions and generating predictions..."):
# Loop through each stage, updating the spinner text and waiting for 2 seconds
for stage in stages:
st.spinner(stage)
time.sleep(2)
initial_response = call_ai_model_initial(all_message)
initial_text = ""
for line in initial_response.iter_lines():
if line:
line_content = line.decode('utf-8')
if line_content.startswith("data: "):
line_content = line_content[6:] # Strip "data: " prefix
try:
json_data = json.loads(line_content)
if "choices" in json_data:
delta = json_data["choices"][0]["delta"]
if "content" in delta:
initial_text += delta["content"]
except json.JSONDecodeError:
continue
st.success("Analysis completed!")
# Display prediction
st.subheader("Climate Impact Analysis for Sports in Kenya")
st.markdown(initial_text.strip())
# Extract and display scores
performance_score = "N/A"
infrastructure_score = "N/A"
for line in initial_text.split('\n'):
if "performance score:" in line.lower():
performance_score = line.split(":")[-1].strip()
elif "infrastructure impact score:" in line.lower():
infrastructure_score = line.split(":")[-1].strip()
# Display performance and infrastructure scores
col1, col2 = st.columns(2)
with col1:
st.metric("Overall Performance Score", performance_score)
with col2:
st.metric("Infrastructure Impact Score", infrastructure_score)
# Prepare data for visualization
results_data = {
"Condition": ["Temperature", "Humidity", "Wind Speed", "UV Index", "Air Quality Index", "Precipitation", "Atmospheric Pressure"],
"Value": [temperature, humidity, wind_speed, uv_index, air_quality_index, precipitation, atmospheric_pressure]
}
results_df = pd.DataFrame(results_data)
# Display results in a table
st.subheader("Climate Conditions Summary")
st.table(results_df)
# Create a radar chart for climate conditions
fig = go.Figure(data=go.Scatterpolar(
r=[temperature/50*100, humidity, wind_speed/2, uv_index/11*100, air_quality_index/5, precipitation/5, (atmospheric_pressure-900)/2],
theta=results_df['Condition'],
fill='toself'
))
fig.update_layout(
polar=dict(
radialaxis=dict(visible=True, range=[0, 100])
),
showlegend=False
)
st.plotly_chart(fig)
# Display analyzed sports and infrastructure
st.subheader("Analyzed Components")
col1, col2, col3 = st.columns(3)
with col1:
st.write("**Sports:**")
for sport in sports:
st.write(f"- {sport}")
with col2:
st.write("**Athlete Types:**")
for athlete_type in athlete_types:
st.write(f"- {athlete_type}")
with col3:
st.write("**Infrastructure Types:**")
for infra_type in infrastructure_types:
st.write(f"- {infra_type}")
# Socio-economic impact analysis
st.subheader("Socio-Economic Impact Analysis")
socio_economic_prompt = (
f"Based on the climate conditions and sports analysis for {region}, Kenya, "
f"provide a brief assessment of the socio-economic implications, including impacts on: "
f"1) Local economy, 2) Community health, 3) Sports tourism, 4) Equitable access to sports facilities. "
f"Consider the specific context of Kenya and the selected region. and make the response very precise and short, do not yap"
)
with st.spinner("Analyzing socio-economic impacts..."):
socio_economic_response = call_ai_model_analysis(socio_economic_prompt)
socio_economic_text = ""
for line in socio_economic_response.iter_lines():
if line:
line_content = line.decode('utf-8')
if line_content.startswith("data: "):
line_content = line_content[6:]
try:
json_data = json.loads(line_content)
if "choices" in json_data:
delta = json_data["choices"][0]["delta"]
if "content" in delta:
socio_economic_text += delta["content"]
except json.JSONDecodeError:
continue
st.markdown(socio_economic_text.strip())
# Mitigation strategies
st.subheader("Mitigation Strategies")
mitigation_prompt = (
f"Based on the climate conditions and sports analysis for {region}, Kenya, "
f"suggest specific mitigation strategies for: "
f"1) Improving athlete performance and health, 2) Enhancing infrastructure resilience, "
f"3) Ensuring equitable access to sports facilities. "
f"Consider the specific context of Kenya and the selected region. And make the response very precise and short, do not yap"
)
with st.spinner("Generating mitigation strategies..."):
mitigation_response = call_ai_model_analysis(mitigation_prompt)
mitigation_text = ""
for line in mitigation_response.iter_lines():
if line:
line_content = line.decode('utf-8')
if line_content.startswith("data: "):
line_content = line_content[6:]
try:
json_data = json.loads(line_content)
if "choices" in json_data:
delta = json_data["choices"][0]["delta"]
if "content" in delta:
mitigation_text += delta["content"]
except json.JSONDecodeError:
continue
st.markdown(mitigation_text.strip())
# Display raw analysis result for debugging
with st.expander("Show Raw Analysis"):
st.text(initial_text)
except ValueError as ve:
st.error(f"Configuration error: {ve}")
except requests.exceptions.RequestException as re:
st.error(f"Request error: {re}")
except Exception as e:
st.error(f"An unexpected error occurred: {e}")