Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
import os | |
import folium | |
# Veri setlerini yükleme | |
df_norm = pd.read_excel('norm_fazlasi.xlsx') | |
df_ihtiyac = pd.read_excel('ihtiyac_data.xlsx') | |
# İlçe koordinatları | |
ilce_kordinatlar = [ | |
{"ilçe": 'SERİK', "enlem": 36.921822, "boylam": 31.101271}, | |
{"ilçe": 'MURATPAŞA', "enlem": 36.882271, "boylam": 30.76759}, | |
{"ilçe": 'MANAVGAT', "enlem": 36.783333, "boylam": 31.433332}, | |
{"ilçe": 'KUMLUCA', "enlem": 36.609336, "boylam": 30.548309}, | |
{"ilçe": 'KONYAALTI', "enlem": 36.87889, "boylam": 30.61007}, | |
{"ilçe": 'KORKUTELİ', "enlem": 37.152289, "boylam": 30.236633}, | |
{"ilçe": 'KEPEZ', "enlem": 36.912132, "boylam": 30.686714}, | |
{"ilçe": 'KEMER', "enlem": 36.602792, "boylam": 30.559762}, | |
{"ilçe": 'KAŞ', "enlem": 36.204441, "boylam": 29.638981}, | |
{"ilçe": 'FİNİKE', "enlem": 36.311292, "boylam": 30.158957}, | |
{"ilçe": 'GAZİPAŞA', "enlem": 36.297874, "boylam": 32.278589}, | |
{"ilçe": 'GÜNDOĞMUŞ', "enlem": 36.814942, "boylam": 31.998952}, | |
{"ilçe": 'İBRADI', "enlem": 37.096943, "boylam": 31.598356}, | |
{"ilçe": 'DEMRE', "enlem": 36.244437, "boylam": 29.987471}, | |
{"ilçe": 'DÖŞEMEALTI', "enlem": 37.023026, "boylam": 30.60121}, | |
{"ilçe": 'ELMALI', "enlem": 36.737836, "boylam": 29.916657}, | |
{"ilçe": 'ALANYA', "enlem": 36.610888, "boylam": 31.778913}, | |
{"ilçe": 'AKSEKİ', "enlem": 37.04705, "boylam": 31.7903}, | |
{"ilçe": 'AKSU', "enlem": 36.946678, "boylam": 30.839846} | |
] | |
ilce_df = pd.DataFrame(ilce_kordinatlar) | |
# İlçe koordinatlarını veri setlerine ekleme | |
df_ihtiyac = df_ihtiyac.merge(ilce_df, how='left', on='ilçe') | |
df_norm = df_norm.merge(ilce_df.rename(columns={'ilçe': 'İlçe Adı'}), how='left', left_on='İlçe Adı', right_on='İlçe Adı') | |
# Harita oluşturma fonksiyonu | |
def create_map(selected_ilce, selected_branş): | |
# Filtreleme | |
filtered_ihtiyac = df_ihtiyac[(df_ihtiyac['ilçe'] == selected_ilce) & (df_ihtiyac['branş'] == selected_branş)] | |
filtered_norm = df_norm[(df_norm['İlçe Adı'] == selected_ilce) & (df_norm['Branşı'] == selected_branş)] | |
# İhtiyaç ve norm fazlası değerlerini hesaplama | |
toplam_ihtiyac = filtered_ihtiyac['ihtiyac'].sum() if not filtered_ihtiyac.empty else 0 | |
mazaretli_norm_fazlası = filtered_norm[filtered_norm['Açıklamalar'].notna()].shape[0] | |
mazaretsiz_norm_fazlası = filtered_norm[filtered_norm['Açıklamalar'].isna()].shape[0] | |
# İlçe koordinatlarını alın | |
row = ilce_df[ilce_df['ilçe'] == selected_ilce] | |
if row.empty: | |
return "<p>Seçilen ilçeye ait koordinat bulunamadı.</p>" | |
enlem, boylam = row.iloc[0]['enlem'], row.iloc[0]['boylam'] | |
# Harita oluşturma | |
map_center = [enlem, boylam] | |
my_map = folium.Map(location=map_center, zoom_start=12) | |
# Harita üzerine bilgi ekleme | |
folium.Marker( | |
location=map_center, | |
popup=(f"<b>İlçe:</b> {selected_ilce}<br>" | |
f"<b>Branş:</b> {selected_branş}<br>" | |
f"<b>Toplam İhtiyaç:</b> {toplam_ihtiyac}<br>" | |
f"<b>Mazaretli Norm Fazlası:</b> {mazaretli_norm_fazlası}<br>" | |
f"<b>Mazaretsiz Norm Fazlası:</b> {mazaretsiz_norm_fazlası}"), | |
tooltip=f"{selected_ilce} - {selected_branş}" | |
).add_to(my_map) | |
# Haritayı HTML formatında döndür | |
return my_map._repr_html_() | |
# Filter the DataFrame based on user input | |
def filter_dataframe(ilce_values, brans_values, aciklama_values, include_empty_aciklama): | |
df = df_norm.copy() | |
# Apply filters if values are provided | |
if ilce_values and "Tüm İlçeler" not in ilce_values: | |
df = df[df['İlçe Adı'].isin(ilce_values)] | |
if brans_values: | |
df = df[df['Branşı'].isin(brans_values)] | |
if aciklama_values: | |
df = df[df['Açıklamalar'].isin(aciklama_values)] | |
if include_empty_aciklama: | |
df = pd.concat([df, df[df['Açıklamalar'].isna()]]).drop_duplicates() | |
return df, f"Kayıt Sayısı: {len(df)}" | |
# Calculate needs and norm excess per district | |
def calculate_needs_and_norm(ilce_values, brans_values): | |
# İlçe ve branş filtreleme işlemi | |
df_ihtiyac_filtered = df_ihtiyac.copy() | |
df_norm_filtered = df_norm.copy() | |
if ilce_values and "Tüm İlçeler" not in ilce_values: | |
df_ihtiyac_filtered = df_ihtiyac_filtered[df_ihtiyac_filtered['ilçe'].isin(ilce_values)] | |
if brans_values: | |
df_ihtiyac_filtered = df_ihtiyac_filtered[df_ihtiyac_filtered['branş'].isin(brans_values)] | |
# Özet bilgi için toplam ihtiyaç sayısını direkt olarak hesaplama | |
total_needs_sum = df_ihtiyac_filtered['ihtiyac'].sum() | |
# Sonuçları toplamak için liste | |
results = [] | |
unique_ilce_values = ilce_values if ilce_values and "Tüm İlçeler" not in ilce_values else df_norm['İlçe Adı'].unique().tolist() | |
unique_brans_values = brans_values if brans_values else df_norm['Branşı'].unique().tolist() | |
for ilce in unique_ilce_values: | |
df_norm_ilce = df_norm_filtered[df_norm_filtered['İlçe Adı'] == ilce] | |
for brans in unique_brans_values: | |
# Her ilçe ve branş için ilgili ihtiyaç miktarını hesapla | |
total_needs = df_ihtiyac_filtered[(df_ihtiyac_filtered['ilçe'] == ilce) & (df_ihtiyac_filtered['branş'] == brans)]['ihtiyac'].sum() | |
mazaretli_count = df_norm_ilce[(df_norm_ilce['Branşı'] == brans) & (df_norm_ilce['Açıklamalar'].notna())].shape[0] | |
mazaretsiz_count = df_norm_ilce[(df_norm_ilce['Branşı'] == brans) & (df_norm_ilce['Açıklamalar'].isna())].shape[0] | |
results.append({ | |
'İlçe': ilce, | |
'Branş': brans, | |
'Toplam İhtiyaç': total_needs, # Her ilçe ve branşa özgü toplam ihtiyaç | |
'Norm Fazlası (Mazaretli)': mazaretli_count, | |
'Norm Fazlası (Mazaretsiz)': mazaretsiz_count | |
}) | |
result_df = pd.DataFrame(results) | |
total_mazaretli_sum = result_df['Norm Fazlası (Mazaretli)'].sum() | |
total_mazaretsiz_sum = result_df['Norm Fazlası (Mazaretsiz)'].sum() | |
summary_text = (f"Toplam İhtiyaç: {total_needs_sum} | " | |
f"Toplam Norm Fazlası (Mazaretli): {total_mazaretli_sum} | " | |
f"Toplam Norm Fazlası (Mazaretsiz): {total_mazaretsiz_sum}") | |
return result_df, summary_text | |
# Function to plot the results as a bar chart | |
def plot_results(df): | |
plt.figure(figsize=(14, 8)) # Grafik boyutunu artırıyoruz | |
df.groupby('İlçe')[['Toplam İhtiyaç', 'Norm Fazlası (Mazaretli)', 'Norm Fazlası (Mazaretsiz)']].sum().plot(kind='bar') | |
plt.title("İhtiyaç ve Norm Fazlası Dağılımı") | |
plt.xlabel("İlçe") | |
plt.ylabel("Sayı") | |
plt.xticks(rotation=45, ha="right") # Etiketleri biraz sağa yatırıyoruz | |
plt.tight_layout() | |
chart_path = 'bar_chart.png' | |
plt.savefig(chart_path) | |
return chart_path # Dosya yolunu döndür | |
# Function to filter "ihtiyac" data based on selected ilce and brans | |
def filter_ihtiyac_data(ilce_values, brans_values, include_empty_aciklama=False): | |
df_filtered = df_ihtiyac.copy() | |
if ilce_values and "Tüm İlçeler" not in ilce_values: | |
df_filtered = df_filtered[df_filtered['ilçe'].isin(ilce_values)] | |
if brans_values: | |
df_filtered = df_filtered[df_filtered['branş'].isin(brans_values)] | |
if include_empty_aciklama: | |
df_filtered = pd.concat([df_filtered, df_filtered[df_filtered['Açıklamalar'].isna()]]).drop_duplicates() | |
total_needs_sum = df_filtered['ihtiyac'].sum() | |
return df_filtered, f"Toplam İhtiyaç: {total_needs_sum}" | |
# Define Gradio interface components | |
with gr.Blocks() as demo: | |
with gr.Tab("Antalya Norm Fazlası Öğretmenler"): | |
ilce_choices = sorted(df_norm['İlçe Adı'].dropna().astype(str).unique().tolist()) | |
ilce_multiselect = gr.Dropdown(choices=["Tüm İlçeler"] + ilce_choices, label="Select İlçe Adı", multiselect=True) | |
brans_multiselect = gr.Dropdown(choices=sorted(df_norm['Branşı'].dropna().unique().tolist()), label="Select Branşı", multiselect=True) | |
aciklama_choices = sorted(df_norm['Açıklamalar'].dropna().unique().tolist()) | |
aciklama_multiselect = gr.Dropdown(choices=aciklama_choices, label="Mazaretliler", multiselect=True) | |
include_empty_aciklama = gr.Checkbox(label="Mazaretsizleri de ekle") | |
filter_button = gr.Button("Listele") | |
record_count = gr.Textbox(label="Kişi Sayısı", interactive=False) | |
output = gr.DataFrame() | |
filter_button.click(fn=filter_dataframe, inputs=[ilce_multiselect, brans_multiselect, aciklama_multiselect, include_empty_aciklama], outputs=[output, record_count]) | |
with gr.Tab("İhtiyaç ve Norm Fazlası Analizi"): | |
ilce_choices_ihtiyac = sorted(df_ihtiyac['ilçe'].dropna().astype(str).unique().tolist()) | |
ilce_multiselect_ihtiyac = gr.Dropdown(choices=["Tüm İlçeler"] + ilce_choices_ihtiyac, label="Select İlçe Adı", multiselect=True) | |
brans_multiselect_ihtiyac = gr.Dropdown(choices=sorted(df_ihtiyac['branş'].dropna().unique().tolist()), label="Select Branşı", multiselect=True) | |
analyze_button = gr.Button("Analiz Et") | |
analysis_chart = gr.Image() | |
analysis_record_count = gr.Textbox(label="Özet Bilgi", interactive=False) | |
analysis_output = gr.DataFrame() | |
def analyze_and_plot(ilce_values, brans_values): | |
result_df, summary_text = calculate_needs_and_norm(ilce_values, brans_values) | |
chart_path = plot_results(result_df) | |
return result_df, summary_text, chart_path | |
analyze_button.click(fn=analyze_and_plot, inputs=[ilce_multiselect_ihtiyac, brans_multiselect_ihtiyac], outputs=[analysis_output, analysis_record_count, analysis_chart]) | |
with gr.Tab("İhtiyaç Verisi Filtreleme"): | |
ilce_multiselect_ihtiyac_filter = gr.Dropdown(choices=["Tüm İlçeler"] + ilce_choices_ihtiyac, label="İlçe Adı", multiselect=True) | |
brans_multiselect_ihtiyac_filter = gr.Dropdown(choices=sorted(df_ihtiyac['branş'].dropna().unique().tolist()), label="Branş", multiselect=True) | |
filter_ihtiyac_button = gr.Button("Filtrele") | |
ihtiyac_total_count = gr.Textbox(label="Toplam İhtiyaç", interactive=False) | |
ihtiyac_output = gr.DataFrame() | |
filter_ihtiyac_button.click(fn=filter_ihtiyac_data, inputs=[ilce_multiselect_ihtiyac_filter, brans_multiselect_ihtiyac_filter], outputs=[ihtiyac_output, ihtiyac_total_count]) | |
# 4. Tab: Branşları Karşılaştırma | |
# 4. Tab: Branşları Karşılaştırma | |
with gr.Tab("Branşları Karşılaştırma"): | |
# İhtiyaç ve norm fazlası veri çerçevelerinde bulunan tüm benzersiz branşları alıyoruz | |
all_branches = sorted(set(df_ihtiyac['branş'].dropna().unique()).union(df_norm['Branşı'].dropna().unique())) | |
brans_multiselect_compare = gr.Dropdown(choices=all_branches, label="Karşılaştırılacak Branşları Seçin", multiselect=True) | |
compare_button = gr.Button("Karşılaştır") | |
compare_output = gr.DataFrame() | |
compare_chart = gr.Image() | |
def compare_branches(brans_values): | |
# Seçim yapılmadıysa tüm branşları al | |
selected_branches = brans_values if brans_values else all_branches | |
# Sonuçları toplamak için liste | |
results = [] | |
for brans in selected_branches: | |
# İlgili branş için toplam ihtiyaç ve norm fazlası değerlerini al | |
total_needs = df_ihtiyac[df_ihtiyac['branş'] == brans]['ihtiyac'].sum() if brans in df_ihtiyac['branş'].values else 0 | |
mazaretli_count = df_norm[(df_norm['Branşı'] == brans) & (df_norm['Açıklamalar'].notna())].shape[0] if brans in df_norm['Branşı'].values else 0 | |
mazaretsiz_count = df_norm[(df_norm['Branşı'] == brans) & (df_norm['Açıklamalar'].isna())].shape[0] if brans in df_norm['Branşı'].values else 0 | |
# Oran hesaplaması, sıfıra bölme hatasından kaçınmak için kontrol | |
if total_needs > 0: | |
ratio = (mazaretli_count + mazaretsiz_count) / total_needs | |
else: | |
ratio = float('nan') # Toplam ihtiyaç 0 ise oranı NaN olarak ayarla | |
results.append({ | |
'Branş': brans, | |
'Toplam İhtiyaç': total_needs, | |
'Norm Fazlası (Mazaretli)': mazaretli_count, | |
'Norm Fazlası (Mazaretsiz)': mazaretsiz_count, | |
'Oran': ratio | |
}) | |
# Sonuçları DataFrame olarak döndür | |
compare_df = pd.DataFrame(results) | |
# Branş sayısı 10'dan fazlaysa grafik çizdirme | |
if len(selected_branches) <= 10: | |
# Çubuk grafik oluşturma | |
fig, ax1 = plt.subplots(figsize=(10, 6)) | |
# İhtiyaç ve norm fazlası verilerini çubuk grafik olarak çiz | |
compare_df.set_index('Branş')[['Toplam İhtiyaç', 'Norm Fazlası (Mazaretli)', 'Norm Fazlası (Mazaretsiz)']].plot(kind='bar', ax=ax1) | |
ax1.set_ylabel("Sayı") | |
ax1.set_xlabel("Branş") | |
ax1.set_title("Branş Bazında İhtiyaç, Norm Fazlası ve Oran Karşılaştırması") | |
plt.xticks(rotation=45, ha="right") | |
# Oran verilerini ikincil bir eksen olarak çiz | |
ax2 = ax1.twinx() | |
ax2.plot(compare_df['Branş'], compare_df['Oran'], color='red', marker='o', linestyle='-', linewidth=2) | |
ax2.set_ylabel("Oran", color='red') | |
ax2.tick_params(axis='y', labelcolor='red') | |
plt.tight_layout() | |
chart_path = 'branch_comparison_chart.png' | |
plt.savefig(chart_path) | |
plt.close() | |
else: | |
chart_path = None # Grafik gösterilmeyecek | |
return compare_df, chart_path | |
compare_button.click(fn=compare_branches, inputs=[brans_multiselect_compare], outputs=[compare_output, compare_chart]) | |
# 5. Tab: İlçeleri Karşılaştırma | |
with gr.Tab("İlçeleri Karşılaştırma"): | |
# İhtiyaç ve norm fazlası veri çerçevelerinde bulunan tüm benzersiz ilçeleri alıyoruz | |
all_districts = sorted(set(df_ihtiyac['ilçe'].dropna().unique()).union(df_norm['İlçe Adı'].dropna().unique())) | |
ilce_multiselect_compare = gr.Dropdown(choices=all_districts, label="Karşılaştırılacak İlçeleri Seçin", multiselect=True) | |
compare_button_ilce = gr.Button("Karşılaştır") | |
compare_output_ilce = gr.DataFrame() | |
compare_chart_ilce = gr.Image() | |
def compare_districts(ilce_values): | |
# Seçim yapılmadıysa tüm ilçeleri al | |
selected_districts = ilce_values if ilce_values else all_districts | |
# Sonuçları toplamak için liste | |
results = [] | |
for ilce in selected_districts: | |
# İlgili ilçe için toplam ihtiyaç ve norm fazlası değerlerini al | |
total_needs = df_ihtiyac[df_ihtiyac['ilçe'] == ilce]['ihtiyac'].sum() if ilce in df_ihtiyac['ilçe'].values else 0 | |
mazaretli_count = df_norm[(df_norm['İlçe Adı'] == ilce) & (df_norm['Açıklamalar'].notna())].shape[0] if ilce in df_norm['İlçe Adı'].values else 0 | |
mazaretsiz_count = df_norm[(df_norm['İlçe Adı'] == ilce) & (df_norm['Açıklamalar'].isna())].shape[0] if ilce in df_norm['İlçe Adı'].values else 0 | |
# Oran hesaplaması, sıfıra bölme hatasından kaçınmak için kontrol | |
if total_needs > 0: | |
ratio = (mazaretli_count + mazaretsiz_count) / total_needs | |
else: | |
ratio = float('nan') # Toplam ihtiyaç 0 ise oranı NaN olarak ayarla | |
results.append({ | |
'İlçe': ilce, | |
'Toplam İhtiyaç': total_needs, | |
'Norm Fazlası (Mazaretli)': mazaretli_count, | |
'Norm Fazlası (Mazaretsiz)': mazaretsiz_count, | |
'Oran': ratio | |
}) | |
# Sonuçları DataFrame olarak döndür | |
compare_df_ilce = pd.DataFrame(results) | |
# İlçe sayısı 10'dan fazlaysa grafik çizdirme | |
if len(selected_districts) <= 10: | |
# Çubuk grafik oluşturma | |
fig, ax1 = plt.subplots(figsize=(10, 6)) | |
# İhtiyaç ve norm fazlası verilerini çubuk grafik olarak çiz | |
compare_df_ilce.set_index('İlçe')[['Toplam İhtiyaç', 'Norm Fazlası (Mazaretli)', 'Norm Fazlası (Mazaretsiz)']].plot(kind='bar', ax=ax1) | |
ax1.set_ylabel("Sayı") | |
ax1.set_xlabel("İlçe") | |
ax1.set_title("İlçe Bazında İhtiyaç, Norm Fazlası ve Oran Karşılaştırması") | |
plt.xticks(rotation=45, ha="right") | |
# Oran verilerini ikincil bir eksen olarak çiz | |
ax2 = ax1.twinx() | |
ax2.plot(compare_df_ilce['İlçe'], compare_df_ilce['Oran'], color='red', marker='o', linestyle='-', linewidth=2) | |
ax2.set_ylabel("Oran", color='red') | |
ax2.tick_params(axis='y', labelcolor='red') | |
plt.tight_layout() | |
chart_path_ilce = 'district_comparison_chart.png' | |
plt.savefig(chart_path_ilce) | |
plt.close() | |
else: | |
chart_path_ilce = None # Grafik gösterilmeyecek | |
return compare_df_ilce, chart_path_ilce | |
compare_button_ilce.click(fn=compare_districts, inputs=[ilce_multiselect_compare], outputs=[compare_output_ilce, compare_chart_ilce]) | |
with gr.Tab("İlçe ve Branş Haritası"): | |
gr.Markdown("### Seçilen İlçe ve Branş İçin Harita Üzerinde Görselleştirme") | |
ilce_dropdown = gr.Dropdown(choices=df_ihtiyac['ilçe'].unique().tolist(), label="İlçe Seçin") | |
brans_dropdown = gr.Dropdown(choices=df_ihtiyac['branş'].unique().tolist(), label="Branş Seçin") | |
map_output = gr.HTML() | |
analyze_button = gr.Button("Haritada Göster") | |
analyze_button.click( | |
fn=create_map, | |
inputs=[ilce_dropdown, brans_dropdown], | |
outputs=[map_output] | |
) | |
# Run the app | |
demo.launch() | |