def finish(self):
        if self.__state == STATE_FOUND_ERROR:
            return

        for child_index in self.get_list_needing_precentile():
            target_prototype = self.__prototypes[child_index]
            known_words = filter(
                lambda x: x['val'] == constants.EXPLICIT_TRUE,
                target_prototype['words']
            )
            all_words = filter(
                lambda x: x['val'] != constants.NO_DATA,
                target_prototype['words']
            )

            known_words_count = len(known_words)
            all_words_count = len(all_words)
            percentile = math_util.find_percentile(
                self.__percentile_table[target_prototype['gender']].details,
                known_words_count,
                target_prototype['age'],
                all_words_count
            )

            target_prototype['percentile'] = percentile
Exemple #2
0
def recalculate_percentile_raw(cached_adapter, mcdi_type, gender,
    words_spoken, age):

    # Load CDI information
    mcdi_model = cached_adapter.load_mcdi_model(mcdi_type)
    if mcdi_model == None:
        mcdi_model = cached_adapter.load_mcdi_model('fullenglishmcdi')

    # Get percentile information
    meta_percentile_info = mcdi_model.details['percentiles']

    percentiles_name = None
    if gender == constants.MALE or gender == constants.OTHER_GENDER:
        percentiles_name = meta_percentile_info['male']
    else:
        percentiles_name = meta_percentile_info['female']

    percentiles = cached_adapter.load_percentile_model(percentiles_name)

    # Calculate percentile
    return math_util.find_percentile(
        percentiles.details,
        words_spoken,
        age,
        cached_adapter.get_max_mcdi_words(mcdi_type)
    )
Exemple #3
0
    def test_finish_without_error(self):
        self.mox.StubOutWithMock(math_util, 'find_percentile')
        math_util.find_percentile([-3], 2, 789.3, 3).AndReturn(50)
        self.mox.ReplayAll()

        self.__test_automaton.set_prototypes([
            {'words': []}, {'words': []}, {'words': []}
        ])

        self.__test_automaton.parse_percentile(
            ['', 'Percentile', '80.1', '90.2', 'calculate'],
            1
        )

        self.__test_automaton.parse_age(
            ['', 'Age (months)', '123.1', '456.2', '789.3'],
            1
        )

        self.__test_automaton.parse_gender(
            ['', 'Gender', 'M', 'F', 'O'],
            1
        )

        self.__test_automaton.parse_words(['1', 'test', '1', '0', 'na'], 1)
        self.__test_automaton.parse_words(['1', 'test', '1', '0', '0'], 2)
        self.__test_automaton.parse_words(['1', 'test', '1', '0', '1'], 3)
        self.__test_automaton.parse_words(['1', 'test', '1', '0', '1'], 4)

        target_prototype = self.__test_automaton.get_prototypes()[2]
        self.assertEqual(target_prototype['percentile'], -1)

        self.__test_automaton.finish()

        target_prototype = self.__test_automaton.get_prototypes()[2]
        self.assertEqual(target_prototype['percentile'], 50)
Exemple #4
0
    def test_find_percentile(self):
        percentile = math_util.find_percentile(
            TEST_PERCENTILE_TABLE,
            0,
            30,
            667
        )
        self.assertTrue(percentile >= 0 and percentile <= 5)

        percentile = math_util.find_percentile(
            TEST_PERCENTILE_TABLE,
            155,
            30,
            667
        )
        self.assertTrue(percentile >= 0 and percentile <= 5)

        percentile = math_util.find_percentile(
            TEST_PERCENTILE_TABLE,
            537,
            24,
            667
        )
        self.assertTrue(percentile >= 90 and percentile <= 95)

        percentile = math_util.find_percentile(
            TEST_PERCENTILE_TABLE,
            574,
            24,
            667
        )
        self.assertTrue(percentile >= 95 and percentile <= 100)

        percentile = math_util.find_percentile(
            TEST_PERCENTILE_TABLE,
            630,
            24,
            667
        )
        self.assertTrue(percentile >= 99 and percentile <= 100)

        percentile = math_util.find_percentile(
            TEST_PERCENTILE_TABLE,
            667,
            24,
            667
        )
        self.assertTrue(percentile >= 99 and percentile <= 100)
Exemple #5
0
def recalculate_percentile(snapshot, cached_adapter):
    """
    @type snapshot: SnapshotMetadata
    """
    mcdi_model = cached_adapter.load_mcdi_model(snapshot.mcdi_type)
    if mcdi_model == None:
        mcdi_model = cached_adapter.load_mcdi_model('fullenglishmcdi')

    meta_percentile_info = mcdi_model.details['percentiles']
    gender = snapshot.gender

    percentiles_name = None
    if gender == constants.MALE or gender == constants.OTHER_GENDER:
        percentiles_name = meta_percentile_info['male']
    else:
        percentiles_name = meta_percentile_info['female']

    percentiles = cached_adapter.load_percentile_model(percentiles_name)

    count_as_spoken_vals = mcdi_model.details['count_as_spoken']
    individual_words = db_util.load_snapshot_contents(snapshot)
    words_spoken = 0
    for word in individual_words:
        if word.value in count_as_spoken_vals:
            words_spoken += 1

    snapshot.words_spoken = words_spoken
    
    new_percentile = math_util.find_percentile(
        percentiles.details,
        snapshot.words_spoken,
        snapshot.age,
        cached_adapter.get_max_mcdi_words(snapshot.mcdi_type)
    )

    snapshot.percentile = new_percentile