import gradio as gr # import plotly.graph_objects as go import pandas as pd import numpy as np from scipy.stats import multivariate_normal as mvn import random AIRTABLE_TOKEN = os.environ.get("AIRTABLE_TOKEN") SUMMARY_TABLE_URL = os.environ.get("SUMMARY_TABLE_URL") def send_to_airtable(data, url): headers = { "Authorization": f"Bearer {AIRTABLE_TOKEN}", "Content-Type": "application/json" } data = json.dumps(data) response = requests.post(url, headers=headers, data=data) print(response.text) return response.text def log_final_decision(group_name, total_yield, injection, production, url): data = {"fields": {"group_name": group_name, "total_yield": total_yield, "injection": injection, "production": production}} return send_to_airtable(data, url) df = pd.read_csv('volcs.csv') cities = ["Serang", "Bogor", "Jogja", "Bandung", "Tasikmalaya", "Purwokerto", "Semarang", "Malang", "Banyuwangi", "Tarogong", "Temanggung"] gammas = [0.9, 0.9, 0.93, 0.89, 0.81, 0.90, 0.98, 0.99, 0.89, 0.85, 0.80] cities_lats = [-6.12028, -6.59444, -7.7956, -6.9175, -7.3268, -7.4214, -6.96667, -7.9839, -8.2186, -7.3178564, -6.3929] cities_lons = [106.15028, 106.78917, 110.3644, 107.6191, 108.2142, 109.2341, 110.4208, 112.6315, 114.3695, 110.1779144, 105.8391] sigma = 0.05 sigma_diag1 = 0.01 sigma_diag2 = 0.005 offset = 1 num_grid = 800 Sigma = [[sigma, sigma_diag1], [sigma_diag2, sigma]] # min_lat, max_lat = df['Latitude'].min() - offset, df['Latitude'].max() + offset # min_lon, max_lon = df['Longitude'].min() - offset, df['Longitude'].max() + offset # lats = np.linspace(min_lat, max_lat, num_grid) # lons = np.linspace(min_lon, max_lon, num_grid) # LON, LAT = np.meshgrid(lons, lats) # density = np.zeros(LAT.shape) # for idx, row in df.iterrows(): # lat, lon = row['Latitude'], row['Longitude'] # gaussian = mvn(mean=[lat, lon], cov=Sigma) # density += gaussian.pdf(np.dstack((LAT, LON))) # lon_points = LON.ravel().tolist() # lat_points = LAT.ravel().tolist() # density_points = density.ravel().tolist() def get_density(city): idx = cities.index(city) lat, lon = cities_lats[idx], cities_lons[idx] density = 0 for idx, row in df.iterrows(): lat2, lon2 = row['Latitude'], row['Longitude'] gaussian = mvn(mean=[lat2, lon2], cov=Sigma) density += gaussian.pdf([lat, lon]) return density def get_energy_yield(production, injection, group, length=30): density = get_density(production) gamma = gammas[cities.index(production)] dist = random.uniform(0.98, 1.02) yield_dict = {"Year": [], "yield": []} for i in range(1, length): yield_dict["Year"].append(i) yield_dict["yield"].append((10*density/dist) * gamma**i) df = pd.DataFrame(yield_dict) plt = gr.ScatterPlot( value = df, x = "Year", y = "yield", title = "Energy Yield Over Time", x_title = "Year", y_title = "Energy Yield (MWh)" ) total_yield = sum(yield_dict['yield']) total_text = f"Total Energy Yield for 30 years: {total_yield:.2f} MWh" #if group is empty, return warning as text label if group == "": total_text = "Please enter your group number" plt = gr.ScatterPlot() return total_text, plt else: log_final_decision(group, total_yield, injection, production, SUMMARY_TABLE_URL) return total_text, plt # def draw_map(): # fig = go.Figure() # fig.add_trace(go.Densitymapbox( # lat=lat_points, # lon=lon_points, # z=density_points, # radius=2, # colorscale='Jet', # opacity=0.5, # hoverinfo="skip", # )) # fig.add_trace(go.Scattermapbox( # lat=cities_lats, # lon=cities_lons, # mode='markers', # marker=go.scattermapbox.Marker(color="black"), # text=cities, # hoverinfo="text" # )) # fig.update_layout( # title='Geothermal Potentials in Java, Indonesia (Old Data)', # mapbox_style="open-street-map", # mapbox=dict( # center=dict(lat=(min_lat + max_lat) / 2, lon=(min_lon + max_lon) / 2), # zoom=6 # ), # margin=dict(l=0, r=0, t=0, b=0) # ) # return fig with gr.Blocks() as demo: gr.Label("Geothermal Potential in Java, Indonesia") gr.HTML("
") gr.HTML("Interactive map: here") # map = gr.Plot() with gr.Row(): injection = gr.Radio(cities, label="Location", info="Choose injection well location"), production = gr.Radio(cities, label="Location", info="Choose production well location") with gr.Row(): group = gr.Textbox(label="Group number", info="Enter your group number") btn = gr.Button("Build Geothermal Wells") with gr.Row(): energy = gr.Label() energy_30 = gr.ScatterPlot() # demo.load(draw_map, [], map) demo.load() btn.click( get_energy_yield, inputs = [production, injection, group], outputs = [energy, energy_30] ) demo.launch()