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 "

Seçilen ilçeye ait koordinat bulunamadı.

" 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"İlçe: {selected_ilce}
" f"Branş: {selected_branş}
" f"Toplam İhtiyaç: {toplam_ihtiyac}
" f"Mazaretli Norm Fazlası: {mazaretli_norm_fazlası}
" f"Mazaretsiz Norm Fazlası: {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()