File size: 2,611 Bytes
cdf2807 af26c90 e22be08 a3de3da af26c90 cdf2807 a3de3da af26c90 eb59eaa af26c90 eb59eaa af26c90 cdf2807 af26c90 cdf2807 af26c90 cdf2807 af26c90 e22be08 af26c90 cdf2807 eb59eaa a3de3da |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
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) |