|
import os |
|
import json |
|
import threading |
|
import gradio as gr |
|
import statistics |
|
from scipy import stats |
|
|
|
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) |
|
|
|
n = len(guesses) |
|
average = sum(guesses) / n |
|
|
|
if n >= 2: |
|
|
|
s = statistics.stdev(guesses) |
|
|
|
SE = s / (n ** 0.5) |
|
|
|
df = n - 1 |
|
|
|
confidence_level = 0.95 |
|
alpha = 1 - confidence_level |
|
|
|
t_value = stats.t.ppf(1 - alpha/2, df) |
|
|
|
ME = t_value * SE |
|
|
|
ci_lower = average - ME |
|
ci_upper = average + ME |
|
|
|
return ( |
|
f"Your guess has been recorded.\n" |
|
f"Current average of all guesses: {average:.2f}\n" |
|
f"95% confidence interval: ({ci_lower:.2f}, {ci_upper:.2f})" |
|
) |
|
else: |
|
|
|
return ( |
|
f"Your guess has been recorded.\n" |
|
f"Current average of all guesses: {average:.2f}\n" |
|
f"Not enough data to compute confidence interval." |
|
) |
|
|
|
demo = gr.Interface( |
|
fn=add_guess, |
|
inputs=gr.Number(label="Enter your guess"), |
|
outputs="text", |
|
title="Collective Guessing Game", |
|
description="Submit your guess and contribute to the global average!" |
|
) |
|
|
|
|
|
demo.launch() |