import gradio as gr import pandas as pd import matplotlib.pyplot as plt import os # Load the Excel files df_norm = pd.read_excel('norm_fazlasi.xlsx') df_ihtiyac = pd.read_excel('ihtiyac_data.xlsx') # 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): if ilce_values and "Tüm İlçeler" not in ilce_values: df_ihtiyac_filtered = df_ihtiyac[df_ihtiyac['ilçe'].isin(ilce_values)] df_norm_filtered = df_norm[df_norm['İlçe Adı'].isin(ilce_values)] else: df_ihtiyac_filtered = df_ihtiyac df_norm_filtered = df_norm if brans_values: df_ihtiyac_filtered = df_ihtiyac_filtered[df_ihtiyac_filtered['branş'].isin(brans_values)] df_norm_filtered = df_norm_filtered[df_norm['Branşı'].isin(brans_values)] 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() results = [] for ilce in unique_ilce_values: df_ihtiyac_ilce = df_ihtiyac_filtered[df_ihtiyac_filtered['ilçe'] == ilce] df_norm_ilce = df_norm_filtered[df_norm_filtered['İlçe Adı'] == ilce] for brans in unique_brans_values: total_needs = df_ihtiyac_ilce[df_ihtiyac_ilce['branş'] == brans]['ihtiyac'].sum() if not df_ihtiyac_ilce.empty else 0 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, 'Norm Fazlası (Mazaretli)': mazaretli_count, 'Norm Fazlası (Mazaretsiz)': mazaretsiz_count }) result_df = pd.DataFrame(results) total_needs_sum = result_df['Toplam İhtiyaç'].sum() 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): 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)] 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_record_count = gr.Textbox(label="Özet Bilgi", interactive=False) analysis_output = gr.DataFrame() analysis_chart = gr.Image() # Görselleştirme için resim bileşeni ekliyoruz # Set up the interaction 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() # Set up the interaction for the third tab filter_ihtiyac_button.click(fn=filter_ihtiyac_data, inputs=[ilce_multiselect_ihtiyac_filter, brans_multiselect_ihtiyac_filter], outputs=[ihtiyac_output, ihtiyac_total_count]) # Run the app demo.launch()