Beispiel #1
0
class AssignAverageBMIRank(Scan):
    mean_bmi_var: Decimal = SubjectValidator(data_type=Decimal, temporal=-1)
    bmi_rank_var: Integer = SubjectValidator(data_type=Integer, temporal=-1)

    def __post_init__(self):
        self.ranked: Dict[str, int] = {}

    def extract(self, composite: Dict) -> float:
        mean_bmi = composites.get_property(composite, self.mean_bmi_var)
        return mean_bmi

    def analyze(self, extracts: Iterable[Tuple[str, Any]]) -> None:
        # Initialize data structure for analyzed data
        mean_bmi_dict: Dict[str, float] = {}

        for composite_id, mean_bmi in extracts:
            mean_bmi_dict[composite_id] = mean_bmi

        people_ranked = list(
            sorted(mean_bmi_dict.keys(), key=lambda k: -1 * mean_bmi_dict[k]))
        for k, person in enumerate(people_ranked):
            self.ranked[person] = k + 1

    def alter(self, composite_id: str, composite: Dict) -> None:
        rank = self.ranked[composite_id]
        composites.put_property(composite, self.bmi_rank_var, rank)
Beispiel #2
0
class AssignMeanBMI(Change):
    annual_bmi_var: Decimal = SubjectValidator(data_type=Decimal, temporal=1)
    mean_bmi_var: Decimal = SubjectValidator(data_type=Decimal, temporal=-1)

    def __call__(self, composite: Dict):
        bmis = [
            bmi for period, bmi in composites.get_all_observations(
                composite, self.annual_bmi_var)
        ]
        mean_bmi = numpy.average(bmis)
        composites.put_property(composite, self.mean_bmi_var, mean_bmi)
Beispiel #3
0
class AssignRegressionStats(Change):
    annual_weight_var: Decimal = SubjectValidator(data_type=Decimal, temporal=1)
    weight_slope_var: Decimal = SubjectValidator(data_type=Decimal, temporal=-1)
    weight_pval_var: Decimal = SubjectValidator(data_type=Decimal, temporal=-1)

    def __call__(self, composite: Dict):
        years = sorted([int(year) for year in composites.get_periods(composite)])
        weights = [composites.get_observation(composite, str(year), self.annual_weight_var) for year in years]
        slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(years, weights)
        composites.put_property(composite, self.weight_slope_var, slope)
        composites.put_property(composite, self.weight_pval_var, p_value)
Beispiel #4
0
class AssignAnnualBMI(Change):
    annual_weight_var: Decimal = SubjectValidator(data_type=Decimal,
                                                  temporal=1)
    height_var: Primitive = SubjectValidator(data_type=[Decimal, Integer],
                                             temporal=-1)
    annual_bmi_var: Decimal = SubjectValidator(data_type=Decimal, temporal=1)

    def __call__(self, composite: Dict):
        h_squared = composites.get_property(composite, self.height_var)**2
        for period, weight in composites.get_all_observations(
                composite, self.annual_weight_var):
            bmi = weight / h_squared * 703
            composites.put_observation(composite, period, self.annual_bmi_var,
                                       bmi)
Beispiel #5
0
class ColorNameToRGB(Change):
    """Look up the RGB value for the color name specified by color_name_var, and store it in rgb_var."""
    color_name_var: Text = SubjectValidator(data_type=Text)
    rgb_var: Text = SubjectValidator(data_type=Text)

    def __call__(self, composite: Dict):
        # IRL, you'd have to handle nulls, decide how to deal with temporal variables, etc.
        color_name_path = ["invariant"] + list(self.color_name_var.absolute_path)
        color_name = nesteddicts.get(composite, color_name_path)

        # At some point, I'll write a fancy retrieval/validation/assignment system, but that's not for the MVP
        rgb_value = self.lookups["color_names"][color_name]
        rgb_path = ["invariant"] + list(self.rgb_var.absolute_path)
        nesteddicts.put(composite, rgb_path, rgb_value)
Beispiel #6
0
class AssignAverageBMIRank(Scan):
    male_flag: Binary = SubjectValidator(data_type=Binary, temporal=-1)
    mean_bmi_var: Decimal = SubjectValidator(data_type=Decimal, temporal=-1)
    bmi_rank_gender_var: Integer = SubjectValidator(data_type=Integer, temporal=-1)
    bmi_rank_overall_var: Integer = SubjectValidator(data_type=Integer, temporal=-1)

    def __post_init__(self):
        self.ranked: Dict[str, Dict[str, int]] = {}

    def extract(self, composite: Dict) -> Tuple[bool, float]:
        mean_bmi = composites.get_property(composite, self.mean_bmi_var)
        is_male = composites.get_property(composite, self.male_flag)
        return is_male, mean_bmi

    def analyze(self, extracts: Iterable[Tuple[str, Any]]) -> None:
        # Initialize data structure for analyzed data
        mean_bmi_dict: Dict[str, Dict[str, float]] = {}
        genders = ["male", "female", "overall"]
        for gender in genders:
            mean_bmi_dict[gender] = {}
            self.ranked[gender] = {}

        for composite_id, (is_male, mean_bmi) in extracts:
            if is_male:
                gender: str = "male"
            else:
                gender = "female"
            mean_bmi_dict[gender][composite_id] = mean_bmi
            mean_bmi_dict["overall"][composite_id] = mean_bmi

        for gender in genders:
            people_ranked = list(sorted(mean_bmi_dict[gender].keys(), key=lambda k: -1 * mean_bmi_dict[gender][k]))
            for k, person in enumerate(people_ranked):
                self.ranked[gender][person] = k + 1

    def _get_gender(self, composite_id: str) -> str:
        if composite_id in self.ranked["male"]:
            return "male"
        return "female"

    def alter(self, composite_id: str, composite: Dict) -> None:
        overall_rank = self.ranked["overall"][composite_id]
        composites.put_property(composite, self.bmi_rank_overall_var, overall_rank)

        gender: str = self._get_gender(composite_id)
        gender_rank = self.ranked[gender][composite_id]
        composites.put_property(composite, self.bmi_rank_gender_var, gender_rank)
Beispiel #7
0
class GeneratePersonDescription(Change):
    color_name_var: Text = SubjectValidator(data_type=Text)
    rgb_var: Text = SubjectValidator(data_type=Text)
    person_name_var: Text = SubjectValidator(data_type=Text)
    gender_var: Text = SubjectValidator(data_type=Text)
    weight_gain_var: Decimal = SubjectValidator(data_type=Decimal)
    sentence_var: Text = SubjectValidator(data_type=Text)

    def get_pronoun(self, composite: Dict):
        gender: str = get_value(composite, self.gender_var)

        pronoun_mapping = {"male": "he", "female": "she"}

        return pronoun_mapping[gender]

    def __call__(self, composite: Dict):
        template = "%s's favorite color is %s (%s). Over the observation period, %s gained %0.1f lbs."

        name = get_value(composite, self.person_name_var)
        color = get_value(composite, self.color_name_var)
        rgb = get_value(composite, self.rgb_var)
        weight_gain = get_value(composite, self.weight_gain_var)

        pronoun = self.get_pronoun(composite)

        sentence = template % (name, color, rgb, pronoun, weight_gain)
        print(self.sentence_var)
        sentence_path = ["invariant"] + list(self.sentence_var.absolute_path)
        nesteddicts.put(composite, sentence_path, sentence)
Beispiel #8
0
class CalculateWeightGain(Change):
    """Determine the total weight gain over the observation period."""
    weight_var: Decimal = SubjectValidator(data_type=Decimal)
    weight_gain_var: Decimal = SubjectValidator(data_type=Decimal)

    def __call__(self, composite: Dict):
        periods = set(composite.keys()) - {"invariant"}
        earliest = min(periods)
        latest = max(periods)

        weight_path = list(self.weight_var.absolute_path)

        earliest_weight_path: list = [earliest] + weight_path
        earliest_weight: float = nesteddicts.get(composite, earliest_weight_path)

        latest_weight_path: list = [latest] + weight_path
        latest_weight: float = nesteddicts.get(composite, latest_weight_path)

        # I know, should have called it "weight change."
        weight_gain = round(latest_weight - earliest_weight, 2)

        weight_gain_path = ["invariant"] + list(self.weight_gain_var.absolute_path)
        nesteddicts.put(composite, weight_gain_path, weight_gain)
Beispiel #9
0
class RetainOnlyFemales(Filter):
    male_flag: Binary = SubjectValidator(data_type=Binary)

    def passes(self, composite: Dict) -> bool:
        male: bool = composites.get_property(composite, self.male_flag)
        return not male