fiboa-demo / fiboa /query.py
cholmes's picture
testing-patch (#4)
18422d2 verified
import re
import leafmap.maplibregl as leafmap
import pandas as pd
import streamlit as st
from ibis import _
def execute_prompt(con, chain, prompt):
response = chain.invoke({"question": prompt})
st.write(response.replace("testing", "crops"))
gdf = as_geopandas(con, response)
if len(gdf) == 0:
st.write("No results found.")
return
if 'geometry' in gdf.columns:
m = leafmap.Map()
m.add_gdf(gdf)
m.to_streamlit()
else:
gdf.drop(columns=['geometry', 'bbox', 'bbox.minx', 'bbox.maxx', 'bbox.miny', 'bbox.maxy'], errors='ignore', inplace=True)
st.dataframe(pd.DataFrame(gdf), column_config={
"area": st.column_config.NumberColumn("Area (ha)", format="%.5f"),
"perimeter": st.column_config.NumberColumn("Perimeter (m)", format="%.3f"),
"determination_datetime": st.column_config.DatetimeColumn("Determination Date"),
})
def as_geopandas(con, response):
#import code; code.interact(local=locals())
response = re.sub(";$", "", response).replace("testing", "crops")
sql_query = f"CREATE OR REPLACE VIEW testing AS ({response})"
con.raw_sql(sql_query)
gdf = con.table("testing")
if 'geometry' in gdf.columns:
gdf = (gdf
.cast({"geometry": "geometry"})
# .mutate(geometry = _.geometry.convert("EPSG:4326", "EPSG:4326"))
.to_pandas()
).set_crs(epsg=4326, inplace=True)
else:
gdf = gdf.to_pandas()
for col in gdf.columns:
dtype = str(gdf[col].dtype)
if dtype.startswith("datetime64"):
gdf[col] = gdf[col].astype(str)
return gdf