Spaces:
Sleeping
Sleeping
import os | |
import pycountry | |
import numpy as np | |
import pandas as pd | |
import gradio as gr | |
from datetime import datetime | |
import plotly.graph_objects as go | |
from Request_OECD_Data import oecd_data | |
master_file = 'OECD_DF_CITIES_coord.csv' | |
def reload_data(master_file): | |
if os.path.isfile(master_file): | |
now = datetime.now() | |
fdate = datetime.fromtimestamp(os.path.getmtime(master_file)) | |
delta = (now - fdate).days | |
if delta > 30: | |
df = oecd_data() | |
else: | |
df = pd.read_csv(master_file) | |
else: | |
df = oecd_data() | |
return df | |
def feat_list(): | |
global feats | |
global feat_simp | |
global feat_dict | |
df = reload_data(master_file) | |
non_feat = ['METRO_ID', 'Metropolitan areas', 'coordinates'] | |
feats = [f for f in df.columns.tolist() if f not in non_feat] | |
feat_simp = [f.split(' (')[0] for f in feats] | |
feat_dict = dict(zip(feat_simp, feats)) | |
return feat_simp | |
feat_list() | |
def feat_chooser(feat): | |
feat_simp = feat_list() | |
index = feat_simp.index(feat) | |
choosen_feat = '<h2>' + feat_dict[feat] + '</h2>' | |
features = gr.Dropdown(choices=feat_simp, label='Select the economic descriptor', value=feat_simp[index], interactive=True) | |
fig = plot_feat(feat) | |
return choosen_feat, features, fig | |
def plot_feat(feat): | |
feat = feat_dict[feat] | |
print(feat) | |
df = reload_data(master_file) | |
df = df.dropna(subset=[feat]) | |
df = df.sort_values(by=feat, ascending=False) | |
df = df.reset_index(drop=True).reset_index().rename(columns={'index': 'Rank'}) | |
df['Rank'] = df['Rank'] + 1 | |
df['digit'] = df['Rank'].astype(str).str.len().astype(int) + 2 | |
df['pad'] = ' ' | |
df['pad']= df['pad'].str.repeat(df['digit']) | |
df['Latitude'] = df['coordinates'].str.split(',').str[1].str.replace(r'\)', '', regex=True) | |
df['Longitude'] = df['coordinates'].str.split(',').str[0].str.replace(r'\(', '', regex=True) | |
df['ISO2'] = df['METRO_ID'].apply(lambda s: ''.join(c for c in s if c.isalpha())) | |
def iso_to_iso(row): | |
if len(row) > 2: | |
row = pycountry.countries.get(alpha_3=row).alpha_2 | |
else: | |
if row == 'EL': | |
row = 'GR' | |
elif row == 'UK': | |
row = 'GB' | |
else: | |
row = row | |
return row | |
df['Country Code'] = df['ISO2'].apply(lambda x: iso_to_iso(x)) | |
df['Flag'] = df['Country Code'].apply(lambda x: pycountry.countries.get(alpha_2=x).flag) | |
fig = go.Figure() | |
fig.add_trace(go.Choropleth()) | |
fig.add_trace(go.Scattergeo( | |
lon = df['Longitude'], | |
lat = df['Latitude'], | |
text = df['Rank'].astype(str) + '. ' + '<b>' + df['Metropolitan areas'] + '</b>' + ' ' + df['Flag'] + '<br>' + df['pad'] + '<b>' + '$' + df[feat].astype(str) + 'K' + '</b>', | |
hoverinfo='text', | |
name = '', | |
mode = 'markers', | |
marker = dict( | |
size = df[feat], | |
#sizemin=4, | |
sizeref=2.*max(df[feat])/(40.**2), | |
sizemode = 'area', | |
color = df[feat], | |
colorscale='Portland', | |
showscale=True, | |
), | |
)) | |
fig.update_geos(projection_type='orthographic', projection_rotation = {'lat': 49.6112768, 'lon': 6.129799, 'roll': 0}, projection_scale = 1) | |
fig.update_layout(height=1080, hoverlabel=dict(font_size=14,font_family='Courier New, monospace')) | |
return fig | |
### Gradio app ### | |
with gr.Blocks() as demo: | |
gr.HTML('<h1>OECD Functional Urban Areas</h1>') | |
features = gr.Dropdown(choices=feat_simp, label='Select the economic descriptor', value=feat_simp[0], interactive=True) | |
choosen_feat = gr.HTML(feat_dict[feat_simp[0]]) | |
world_map = gr.Plot() | |
features.input(fn=feat_chooser, inputs=features, outputs=[choosen_feat, features, world_map]) | |
demo.load(plot_feat, [features], world_map) | |
port = int(os.environ.get('PORT', 7860)) | |
demo.launch(server_name="0.0.0.0", server_port=port) | |