kreemyyyy commited on
Commit
40ca158
·
verified ·
1 Parent(s): aa3525b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -42
app.py CHANGED
@@ -1,65 +1,75 @@
1
  import pandas as pd
2
  import gradio as gr
3
 
4
- # Conversion by explicit iteration: map texters ↔ models per day
5
- # Handles merged headers, multi-row headers, and 'OFF' days
6
 
7
  def convert_schedule(file_path, direction):
8
- # -- 1. Load Excel with potential two-row header for merged cells --
9
- try:
10
- df = pd.read_excel(file_path, header=[0,1], index_col=0)
11
- # Use second header row as actual day labels
12
- days = df.columns.get_level_values(1).astype(str)
13
- # If all are unnamed, treat as single-header
14
- if all(lbl.startswith('Unnamed') for lbl in days):
15
- raise ValueError
16
- df.columns = days
17
- except Exception:
18
- df = pd.read_excel(file_path, header=0, index_col=0)
19
- df.columns = df.columns.astype(str)
20
 
21
- # -- 2. Clean up: drop any phantom 'Unnamed' columns --
22
- df = df.loc[:, ~df.columns.str.match(r'^Unnamed')] # keep only real day columns
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
- # Order of days as in the original sheet
 
 
 
 
 
 
 
 
 
25
  day_cols = list(df.columns)
26
 
27
- # -- 3. Build assignment mapping --
28
- # For A→B: iterate models (rows), assign each texter
29
- # For B→A: iterate texters (rows), assign each model
30
  assignments = {}
31
  if direction == 'A to B':
32
- for model in df.index:
 
33
  for day in day_cols:
34
- texters = df.at[model, day]
35
- # split if multiple names in one cell
36
- for texter in str(texters).split(','):
37
  texter = texter.strip()
38
  if not texter or texter.lower() in ['nan', 'none']:
39
  continue
40
- if texter not in assignments:
41
- # initialize all days as empty list
42
- assignments[texter] = {d: [] for d in day_cols}
43
- assignments[texter][day].append(str(model))
44
- # After populating, convert lists to comma-joined or 'OFF'
45
  index = sorted(assignments.keys())
46
  result = pd.DataFrame(index=index, columns=day_cols)
47
  for texter, days_map in assignments.items():
48
  for day in day_cols:
49
  models = days_map.get(day, [])
50
  result.at[texter, day] = ', '.join(models) if models else 'OFF'
51
-
52
- else: # BA
53
- for texter in df.index:
54
  for day in day_cols:
55
- models = df.at[texter, day]
56
- for model in str(models).split(','):
57
  model = model.strip()
58
  if not model or model.lower() in ['nan', 'none']:
59
  continue
60
- if model not in assignments:
61
- assignments[model] = {d: [] for d in day_cols}
62
- assignments[model][day].append(str(texter))
63
  index = sorted(assignments.keys())
64
  result = pd.DataFrame(index=index, columns=day_cols)
65
  for model, days_map in assignments.items():
@@ -67,23 +77,23 @@ def convert_schedule(file_path, direction):
67
  texters = days_map.get(day, [])
68
  result.at[model, day] = ', '.join(texters) if texters else 'OFF'
69
 
70
- # -- 4. Cleanup axis names --
71
  result.index.name = None
72
  result.columns.name = None
73
  return result
74
 
75
- # -- Gradio UI definition --
76
  def main():
77
  iface = gr.Interface(
78
  fn=convert_schedule,
79
  inputs=[
80
  gr.File(label='Upload Weekly Schedule (.xlsx)', file_count='single', type='filepath'),
81
- gr.Radio(['A to B', 'B to A'], label='Conversion Direction')
82
  ],
83
  outputs=gr.Dataframe(label='Converted Schedule'),
84
  title='7-Day Schedule Converter',
85
- description=('Upload a 7-column weekly schedule (Models vs Days) and flip '
86
- 'between Models→Texters or Texters→Models with explicit iteration.'),
87
  allow_flagging='never'
88
  )
89
  iface.launch(server_name='0.0.0.0', server_port=7860)
 
1
  import pandas as pd
2
  import gradio as gr
3
 
4
+ # 7-Day Schedule Converter with explicit iteration and header fill
 
5
 
6
  def convert_schedule(file_path, direction):
7
+ # 1. Load Excel sheet into DataFrame
8
+ # Read without header to inspect first two rows for header fill
9
+ raw = pd.read_excel(file_path, header=None)
10
+ # Extract potential header rows (skip first column)
11
+ header1 = raw.iloc[0,1:].astype(object)
12
+ header2 = raw.iloc[1,1:].astype(object)
 
 
 
 
 
 
13
 
14
+ # Decide which header row to use: prefer second if fully populated
15
+ if header2.notna().all() and not header2.str.startswith('Unnamed').any():
16
+ days = header2.tolist()
17
+ data_start = 2
18
+ else:
19
+ # Forward-fill merged first-row headers
20
+ days = []
21
+ last = None
22
+ for val in header1:
23
+ if pd.isna(val) or str(val).startswith('Unnamed'):
24
+ days.append(last)
25
+ else:
26
+ last = str(val)
27
+ days.append(last)
28
+ data_start = 1
29
 
30
+ # Load actual data with day columns
31
+ df = pd.read_excel(
32
+ file_path,
33
+ header=data_start,
34
+ index_col=0,
35
+ usecols=[0] + list(range(1, len(days)+1))
36
+ )
37
+ df.columns = [str(day) for day in days]
38
+
39
+ # 2. Ensure we have exactly the original 7 day columns
40
  day_cols = list(df.columns)
41
 
42
+ # 3. Build mapping: for each Model (or Texter) assign days
 
 
43
  assignments = {}
44
  if direction == 'A to B':
45
+ # Rows are Models → output rows are Texters
46
+ for model in df.index.astype(str):
47
  for day in day_cols:
48
+ cell = df.at[model, day]
49
+ for texter in str(cell).split(','):
 
50
  texter = texter.strip()
51
  if not texter or texter.lower() in ['nan', 'none']:
52
  continue
53
+ assignments.setdefault(texter, {d: [] for d in day_cols})
54
+ assignments[texter][day].append(model)
55
+ # Build output DataFrame
 
 
56
  index = sorted(assignments.keys())
57
  result = pd.DataFrame(index=index, columns=day_cols)
58
  for texter, days_map in assignments.items():
59
  for day in day_cols:
60
  models = days_map.get(day, [])
61
  result.at[texter, day] = ', '.join(models) if models else 'OFF'
62
+ else:
63
+ # Rows are Texters output rows are Models
64
+ for texter in df.index.astype(str):
65
  for day in day_cols:
66
+ cell = df.at[texter, day]
67
+ for model in str(cell).split(','):
68
  model = model.strip()
69
  if not model or model.lower() in ['nan', 'none']:
70
  continue
71
+ assignments.setdefault(model, {d: [] for d in day_cols})
72
+ assignments[model][day].append(texter)
 
73
  index = sorted(assignments.keys())
74
  result = pd.DataFrame(index=index, columns=day_cols)
75
  for model, days_map in assignments.items():
 
77
  texters = days_map.get(day, [])
78
  result.at[model, day] = ', '.join(texters) if texters else 'OFF'
79
 
80
+ # 4. Cleanup axis names
81
  result.index.name = None
82
  result.columns.name = None
83
  return result
84
 
85
+ # Gradio UI
86
  def main():
87
  iface = gr.Interface(
88
  fn=convert_schedule,
89
  inputs=[
90
  gr.File(label='Upload Weekly Schedule (.xlsx)', file_count='single', type='filepath'),
91
+ gr.Radio(['A to B', 'B to A'], label='Convert Direction')
92
  ],
93
  outputs=gr.Dataframe(label='Converted Schedule'),
94
  title='7-Day Schedule Converter',
95
+ description=('Upload a 7-column weekly schedule (Models vs Days) with merged or single headers, '\
96
+ 'then flip between Models→Texters or Texters→Models. Uses explicit iteration.'),
97
  allow_flagging='never'
98
  )
99
  iface.launch(server_name='0.0.0.0', server_port=7860)