Soy nuevo en streamlit y estoy tratando de mostrar una capa pydeck con columnas. Quiero que la altura de la columna sea la columna de rain (mm) que estoy proporcionando en un marco de datos, pero cada vez que uso get_evelation="rain (mm)" , aparece el siguiente error:
Error: Function calls not allowed in JSON expressions at http://localhost:8501/static/js/7.f6560317.chunk.js:2:512302 at u (http://localhost:8501/static/js/7.f6560317.chunk.js:2:512666) at http://localhost:8501/static/js/7.f6560317.chunk.js:2:512596 at Array.forEach (<anonymous>) at u (http://localhost:8501/static/js/7.f6560317.chunk.js:2:512568) at u (http://localhost:8501/static/js/7.f6560317.chunk.js:2:512673) at t.default (http://localhost:8501/static/js/7.f6560317.chunk.js:2:512250) at eh [as convertFunction] (http://localhost:8501/static/js/7.f6560317.chunk.js:2:1049691) at http://localhost:8501/static/js/7.f6560317.chunk.js:2:2778265 at y (http://localhost:8501/static/js/7.f6560317.chunk.js:2:2778495)La función que estoy usando para renderizar mi mapa es la siguiente:
def make_map2(data, lat, lon, zoom): column_layer = pdk.Layer( "ColumnLayer", data=data, get_position=["lon", "lat"], get_elevation="rain (mm)", elevation_scale=20, radius=2000, get_fill_color=[180, 0, 200, 140], pickable=True, auto_highlight=True, extruded=True ) tooltip={'html': 'Location: {location}</br> Date: {date} </br> Rainfall (mm): {rain_mm}</br> Type: {type}'} r = pdk.Deck(column_layer, initial_view_state={ "latitude": lat, "longitude": lon, "zoom": zoom, "pitch": 60 }, tooltip=tooltip, map_provider="mapbox", map_style='mapbox://styles/mapbox/light-v9', ) map2 = st.write(r) return map2Los datos de entrada tienen esta estructura:
date location lat lon rain (mm) type 0 2021-09-15 lowestoft 52.483 1.727 54.115513 predicted 1 2021-09-15 heathrow 51.479 -0.449 30.008739 predicted 2 2021-09-15 eastbourne 50.762 0.285 90.584396 predicted 3 2021-09-15 cambridge 52.245 0.102 51.445862 predicted 4 2021-09-15 manston 51.346 1.337 81.089737 predicted 5 2021-09-15 oxford 51.761 -1.262 39.420902 predictedEsto podría ser tan simple como un argumento mal escrito:
get_evelation="rain (mm)" debería ser get_elevation="rain (mm)"
Editar: independientemente del nombre del argumento mal escrito, este error ocurre en la forma en que pydeck analiza los literales de cadena. pydeck asume que rain (mm) es una llamada de función y arroja un error. Nombrar la columna get_elevation sin espacios ni paréntesis permite que el ejemplo funcione:
import pandas as pd import numpy as np import streamlit as st import pydeck as pdk df = pd.read_csv("~/Desktop/data.csv") #to prove hypothesis, make column name one continuous string with no extra characters df["rain_noparens"] = df["rain (mm)"] view = pdk.data_utils.compute_view(df[["lon", "lat"]]) view.pitch = 75 view.bearing = 60 column_layer = pdk.Layer( "ColumnLayer", data=df, get_position=["lon", "lat"], get_elevation="rain_noparens", elevation_scale=20, radius=2000, get_fill_color=[180, 0, 200, 140], pickable=True, auto_highlight=True, ) tooltip = { "html": "Location: {location}</br> Date: {date} </br> Rainfall (mm): {rain (mm)}</br> Type: {type}" } r = pdk.Deck( column_layer, initial_view_state=view, tooltip=tooltip, map_provider="mapbox", map_style="mapbox://styles/mapbox/light-v9", ) st.pydeck_chart(r)Ver también: https://github.com/streamlit/streamlit/issues/3992