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). 🎯")