Streamlit. Поиск кратчайшего пути

Kate

Administrator
Команда форума
Самое длинное приключение начинается со слов «Я знаю короткую дорогу». Интересно о чем это? Читай дальше!

Streamlit - библиотека Python с открытым кодом. Она позволяет с легкостью создавать разные красивые веб-приложения для инженеров машинного обучения. Всего за несколько минут и пару строк кода можно создать стильные приложения.

Для установки библиотеки необходимо прописать следующее в консоли Python:

pip install streamlit
Для написания приложения достаточно выполнить пару действий:

1. Создать Python файл, например, first_app.py

2. Импортировать библиотеку

import streamlit as st

3. Запустить через консоль Python

streamlit run first_app.py

Библиотека имеет широкий функционал и позволяет создавать графики, дашборды и карты, а также красиво визуализировать DataFrame’ы.

Примеры ниже:

Пример 1
Пример 1
Пример 2
Пример 2
Пример 3
Пример 3
Данные примеры требуют лишь пару строчек кода для создания.



Для того чтобы задать заголовок вашему приложению достаточно ввести следующий код:

st.title('My first app')

Streamlit поддерживает многие популярные библиотеки для работы с данными, такие как Matplotlib, Altair, deck.gl, Pandas и другие.

Например, для визуализации DataFrame’а с библиотеки Pandas достаточно создать его, и прописать st.write():

df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
st.write(df)
Получаем:

db90a5d6a2e1d7059ca469d4ebcdaa32.png

Если необходимо вывести данные в виде линейного графика, то вызываем команду:

chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])

st.line_chart(chart_data)
cf3af678c2d1f62abd69afa3c3339fbb.png

С помощью комманды st.map() можно отобразить точки с координатами

(широта, долгота) на карте. Пример:

df = pd.DataFrame(
np.random.randn(100, 2) / [0.5, 0.5] + [55.5, 37.33],
columns=['lat', 'lon'])
st.map(df)
9d05a7cf81a5b99b964927c2013aa7b1.png

Попробуем отобразить на карте маршруты передвижений.

Датасет был взят отсюда https://data.world/cityofaustin/azhh-4hg8

В нем содержатся маршруты мусороуборочных машин в городе Остин, США.

Будем отображать маршруты с возможностью показывать их по определенному дню недели.

Необходимые колонки из датасета:

the_geom - показывает координаты каждой точки маршрута.

GARB_DAY - отображает день недели маршрута.

Результат работы:

8e5c098936a9848637b6ecf56aba3b28.png

Карту можно приближать и отдалять, для того чтобы лучше изучить тот или иной маршрут.

1c850fe061c05c991b1d944175e175c7.png

Полный код программы:

import pandas as pd
import pydeck as pdk
import streamlit as st

st.title('Маршруты мусороуборочных машин в городе Остин')
#Цвета для маршрутов по дням недели
colors = {
'Monday': [229,42,42],
'Thursday': [98,42,229],
'Wednesday': [42,229,61],
'Tuesday': [221,235,23],
'Friday': [144,108,26]
}

#Функция которая приводит столбец с геопозицией в необходимую форму
def from_data_file(a):
res = pd.DataFrame(columns = ['latlng1','latlng2'])
for i in a:
route = i.split(', ')
for j in range(len(route)-1):
res = res.append(pd.DataFrame(data=[[route[j], route[j+1]]], columns = res.columns))
res['lon'] = res['latlng1'].apply(lambda x: float(x.split(' ')[0]))
res['lat'] = res['latlng1'].apply(lambda x: float(x.split(' ')[1]))
res['lon2'] = res['latlng2'].apply(lambda x: float(x.split(' ')[0]))
res['lat2'] = res['latlng2'].apply(lambda x: float(x.split(' ')[1]))
res['inbound'] = 100
res['outbound'] = 100
res = res.drop(['latlng1','latlng2'],1)
res = res.reset_index(drop=True)
return res

data = pd.read_csv('garbage-routes-1.csv')
#Удаляем ненужные символы из столбца с геопозициями
data['the_geom'] = data['the_geom'].apply(lambda x: x.replace(')','').replace('(','').replace('MULTIPOLYGON ',''))
data = data.set_index('GARB_DAY')
days = data.index.unique()
ALL_LAYERS = {}
#Добавляем слои на карту по дням недели
for i in days:
ALL_LAYERS = pdk.Layer(
"ArcLayer",
data = from_data_file(data['the_geom']),
get_source_position=["lon", "lat"],
get_target_position=["lon2", "lat2"],
get_source_color=colors,
get_target_color=colors,
auto_highlight=True,
width_scale=0.001,
get_width="outbound",
width_min_pixels=3,
width_max_pixels=30,
),
st.sidebar.markdown('### Map Layers')
selected_layers = [
layer for layer_name, layer in ALL_LAYERS.items()
if st.sidebar.checkbox(layer_name, True)]
if selected_layers:
st.pydeck_chart(pdk.Deck(
map_style="mapbox://styles/mapbox/light-v10",
initial_view_state={"latitude": 30.367,
"longitude": -97.6, "zoom": 11, "pitch": 50},
layers=selected_layers,
))
else:
st.error("Please choose at least one layer above.")


Источник статьи: https://habr.com/ru/post/568836/
 
Сверху