fieldsmart / app.py
ozbasaran's picture
Create app.py
19c5235 verified
import random
import pandas as pd
from datetime import datetime, timedelta
import streamlit as st
import pydeck as pdk
# Tekirdağ ili çevresinde rastgele koordinatlar üretir.
def random_coord_tekirdag():
lat = random.uniform(40.95, 41.05)
lon = random.uniform(27.35, 27.6)
return lat, lon
# Verilen koordinatları 4 ondalık basamağa yuvarlar.
def round_coord(coord):
return round(coord[0], 4), round(coord[1], 4)
# Görev verisi
num_gorev = 5
gorev_df = pd.DataFrame({
"Seç" : [True for _ in range(num_gorev)],
"ID" : range(1, num_gorev + 1),
"Görev" : ["Görev "+str(i) for i in range(1, num_gorev + 1)],
"Tür" : [random.choice(["A", "B", "C"]) for _ in range(num_gorev)],
"Konum" : [round_coord(random_coord_tekirdag()) for _ in range(num_gorev)],
"Son Zaman" : [(datetime.now() + timedelta(hours=random.randint(1, 48))).strftime("%Y-%m-%d %H:%M") for _ in range(num_gorev)],
"Öncelik" : [random.choice(["Normal", "Yüksek", "Acil"]) for _ in range(num_gorev)],
"Ekipler" : [",".join(map(str, random.sample(range(1, 6), random.randint(2, 5)))) for _ in range(num_gorev)]
})
# Ekip verisi
num_ekip = 5
ekip_df = pd.DataFrame({
"ID" : range(1, num_ekip + 1),
"Konum" : [round_coord(random_coord_tekirdag()) for _ in range(num_ekip)],
"Görevler" : [[random.choice(gorev_df['ID']) for _ in range(random.randint(1, 3))] for _ in range(num_ekip)]
})
# streamlit session'undaki gorev_data'yı günceller.
def update_gorev_data():
gorev_disp = st.session_state.gorev_disp
gorev_data = st.session_state.gorev_data
# "edited_rows" streamlit özelliğidir.
for row, edited in gorev_disp["edited_rows"].items():
for column, new_value in edited.items():
gorev_data.loc[row, column] = new_value
# streamlit session'undaki "gorev_df" ve "ekip_df"
# dataframe'lerini tanımlar.
def init_dataframes():
if "gorev_data" not in st.session_state:
st.session_state.gorev_data = gorev_df
if "ekip_data" not in st.session_state:
st.session_state.ekip_data = ekip_df
# streamlit session'undaki seçilen görevler ve ekipler için ID,
# latitude ve longitude bilgisi bulunduran iki dataframe döndürür.
def create_map_df():
gData = st.session_state.gorev_data
map_df_gorev = gData[gData["Seç"]==True].copy()
map_df_gorev["lat"] = map_df_gorev["Konum"].apply(lambda x: x[0])
map_df_gorev["lon"] = map_df_gorev["Konum"].apply(lambda x: x[1])
map_df_ekip = st.session_state.ekip_data.copy()
map_df_ekip["lat"] = map_df_ekip["Konum"].apply(lambda x: x[0])
map_df_ekip["lon"] = map_df_ekip["Konum"].apply(lambda x: x[1])
return map_df_gorev[["ID","lat","lon"]], map_df_ekip[["ID","lat","lon"]]
# initialize dataframes
init_dataframes()
map_df_gorev, map_df_ekip = create_map_df()
# set the layout
st.set_page_config(layout="wide")
# Görevler tablosu
st.subheader("📆 Görevler")
# Data editor
gorev_disp = st.data_editor(
st.session_state.gorev_data,
column_config = {
"Seç" : st.column_config.CheckboxColumn("Seç"),
"Öncelik" : st.column_config.SelectboxColumn("Öncelik", options=["Normal", "Yüksek", "Acil"])
},
disabled = ["ID", "Görev", "Tür", "Konum", "Son Zaman"],
hide_index = True,
use_container_width = True,
on_change = update_gorev_data,
key = "gorev_disp"
)
# separator
st.markdown("---")
# second part of the app
col1, col2, col3 = st.columns([4, 4, 2])
# "Ekipler" tablosu
with col1:
st.subheader("👨‍🚀 Ekipler")
st.dataframe(st.session_state.ekip_data, hide_index=True, use_container_width=True)
# Harita
with col2:
st.subheader("🗺️ Harita")
layers = [
pdk.Layer(
"ScatterplotLayer",
data = map_df_ekip,
get_position = "[lon, lat]",
get_radius = 500,
get_fill_color = [0, 0, 255, 160],
pickable = True
)
]
if not map_df_gorev.empty:
layers.append(
pdk.Layer(
"ScatterplotLayer",
data = map_df_gorev,
get_position = "[lon, lat]",
get_radius = 500,
get_fill_color = [255, 0, 0, 160],
pickable = True
)
)
st.pydeck_chart(
pdk.Deck(
map_style="mapbox://styles/mapbox/streets-v12",
initial_view_state=pdk.ViewState(
latitude = 41.0,
longitude = 27.5,
zoom = 10,
pitch = 0,
),
layers = layers,
tooltip = {"text": "{ID}"}
)
)
# optimizasyon bölmesi
with col3:
st.subheader("🤖 Optimizasyon")
if st.button("✨ Magic!"):
st.success("Optimizasyon çalıştırıldı. Görevler atandı (sözde). 🎯")