def probabilidade_causas_acidentes(self):
        """ Calculates the probability of the causes of accidents

            @brief Local variable:

                query -
                    SQL instruction to query the number of accidents
                by cause separated by year

                data_frame -
                    Saves the results from the query in data frame
                format

                medias_list -
                    List of avarages grouped by cause

                desvios_padroes_list -
                    List of standard deviations groupad by cause

                probabilidade_causas_acidentes_list -
                    List with the probabilities of the causes of accidents

                prob_causa_acidentes -
                    Instance of ProbabilidadeAcidentes

            @return A list of objects containing the causes of accidents
        """

        query = """SELECT causa, quantidade_ocorrencias, ano
                FROM estatisticas_causa
                ORDER BY causa, ano ; """

        data_frame = self.executa_query(query, get_data_frame=True)
        medias_list = data_frame.groupby(
            'causa'
        )['quantidade_ocorrencias'].mean()

        desvios_padroes_list = data_frame.groupby(
            'causa'
        )['quantidade_ocorrencias'].std()

        probabilidade_causas_acidentes_list = []

        init_array = 0
        for i in range(init_array, len(medias_list)):
            prob_causa_acidentes = ProbabilidadeAcidentes()
            prob_causa_acidentes.causa = medias_list.keys()[
                i].decode('iso-8859-1').encode('utf8')

            limits_min_one = 0
            limits_max_one = 5000
            limits_min_two = 5001
            limits_max_two = 10000
            limits_min_three = 10001
            limits_max_three = 30000
            limits_min_four = 30001
            limits_max_four = 50000
            limits_min_five = 50001
            limites = [
                (limits_min_one, limits_max_one),
                (limits_min_two, limits_max_two),
                (limits_min_three, limits_max_three),
                (limits_min_four, limits_max_four),
                (limits_min_five, sys.maxsize)
            ]

            normalization_in_percent = 100
            for (inferior, superior) in limites:
                if (medias_list[i] >= inferior and medias_list[i] <= superior):
                    prob_causa_acidentes.probabilidade_por_limite_list.append(
                        normalization_in_percent * (
                            distribuicao_normal(
                                inferior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            ) + distribuicao_normal(
                                superior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            )
                        )
                    )
                elif (medias_list[i] >= inferior):
                    prob_causa_acidentes.probabilidade_por_limite_list.append(
                        normalization_in_percent * (
                            distribuicao_normal(
                                inferior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            ) - distribuicao_normal(
                                superior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            )
                        )
                    )
                elif (medias_list[i] <= inferior):
                    prob_causa_acidentes.probabilidade_por_limite_list.append(
                        normalization_in_percent * (
                            distribuicao_normal(
                                superior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            ) - distribuicao_normal(
                                inferior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            )
                        )
                    )

            probabilidade_causas_acidentes_list.append(
                prob_causa_acidentes
            )

        return probabilidade_causas_acidentes_list
    def probabilidade_tipos_acidentes(self):
        """
        Calculates the probability of future accidents by type.

        @brief Local variables:
            query -
                SQL instruction to query number of occurrences by type and year
            data_frame -
                Receives the query result in a predetermined format.
            medias_list -
                Takes the media of the number of occurrences by type and lists
                then.
            desvios_padroes_list -
                Lists the standard deviation of the number of occurrences by
                type.
            probabilidade_tipo_list -
                Lists the probability of a certain type of accident happening
                again.
            limites -
                Limits the number of registers in the database.
            probabilidade_tipo -
                Receives the result of probability per each accident's type.
            probabilidade_tipo.tipo -
                Receives a key to encode from iso-8859-1 to utf8
            inferior -
                Determines the lower limit for the operation
            superior -
                Determines the higher limit for the operation
            distribuicao_normal-
                Calculates the normal distribution of the probability

        @return List of probability by type.
        """
        query = """SELECT tipo, quantidade_ocorrencias, ano
                FROM estatisticas_tipo
                ORDER BY tipo, ano ; """

        data_frame = self.executa_query(query, get_data_frame=True)

        medias_list = data_frame.groupby(
            'tipo'
        )['quantidade_ocorrencias'].mean()
        desvios_padroes_list = data_frame.groupby(
            'tipo'
        )['quantidade_ocorrencias'].std()

        probabilidade_tipo_list = []

        for i in range(0, len(medias_list)):
            probabilidade_tipo = ProbabilidadeAcidentes()
            probabilidade_tipo.tipo = medias_list.keys()[
                i].decode('iso-8859-1').encode('utf8')

            limits_min_one = 0
            limits_max_one = 5000
            limits_min_two = 5001
            limits_max_two = 10000
            limits_min_three = 10001
            limits_max_three = 30000
            limits_min_four = 30001
            limits_max_four = 50000
            limits_min_five = 50001
            limites = [
                (limits_min_one, limits_max_one),
                (limits_min_two, limits_max_two),
                (limits_min_three, limits_max_three),
                (limits_min_four, limits_max_four),
                (limits_min_five, sys.maxsize)]

            normalization_in_percent = 100
            for (inferior, superior) in limites:
                if (medias_list[i] >= inferior and medias_list[i] <= superior):
                    probabilidade_tipo.probabilidade_por_limite_list.append(
                        normalization_in_percent * (
                            distribuicao_normal(
                                inferior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            ) + distribuicao_normal(
                                superior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            )
                        )
                    )
                elif (medias_list[i] >= inferior):
                    probabilidade_tipo.probabilidade_por_limite_list.append(
                        normalization_in_percent * (
                            distribuicao_normal(
                                inferior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            ) - distribuicao_normal(
                                superior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            )
                        )
                    )
                elif (medias_list[i] <= inferior):
                    probabilidade_tipo.probabilidade_por_limite_list.append(
                        normalization_in_percent * (
                            distribuicao_normal(
                                superior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            ) - distribuicao_normal(
                                inferior,
                                medias_list[i],
                                desvios_padroes_list[i]
                            )
                        )
                    )

            probabilidade_tipo_list.append(
                probabilidade_tipo
            )

        return probabilidade_tipo_list
 def test_estatisticas_distribuicao_normal(self):
     self.assertIsNotNone(estatisticas_util.distribuicao_normal(None, None, None))
     self.assertIsNotNone(estatisticas_util.distribuicao_normal(100, 50, 0.5))
     self.assertEquals(estatisticas_util.distribuicao_normal(100, 50, 0.5), 0.5)