Я пытаюсь создать картографическую карту в приложении с потоковой подсветкой на Snowflake.
Помимо снежинки, я могу использовать следующий код для визуализации карты, на которой только один округ в Алабаме имеет цветовую кодировку.
import streamlit as st
import altair as alt
import pandas as pd
from vega_datasets import data
us_counties = alt.topo_feature(data.us_10m.url, "counties")
dist_background = alt.Chart(us_counties).mark_geoshape(fill = "lightgray", stroke = "white").project("albersUsa")
df = {"FIPS_CD": 1001,
"FIPS_COLOR": 1}
df = pd.DataFrame(df, index=[0])
dist_foreground = (
alt.Chart(us_counties)
.mark_geoshape()
.transform_lookup(lookup = "id", from_=alt.LookupData(df, "FIPS_CD", ["FIPS_COLOR"]))
.encode(color=alt.Color("FIPS_COLOR:Q"))
.project(type = "albersUsa")
)
dist_chart = alt.layer(dist_background, dist_foreground).properties(width=800, height=800)
st.altair_chart(dist_chart, use_container_width=True)
Однако, если я попытаюсь запустить тот же код в приложении Streamlit в Snowflake, он вообще не будет отображаться. Я получаю пустое место, где отображается только легенда, но в Snowflake легенда показывает «NaN», а при запуске кода вне среды Snowflake — 1. Я вижу, что данные загрузились, нажав на многоточие рядом с графиком и перейдя в редактор vega. Когда я это делаю, я вижу на графике всю страну, но цветового кодирования нет.
Что Снежинка делает за кулисами, что все портит? В Snowflake я использую следующие параметры пакета:
Проблема в том, что Altair пытается загрузить файл topojson из внешнего CDN во внешнем интерфейсе, что блокируется политикой безопасности контента, установленной Snowflake (которая не позволяет Streamlit в приложениях Snowflake получать доступ к произвольным внешним доменам по соображениям безопасности).
Если вы откроете консоль разработчика браузера во время запуска приложения, вы должны увидеть журнал, подобный этому, который указывает на проблему:
Refused to connect to 'https://cdn.jsdelivr.net/npm/[email protected]/data/us-10m.json' because it violates the document's Content Security Policy.
Доступный сегодня обходной путь — использовать локальную копию файла topojson на этапе приложения — я не эксперт в топографических функциях Altair, но знаю, например, что plotly.express.choropleth_mapbox поддерживает это.
Кроме того, чтобы воспроизвести предоставленный пример кода, вам нужно добавить from vega_datasets import data
.
Спасибо за это. Ошибка, о которой вы упомянули, действительно была проблемой. В итоге я подготовил приложение, но мне пришлось использовать pydeck, чтобы заставить картографию работать. И у Альтаира, и у Plotly были проблемы... казалось бы, проблемы с построением картоплетов на Snowflake хорошо задокументированы на их доске помощи, но никакого решения предложено не было. Кажется, Пайдек работает.
Позволяет ли Snowflake получить доступ к URL-адресу из вашего блокнота? Может это как-то блокирует
data.us_10m.url
? Вы можете попробовать загрузить набор данных и сохранить его локально на Snowflake, чтобы сравнить, или попробовать один из других примеров в галерее, в котором используется URL-адрес, а не геодиаграмма.