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)