Spaces:
Runtime error
Runtime error
Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import random
|
| 2 |
+
import pandas as pd
|
| 3 |
+
from datetime import datetime, timedelta
|
| 4 |
+
import streamlit as st
|
| 5 |
+
import pydeck as pdk
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
# Tekirdağ ili çevresinde rastgele koordinatlar üretir.
|
| 10 |
+
def random_coord_tekirdag():
|
| 11 |
+
lat = random.uniform(40.95, 41.05)
|
| 12 |
+
lon = random.uniform(27.35, 27.6)
|
| 13 |
+
return lat, lon
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
# Verilen koordinatları 4 ondalık basamağa yuvarlar.
|
| 18 |
+
def round_coord(coord):
|
| 19 |
+
return round(coord[0], 4), round(coord[1], 4)
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
# Görev verisi
|
| 24 |
+
num_gorev = 5
|
| 25 |
+
gorev_df = pd.DataFrame({
|
| 26 |
+
"Seç" : [True for _ in range(num_gorev)],
|
| 27 |
+
"ID" : range(1, num_gorev + 1),
|
| 28 |
+
"Görev" : ["Görev "+str(i) for i in range(1, num_gorev + 1)],
|
| 29 |
+
"Tür" : [random.choice(["A", "B", "C"]) for _ in range(num_gorev)],
|
| 30 |
+
"Konum" : [round_coord(random_coord_tekirdag()) for _ in range(num_gorev)],
|
| 31 |
+
"Son Zaman" : [(datetime.now() + timedelta(hours=random.randint(1, 48))).strftime("%Y-%m-%d %H:%M") for _ in range(num_gorev)],
|
| 32 |
+
"Öncelik" : [random.choice(["Normal", "Yüksek", "Acil"]) for _ in range(num_gorev)],
|
| 33 |
+
"Ekipler" : [",".join(map(str, random.sample(range(1, 6), random.randint(2, 5)))) for _ in range(num_gorev)]
|
| 34 |
+
})
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
# Ekip verisi
|
| 39 |
+
num_ekip = 5
|
| 40 |
+
ekip_df = pd.DataFrame({
|
| 41 |
+
"ID" : range(1, num_ekip + 1),
|
| 42 |
+
"Konum" : [round_coord(random_coord_tekirdag()) for _ in range(num_ekip)],
|
| 43 |
+
"Görevler" : [[random.choice(gorev_df['ID']) for _ in range(random.randint(1, 3))] for _ in range(num_ekip)]
|
| 44 |
+
})
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
# streamlit session'undaki gorev_data'yı günceller.
|
| 49 |
+
def update_gorev_data():
|
| 50 |
+
gorev_disp = st.session_state.gorev_disp
|
| 51 |
+
gorev_data = st.session_state.gorev_data
|
| 52 |
+
# "edited_rows" streamlit özelliğidir.
|
| 53 |
+
for row, edited in gorev_disp["edited_rows"].items():
|
| 54 |
+
for column, new_value in edited.items():
|
| 55 |
+
gorev_data.loc[row, column] = new_value
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
# streamlit session'undaki "gorev_df" ve "ekip_df"
|
| 60 |
+
# dataframe'lerini tanımlar.
|
| 61 |
+
def init_dataframes():
|
| 62 |
+
if "gorev_data" not in st.session_state:
|
| 63 |
+
st.session_state.gorev_data = gorev_df
|
| 64 |
+
if "ekip_data" not in st.session_state:
|
| 65 |
+
st.session_state.ekip_data = ekip_df
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
# streamlit session'undaki seçilen görevler ve ekipler için ID,
|
| 70 |
+
# latitude ve longitude bilgisi bulunduran iki dataframe döndürür.
|
| 71 |
+
def create_map_df():
|
| 72 |
+
gData = st.session_state.gorev_data
|
| 73 |
+
map_df_gorev = gData[gData["Seç"]==True].copy()
|
| 74 |
+
map_df_gorev["lat"] = map_df_gorev["Konum"].apply(lambda x: x[0])
|
| 75 |
+
map_df_gorev["lon"] = map_df_gorev["Konum"].apply(lambda x: x[1])
|
| 76 |
+
|
| 77 |
+
map_df_ekip = st.session_state.ekip_data.copy()
|
| 78 |
+
map_df_ekip["lat"] = map_df_ekip["Konum"].apply(lambda x: x[0])
|
| 79 |
+
map_df_ekip["lon"] = map_df_ekip["Konum"].apply(lambda x: x[1])
|
| 80 |
+
|
| 81 |
+
return map_df_gorev[["ID","lat","lon"]], map_df_ekip[["ID","lat","lon"]]
|
| 82 |
+
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
# initialize dataframes
|
| 88 |
+
init_dataframes()
|
| 89 |
+
map_df_gorev, map_df_ekip = create_map_df()
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
|
| 93 |
+
# set the layout
|
| 94 |
+
st.set_page_config(layout="wide")
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
|
| 98 |
+
# Görevler tablosu
|
| 99 |
+
st.subheader("📆 Görevler")
|
| 100 |
+
|
| 101 |
+
|
| 102 |
+
|
| 103 |
+
# Data editor
|
| 104 |
+
gorev_disp = st.data_editor(
|
| 105 |
+
st.session_state.gorev_data,
|
| 106 |
+
column_config = {
|
| 107 |
+
"Seç" : st.column_config.CheckboxColumn("Seç"),
|
| 108 |
+
"Öncelik" : st.column_config.SelectboxColumn("Öncelik", options=["Normal", "Yüksek", "Acil"])
|
| 109 |
+
},
|
| 110 |
+
disabled = ["ID", "Görev", "Tür", "Konum", "Son Zaman"],
|
| 111 |
+
hide_index = True,
|
| 112 |
+
use_container_width = True,
|
| 113 |
+
on_change = update_gorev_data,
|
| 114 |
+
key = "gorev_disp"
|
| 115 |
+
)
|
| 116 |
+
|
| 117 |
+
|
| 118 |
+
|
| 119 |
+
# separator
|
| 120 |
+
st.markdown("---")
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
# second part of the app
|
| 124 |
+
col1, col2, col3 = st.columns([4, 4, 2])
|
| 125 |
+
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
# "Ekipler" tablosu
|
| 129 |
+
with col1:
|
| 130 |
+
st.subheader("👨🚀 Ekipler")
|
| 131 |
+
st.dataframe(st.session_state.ekip_data, hide_index=True, use_container_width=True)
|
| 132 |
+
|
| 133 |
+
|
| 134 |
+
|
| 135 |
+
# Harita
|
| 136 |
+
with col2:
|
| 137 |
+
st.subheader("🗺️ Harita")
|
| 138 |
+
|
| 139 |
+
layers = [
|
| 140 |
+
pdk.Layer(
|
| 141 |
+
"ScatterplotLayer",
|
| 142 |
+
data = map_df_ekip,
|
| 143 |
+
get_position = "[lon, lat]",
|
| 144 |
+
get_radius = 500,
|
| 145 |
+
get_fill_color = [0, 0, 255, 160],
|
| 146 |
+
pickable = True
|
| 147 |
+
)
|
| 148 |
+
]
|
| 149 |
+
|
| 150 |
+
if not map_df_gorev.empty:
|
| 151 |
+
layers.append(
|
| 152 |
+
pdk.Layer(
|
| 153 |
+
"ScatterplotLayer",
|
| 154 |
+
data = map_df_gorev,
|
| 155 |
+
get_position = "[lon, lat]",
|
| 156 |
+
get_radius = 500,
|
| 157 |
+
get_fill_color = [255, 0, 0, 160],
|
| 158 |
+
pickable = True
|
| 159 |
+
)
|
| 160 |
+
)
|
| 161 |
+
|
| 162 |
+
st.pydeck_chart(
|
| 163 |
+
pdk.Deck(
|
| 164 |
+
map_style="mapbox://styles/mapbox/streets-v12",
|
| 165 |
+
initial_view_state=pdk.ViewState(
|
| 166 |
+
latitude = 41.0,
|
| 167 |
+
longitude = 27.5,
|
| 168 |
+
zoom = 10,
|
| 169 |
+
pitch = 0,
|
| 170 |
+
),
|
| 171 |
+
layers = layers,
|
| 172 |
+
tooltip = {"text": "{ID}"}
|
| 173 |
+
)
|
| 174 |
+
)
|
| 175 |
+
|
| 176 |
+
|
| 177 |
+
|
| 178 |
+
# optimizasyon bölmesi
|
| 179 |
+
with col3:
|
| 180 |
+
st.subheader("🤖 Optimizasyon")
|
| 181 |
+
if st.button("✨ Magic!"):
|
| 182 |
+
st.success("Optimizasyon çalıştırıldı. Görevler atandı (sözde). 🎯")
|