import pandas as pd import gradio as gr # Pivot between Model↔Texter schedules (7-day weekly format) def convert_schedule(file_path, direction): # 1. Load schedule: first column is index; use two header rows to capture proper day labels df = pd.read_excel(file_path, header=[0,1], index_col=0) # Combine multi-index headers: take the second row (actual day names) # level 0 may contain merged group labels (e.g., timeslot), level 1 has actual dates/days df.columns = df.columns.get_level_values(1).astype(str) # Drop any 'Unnamed' or blank day columns df = df.loc[:, ~df.columns.str.match(r'^Unnamed')] # Determine the name of the index column after reset_index()() index_name = df.index.name or 'index' # 2. Setup melting parameters based on direction if direction == 'A to B': # A-format: models in index, texters in cells → output: texters as rows, models as cell values id_col = 'Model' val_col = 'Texter' df_reset = df.reset_index().rename(columns={index_name: id_col}) else: # B-format: texters in index, models in cells → output: models as rows, texters as cell values id_col = 'Texter' val_col = 'Model' df_reset = df.reset_index().rename(columns={index_name: id_col}) # 3. Melt into long form: [id_col, Day, val_col] df_melt = df_reset.melt(id_vars=[id_col], var_name='Day', value_name=val_col) # Drop empty assignments df_melt = df_melt.dropna(subset=[val_col]) # 4. Pivot back to wide: index=val_col, columns=Day, values=id_col pivot = df_melt.pivot_table( index=val_col, columns='Day', values=id_col, aggfunc='first' ) # 5. Reorder columns to match original days order and fill empties result = pivot.reindex(columns=df.columns.tolist(), fill_value='') # Cleanup axis names for display result.index.name = None result.columns.name = None return result # Build Gradio app iface = gr.Interface( fn=convert_schedule, inputs=[ gr.File(label='Upload Weekly Schedule (.xlsx)', file_count='single', type='filepath'), gr.Radio(['A to B', 'B to A'], label='Convert Direction') ], outputs=gr.Dataframe(label='Converted Schedule'), title='7-Day Schedule Pivot', description=( 'Upload a 7-column weekly schedule (Models vs Days), then flip between ' 'Models→Texters or Texters→Models. Maintains original days order.' ), allow_flagging='never' ) if __name__ == '__main__': iface.launch(server_name='0.0.0.0', server_port=7860)