mathtext-fastapi / mathtext_fastapi /curriculum_mapper.py
Greg Thompson
Update global state manager with curriculum ingestion functions
d53af6d
raw
history blame
4.59 kB
import numpy as np
import pandas as pd
import re
from pathlib import Path
def read_and_preprocess_spreadsheet():
# path = list(Path.cwd().glob('Rori_Framework_v1.xlsx'))
DATA_DIR = Path(__file__).parent.parent / "mathtext_fastapi" / "data" / "Rori_Framework_v1.xlsx"
script_df = pd.read_excel(DATA_DIR, engine='openpyxl')
script_df.columns = script_df.columns[:2].tolist() + script_df.columns[2:11].astype(int).astype(str).tolist() + script_df.columns[11:].tolist()
script_df.fillna('', inplace=True)
return script_df
def build_horizontal_transitions_by_row(direction, skill_code, row):
match_arr = []
sideways_transitions = []
second_match = match+1
if direction == 'left':
second_match = match-1
for i in range(9):
# Grade column
current_grade = i+1
if row[current_grade].lower().strip() == 'x':
match_arr.append(i)
for match in match_arr:
if match_arr[-1] != match:
sideways_transitions.append([
direction,
f"{skill_code}_G{match}",
f"{skill_code}_G{second_match}"
])
return sideways_transitions
def extract_skill_code(skill):
pattern = r'[A-Z][0-9]\.\d+\.\d+'
result = re.search(pattern, skill)
return result.group()
def build_horizontal_transitions(script_df):
horizontal_transitions = []
for index, row in script_df.iterrows():
skill_code = extract_skill_code(row['Knowledge or Skill'])
rightward_matches = []
for i in range(9):
# Grade column
current_grade = i+1
if row[current_grade].lower().strip() == 'x':
rightward_matches.append(i)
for match in rightward_matches:
if rightward_matches[-1] != match:
horizontal_transitions.append([
"right",
f"{skill_code}_G{match}",
f"{skill_code}_G{match+1}"
])
leftward_matches = []
for i in reversed(range(9)):
current_grade = i
if row[current_grade].lower().strip() == 'x':
leftward_matches.append(i)
for match in leftward_matches:
if leftward_matches[0] != match:
horizontal_transitions.append([
"left",
f"{skill_code}_G{match}",
f"{skill_code}_G{match-1}"
])
return horizontal_transitions
def gather_all_vertical_matches(script_df):
all_matches = []
columns = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
for column in columns:
for index, value in script_df[column].iteritems():
row_num = index + 1
if value == 'x':
# Extract skill code
skill_code = extract_skill_code(
script_df['Knowledge or Skill'][row_num-1]
)
all_matches.append([skill_code, column])
return all_matches
def build_vertical_transitions(script_df):
vertical_transitions = []
all_matches = gather_all_vertical_matches(script_df)
# Downward
for index, match in enumerate(all_matches):
skill = match[0]
row_num = match[1]
if all_matches[-1] != match:
vertical_transitions.append([
"down",
f"{skill}_G{row_num}",
f"{all_matches[index+1][0]}_G{row_num}"
])
# Upward
for index, match in reversed(list(enumerate(all_matches))):
skill = match[0]
row_num = match[1]
if all_matches[0] != match:
vertical_transitions.append([
"up",
f"{skill}_G{row_num}",
f"{all_matches[index-1][0]}_G{row_num}"
])
return vertical_transitions
def build_all_states(all_transitions):
all_states = []
for transition in all_transitions:
for index, state in enumerate(transition):
if index == 0:
continue
if state not in all_states:
all_states.append(state)
return all_states
def build_curriculum_logic():
script_df = read_and_preprocess_spreadsheet()
horizontal_transitions = build_horizontal_transitions(script_df)
vertical_transitions = build_vertical_transitions(script_df)
all_transitions = horizontal_transitions + vertical_transitions
all_states = build_all_states(all_transitions)
return all_states, all_transitions