File size: 3,238 Bytes
0ef03ea 41afdc7 0ef03ea 41afdc7 0ef03ea 3831198 41afdc7 3831198 41afdc7 3831198 41afdc7 0ef03ea 3831198 41afdc7 3831198 41afdc7 0ef03ea fd0fa88 41afdc7 fd0fa88 3831198 fd0fa88 3831198 41afdc7 |
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 |
import os
import json
import threading
import gradio as gr
import statistics
from scipy import stats
import numpy as np # Added import for numpy to compute percentiles
DATA_DIR = './storage'
DATA_FILE = os.path.join(DATA_DIR, 'guesses.json')
lock = threading.Lock()
def ensure_data_directory():
os.makedirs(DATA_DIR, exist_ok=True)
def load_guesses():
ensure_data_directory()
if not os.path.exists(DATA_FILE):
with open(DATA_FILE, 'w') as f:
json.dump([], f)
with open(DATA_FILE, 'r') as f:
return json.load(f)
def save_guesses(guesses):
with open(DATA_FILE, 'w') as f:
json.dump(guesses, f)
def add_guess(guess):
with lock:
guesses = load_guesses()
guesses.append(guess)
save_guesses(guesses)
return compute_statistics(guesses, include_message=True)
def get_current_results():
with lock:
guesses = load_guesses()
return compute_statistics(guesses, include_message=False)
def compute_statistics(guesses, include_message):
n = len(guesses)
if n == 0:
return "No guesses have been made yet."
average = sum(guesses) / n
median = statistics.median(guesses)
# Calculate IQR
Q1 = np.percentile(guesses, 25)
Q3 = np.percentile(guesses, 75)
IQR = Q3 - Q1
# Initialize the message
message = (
(f"Your guess has been recorded.\n" if include_message else "") +
f"Current average of all {n} guesses: {average:.2f}\n" +
f"Median of all guesses: {median:.2f}\n" +
f"Interquartile Range (IQR): {IQR:.2f}\n" +
"(The IQR is the range between the 25th percentile and 75th percentile of the data.)\n"
)
if n >= 2:
# Calculate sample standard deviation
s = statistics.stdev(guesses)
# Calculate standard error
SE = s / (n ** 0.5)
# Degrees of freedom
df = n - 1
# Confidence level (e.g., 95%)
confidence_level = 0.95
alpha = 1 - confidence_level
# Calculate critical t-value
t_value = stats.t.ppf(1 - alpha/2, df)
# Calculate margin of error
ME = t_value * SE
# Calculate confidence interval
ci_lower = average - ME
ci_upper = average + ME
# Append confidence interval to the message
message += f"95% confidence interval for the average: ({ci_lower:.2f}, {ci_upper:.2f})"
else:
# Not enough data to compute confidence interval
message += "Not enough data to compute confidence interval for the average."
return message
with gr.Blocks() as demo:
gr.Markdown("# Collective Guessing Game")
gr.Markdown("Submit your guess and contribute to the global statistics!")
guess_input = gr.Number(label="Enter your guess")
submit_button = gr.Button("Submit Guess")
with gr.Accordion("View Current Results!", open=False):
output_text = gr.Textbox(label="Results", lines=10)
refresh_button = gr.Button("Refresh Results")
submit_button.click(fn=add_guess, inputs=guess_input, outputs=output_text)
refresh_button.click(fn=get_current_results, outputs=output_text)
demo.load(fn=get_current_results, outputs=output_text)
demo.launch() |