def setUp(self): self.engine, self.session = database.initialize('sqlite:///:memory:') for age in range(1, 11): status = 'DOA' if random.random() < 0.5 else 'Well' subject = Subject(age=age, status=status) if age < 6: subject.weight = 20 self.session.add(subject) self.session.commit()
def procedure(index, labeled_row, mapping): logger = logging.getLogger() models = setup_models(index, labeled_row, mapping) group, location, weather, operation, outcome, search, incident = models physical_fit = coerce_type(labeled_row["Physical Fitness"], str) mental_fit = coerce_type(labeled_row["Mental Fitness"], str) experience = coerce_type(labeled_row["Experience"], str) equipment = coerce_type(labeled_row["Equipment"], str) personality = coerce_type(labeled_row["Personality"], str) clothing = coerce_type(labeled_row["Clothing"], str) training = coerce_type(labeled_row["Survival training"], str) ages = str(labeled_row["Age"] or "").strip().replace(".", ",") ages = [float(age.replace("0s", "5")) if age != "?" else None for age in ages.split(",") if age] sexes = str(labeled_row["Sex"] or "").strip().upper() translation = {"M": "male", "F": "female", "?": None} sexes = [translation[sex] for sex in sexes if sex in translation] statuses = str(labeled_row["Subject Status"] or "").strip().upper() statuses = list(filter(lambda status: status, statuses.split(","))) number_lost = coerce_type(labeled_row["Number Lost"], int) number_lost = max(number_lost or 0, len(ages), len(sexes), len(statuses)) if number_lost > 0: def fill(sequence): if len(sequence) == 0: return [None] * number_lost elif len(sequence) == 1: return sequence * number_lost else: return sequence ages, sexes, statuses = fill(ages), fill(sexes), fill(statuses) if not (number_lost == len(ages) == len(sexes) == len(statuses)): message = "Instance {}: subject count ({}), anomaly detected" logger.warning(message.format(index + 1, number_lost)) else: for index in range(number_lost): subject = Subject( age=ages[index], sex=sexes[index], physical_fit=physical_fit, mental_fit=mental_fit, personality=personality, experience=experience, training=training, equipment=equipment, clothing=clothing, status=statuses[index], group=group, ) if number_lost == 1: subject.weight = coerce_type(labeled_row["Weight (Kg)"], float) subject.height = coerce_type(labeled_row["Height (Cm)"], float) yield subject responsive_text = coerce_type(labeled_row["Responsivenss"], str) if isinstance(responsive_text, str): responsive_text = responsive_text.strip().casefold() group.responsive = responsive_text == "responsive".casefold() del labeled_row["Responsivenss"] mobile_text = coerce_type(labeled_row["Mobility"], str) if isinstance(mobile_text, str): mobile_text = mobile_text.strip().casefold() group.mobile = mobile_text == "mobile".casefold() del labeled_row["Mobility"] elevation_change = labeled_row["Elevation Change (ft)"] outcome.elevation_change = coerce_type(elevation_change, float) if isinstance(outcome.elevation_change, float): outcome.elevation_change *= 0.3048 del labeled_row["Elevation Change (ft)"] del labeled_row["Distance IPP (miles)"] del labeled_row["Distance Invest. (miles)"] incident.other = {attribute: value for attribute, value in labeled_row.items() if value is not None} yield from models