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)