Update app.py
Browse files
app.py
CHANGED
@@ -1,49 +1,49 @@
|
|
1 |
import pandas as pd
|
2 |
import gradio as gr
|
3 |
|
4 |
-
# Pivot between Model↔Texter schedules (7-day weekly format)
|
5 |
def convert_schedule(file_path, direction):
|
6 |
-
# 1.
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
|
12 |
-
# Drop any 'Unnamed' or blank
|
13 |
df = df.loc[:, ~df.columns.str.match(r'^Unnamed')]
|
14 |
|
15 |
-
# Determine
|
16 |
-
index_name = df.index.name or 'index'
|
17 |
-
|
18 |
-
# 2. Setup melting parameters based on direction
|
19 |
if direction == 'A to B':
|
20 |
-
|
21 |
-
id_col = 'Model'
|
22 |
-
val_col = 'Texter'
|
23 |
-
df_reset = df.reset_index().rename(columns={index_name: id_col})
|
24 |
else:
|
25 |
-
|
26 |
-
id_col = 'Texter'
|
27 |
-
val_col = 'Model'
|
28 |
-
df_reset = df.reset_index().rename(columns={index_name: id_col})
|
29 |
|
30 |
-
#
|
|
|
31 |
df_melt = df_reset.melt(id_vars=[id_col], var_name='Day', value_name=val_col)
|
32 |
-
# Drop empty assignments
|
33 |
df_melt = df_melt.dropna(subset=[val_col])
|
34 |
|
35 |
-
#
|
36 |
pivot = df_melt.pivot_table(
|
37 |
index=val_col,
|
38 |
columns='Day',
|
39 |
values=id_col,
|
40 |
-
aggfunc='
|
41 |
)
|
|
|
42 |
|
43 |
-
#
|
44 |
result = pivot.reindex(columns=df.columns.tolist(), fill_value='')
|
45 |
|
46 |
-
# Cleanup axis names
|
47 |
result.index.name = None
|
48 |
result.columns.name = None
|
49 |
return result
|
@@ -59,10 +59,10 @@ iface = gr.Interface(
|
|
59 |
title='7-Day Schedule Pivot',
|
60 |
description=(
|
61 |
'Upload a 7-column weekly schedule (Models vs Days), then flip between '
|
62 |
-
'Models→Texters or Texters→Models. Maintains original days order.'
|
63 |
),
|
64 |
allow_flagging='never'
|
65 |
)
|
66 |
|
67 |
if __name__ == '__main__':
|
68 |
-
iface.launch(server_name='0.0.0.0', server_port=7860)
|
|
|
1 |
import pandas as pd
|
2 |
import gradio as gr
|
3 |
|
4 |
+
# Pivot between Model↔Texter schedules (7-day weekly format), handling merged headers
|
5 |
def convert_schedule(file_path, direction):
|
6 |
+
# 1. Try reading with two header rows for merged timeslot/day layouts
|
7 |
+
try:
|
8 |
+
df = pd.read_excel(file_path, header=[0,1], index_col=0)
|
9 |
+
# Extract the second-level headers (actual days)
|
10 |
+
second_level = df.columns.get_level_values(1).astype(str)
|
11 |
+
# If these are all unnamed, fallback
|
12 |
+
if all(lbl.startswith('Unnamed') for lbl in second_level):
|
13 |
+
raise ValueError
|
14 |
+
df.columns = second_level
|
15 |
+
except Exception:
|
16 |
+
# Fallback: single header row, simple day labels
|
17 |
+
df = pd.read_excel(file_path, header=0, index_col=0)
|
18 |
+
df.columns = df.columns.astype(str)
|
19 |
|
20 |
+
# 2. Drop any 'Unnamed' or blank header columns
|
21 |
df = df.loc[:, ~df.columns.str.match(r'^Unnamed')]
|
22 |
|
23 |
+
# 3. Determine id/val columns
|
|
|
|
|
|
|
24 |
if direction == 'A to B':
|
25 |
+
id_col, val_col = 'Model', 'Texter'
|
|
|
|
|
|
|
26 |
else:
|
27 |
+
id_col, val_col = 'Texter', 'Model'
|
|
|
|
|
|
|
28 |
|
29 |
+
# 4. Melt into long format
|
30 |
+
df_reset = df.reset_index().rename(columns={df.index.name or df.columns.name or '': id_col})
|
31 |
df_melt = df_reset.melt(id_vars=[id_col], var_name='Day', value_name=val_col)
|
|
|
32 |
df_melt = df_melt.dropna(subset=[val_col])
|
33 |
|
34 |
+
# 5. Pivot table: join duplicates with comma
|
35 |
pivot = df_melt.pivot_table(
|
36 |
index=val_col,
|
37 |
columns='Day',
|
38 |
values=id_col,
|
39 |
+
aggfunc=lambda x: ', '.join(map(str, x))
|
40 |
)
|
41 |
+
pivot = pivot.fillna('')
|
42 |
|
43 |
+
# 6. Reorder columns to match original
|
44 |
result = pivot.reindex(columns=df.columns.tolist(), fill_value='')
|
45 |
|
46 |
+
# Cleanup axis names
|
47 |
result.index.name = None
|
48 |
result.columns.name = None
|
49 |
return result
|
|
|
59 |
title='7-Day Schedule Pivot',
|
60 |
description=(
|
61 |
'Upload a 7-column weekly schedule (Models vs Days), then flip between '
|
62 |
+
'Models→Texters or Texters→Models. Maintains original days order, even with merged headers.'
|
63 |
),
|
64 |
allow_flagging='never'
|
65 |
)
|
66 |
|
67 |
if __name__ == '__main__':
|
68 |
+
iface.launch(server_name='0.0.0.0', server_port=7860)
|