terry / app.py
ogegadavis254's picture
Update app.py
7fcff87 verified
raw
history blame
6.1 kB
import streamlit as st
import requests
import os
import json
import pandas as pd
import time
import matplotlib.pyplot as plt
# Function to call the Together AI model
def call_ai_model(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 request numeric performance data from AI
def get_numeric_performance_data(temperature):
all_message = (
f"Provide the expected numeric sports performance value (as a score) at a temperature of {temperature}°C."
)
response = call_ai_model(all_message)
generated_text = ""
for line in 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 and delta["content"].strip().replace('.', '', 1).isdigit():
return float(delta["content"].strip())
except json.JSONDecodeError:
continue
return None
# Streamlit app layout
st.title("Climate Impact on Sports Performance and Infrastructure")
st.write("Analyze and visualize the impact of climate conditions on sports performance and infrastructure.")
# 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)
if st.button("Generate Prediction"):
all_message = (
f"Assess the impact on sports performance and infrastructure 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."
)
try:
with st.spinner("Analyzing climate conditions..."):
response = call_ai_model(all_message)
st.success("Initial analysis complete. Generating detailed predictions...")
generated_text = ""
for line in 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 and delta["content"].strip().replace('.', '', 1).isdigit():
generated_text += delta["content"]
except json.JSONDecodeError:
continue
st.success("Detailed predictions generated.")
# 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("Results Summary")
st.table(results_df)
# Display prediction
st.markdown("**Predicted Impact on Performance and Infrastructure:**")
st.markdown(generated_text.strip())
st.success("Generating performance data...")
# Generate numeric performance data for different temperatures
temperatures = range(-10, 41, 5) # Temperatures from -10°C to 40°C in 5°C increments
performance_values = []
for temp in temperatures:
st.spinner(f"Fetching performance data for {temp}°C...")
performance_value = get_numeric_performance_data(temp)
if performance_value is not None:
performance_values.append(performance_value)
time.sleep(1)
if performance_values:
# Generate line graph
fig, ax = plt.subplots()
ax.plot(temperatures, performance_values, marker='o')
ax.set_xlabel('Temperature (°C)')
ax.set_ylabel('Performance Score')
ax.set_title('Temperature vs. Numeric Sports Performance')
st.pyplot(fig)
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}")