Skip to content

Latest commit

 

History

History
576 lines (293 loc) · 23.2 KB

File metadata and controls

576 lines (293 loc) · 23.2 KB

Resumo

Python: Revisei conceitos básicos importantes do python. Aprendi sobre manipulação de arquivos, comprehension, orientação a objetos e principalmente programação funcional, destacando como uma tarefa pode ser reduzida a apenas uma linha de código pela abstração que a linguagem oferece.

Jupyter: Aprendi sobre como a ferramenta é interessante para organizar arquivos e executar códigos Python célula por célula, tornando o entendimento mais fácil, além de dar suporte ao markdown no mesmo arquivo, o que possibilita uma boa documentação do código.

Pandas: Aprendi vários comandos da biblioteca, e como ela torna a manipulação dos dados de arquivos muito mais fácil. Essa diferença ficou nítida comparando a manipulação de um arquivo .csv somente com python no exercício de ETL, para a utilização do Pandas na execução do desafio.

Matplotlib: Aprendi vários comandos da biblioteca, para transformar os dados obtidos com o Pandas em gráficos dos mais variados tipos, melhorando significativamente a visualização dos dados.

Exercícios

Parte 1 - Básico

1. Gerar nova lista apenas com números ímpares.

🔗Resposta Ex1.

2. Verificar quais palavras são palíndromos.

🔗Resposta Ex2.

3. Imprimir dados de uma lista na estrutura solicitada.

🔗Resposta Ex3.

4. Implementar uma função que recebe uma lista e retorna uma nova lista sem elementos duplicados.

🔗Resposta Ex4.

5. Ler um arquivo json e imprimir o seu conteúdo.

🔗Resposta Ex5.

6. Implementar uma função que recebe uma lista e uma função, e aplica a função recebida na lista - neste exercício a função recebida eleva os itens da lista ao quadrado.

🔗Resposta Ex6.

7. Ler um arquivo txt e imprimir o conteúdo.

🔗Resposta Ex7.

8. Implementar uma função que recebe um número variável de parâmetros nomeados e não nomeados e imprime o valor de cada parâmetro recebido.

🔗Resposta Ex8.

9. Implementar a classe Lampada com os metodos liga, desliga e esta_ligada, e testar conforme solicitado.

🔗Resposta Ex9.

10. Implementar uma função que recebe uma string de números separados por vírgula e retorna a soma de todos eles.

🔗Resposta Ex10.

11. Implementar uma função que recebe uma lista e retorna 3 listas, a lista original dividida em 3 partes iguais.

🔗Resposta Ex11.

12. Dado um dicionário, criar um lista apenas com os valores dele, sem duplicações.

🔗Resposta Ex12.

13. Calcule o valor mínimo, valor máximo, valor médio e a mediana de uma lista com valores aletórios.

🔗Resposta Ex13.

14. Imprimir uma lista de trás para frente

🔗Resposta Ex14.


Parte 2 - Avançado I

15. Implementar as classes Pato e Pardal, que herdam da superclasse Passaro os metodos voar e emitir_som, e testar conforme solicitado.

🔗Resposta Ex15.

16. Implementar a classe Pessoa, com o atributo privado nome, e utilizar properties para obter e alterar o atributo.

🔗Resposta Ex16.

17. Implementar a classe Calculo que possui os métodos adicao() e subtracao(). Ambos aceitam dois parâmetros e devem retornar a soma e a subtração deles, respectivamente.

🔗Resposta Ex17.

18. Criar a classe Ordenadora que possui o atributo listaBagunçada e os métodos ordenacaoCrescente e ordenacaoDecrescente, que ordenam a lista.

🔗Resposta Ex18.

19. Criar a classe Aviao, que possui os atributos modelo, velocidade_maxima, cor e capacidade, de modo que todos os aviões possuam o atributo cor com o valor azul, e testar com os valores de entrada.

🔗Resposta Ex19.


Parte 3 - Avançado II

20. Ler um arquivo com 10.000 inteiros, apresentar os 5 maiores valores pares e a soma deles.

🔗Resposta Ex20.

21. Implementar o corpo da função conta_vogais, que recebe uma string e retorna a contagem de vogais presentes na string.

🔗Resposta Ex21.

22. Implementar a função calcula_saldo, que recebe uma lista de tuplas correspondendo a um conjunto de lançamentos bancários, e retorna o valor final.

🔗Resposta Ex22.

23. Implementar a função calcular_valor_maximo, que recebe uma lista de operadores e uma lista de operandos, e aplica os operadores nos respectivos operandos, retornando o maior valor obtido após as operações.

🔗Resposta Ex23.

24. Ler o arquivo estudantes.csv e imprimir: o nome do estudante, as três maiores notas em ordem decrescente e a média das três maiores notas, com duas casas decimais de precisão.

🔗Resposta Ex24.

25. Desenvolver o corpo de uma função que recebe um dicionário com produtos e seus valores, e retornar uma lista de tuplas com os produtos que possuem valor acima da média.

🔗Resposta Ex25.

26. Desenvolver o corpo da função pares_ate, que retorna um generator para os valores pares de 2 até n, sendo n o valor passado como parâmetro na função.

🔗Resposta Ex26.


Parte 4 - ETL

Ler o arquivo actors.csv e resolver as atividades propostas nas etapas 1-5

🔗Código ETL

Etapa 1 - Apresentar o ator/atriz com maior número de filmes e a respectiva quantidade

🔗Resultado Etapa 1

Etapa 2 - Apresentar a média de receita de bilheteria bruta dos principais filmes, considerando todos os atores

🔗Resultado Etapa 2

Etapa 3 - Apresentar o ator/atriz com a maior média de receita de bilheteria bruta por filme

🔗Resultado Etapa 3

Etapa 4 - Realizar a contagem de aparições do filme de melhor bilheteria de cada ator, ordenando pela quantidade em ordem decrescente e, em segundo nível, pelo nome do filme.

🔗Resultado Etapa 4

Etapa 5 - Apresentar a lista dos atores ordenada pela receita bruta de bilheteria dos seus filmes, em ordem decrescente

🔗Resultado Etapa 5

Evidências

Exercício 1.

A lista b utiliza list comprehension para ser formada, pegando apenas os valores da lista a em que o resto da divisão por 2 é diferente de 0, ou seja, valores ímpares.



Exercício 2.

O if dentro do for checa se a palavra escrita de trás pra frente é igual a ela normal.



Exercício 3.

É utilizado enumerate na lista que esta no for, o que possibilita usar o índice de cada valor. Após isso, basta printar de forma formatada.



Exercício 4.

A função recebe a lista e passa ela para um set, que não permite valores duplicados. Depois, passa o set novamente para lista, salva em uma nova lista e a retorna.



Exercício 5.

É importada a biblioteca json para leitura do arquivo. O with open abre o arquivo e o método json.load faz a leitura, salvando o conteúdo na variável dados.



Exercício 6.

A função my_map recebe uma lista e cria uma nova lista com list comprehension aplicando a função potencia_de_2, que também é passada como parâmetro. A nova lista gerada é retornada.



Exercício 7.

O arquivo é aberto em modo leitura, salvando na variável dados. O for printa o conteúdo do arquivo linha por linha.



Exercício 8.

O *args aceita vários parâmetros não nomeados, e o **kwargs aceita vários parâmetros nomeados. Os dois laços for printam os parâmetros não nomeados e nomeados passados, respectivamente.



Exercício 9.

A classe Lampada possui um atributo booleano que é False quando está desligada e True quando está ligada. É criado um objeto do tipo Lampada, que inicia desligada. O método liga() muda o atributo de False para True e liga a lâmpada. O método desliga() muda o atributo de True para False e desliga a lâmpada. O método esta_ligada() checa se o atributo é True ou False, ou seja, se a lâmpada está ligada ou desligada.



Exercício 10.

O método split cria uma lista de strings, separando cada uma nas vírgulas da string original. O for percorre as strings da lista, os transforma em inteiro e soma todos.



Exercício 11.

A função dividir_lista() cria 3 novas listas, o for percorre de 0 até 4. A lista 1 recebe os valores dois índices 0 a 3, a lista 2 recebe os valores dos índices 4 a 7. E a lista 3 recebe os valores dos índices 8 a 11. Após a divisão, as 3 novas listas são retornadas



Exercício 12.

O for percorre a chave e o valor do dicionário, e inclui apenas o valor na nova lista. Para eliminar os duplicados, é aplicado a conversão para set na lista, e depois a conversão para lista novamente.



Exercício 13.

A mediana é calculada somando os dois valores centrais da lista (índices 24 e 25) e divindo por 2. A média é calculada somando todos os valores e dividindo por 50. Para achar o valor mínimo e máximo, é aplicado a função min e max, respectivamente.



Exercício 14.

Usar índice negativo nessa formatação faz a lista ser impressa de trás pra frente.



Exercício 15.

As classes Pato e Pardal possuem seus próprios atributos nome e som, e na hora que são instanciadas, chamam o super construtor da classe Passaro, a qual possui os métodos voar() e emitir som(), recebendo os atributos das classes filhas e os executando.



Exercício 16.

O decorador @property transforma o método como propriedade da classe, funcionando como um método para obter o nome da instância. O decorador @nome.setter é usado para modificar o valor do atributo nome.



Exercício 17.

O método soma() retorna a adição dos dois parâmetros recebidos. O método subtracao() retorna a diferença dos dois parâmetros recebidos.



Exercício 18.

O método ordenacaoCrescente() retorna o atributo listaBagunçada do objeto instanciado ordenado de forma crescente, enquanto o método ordenacaoDecrescente() retorna de forma decrescente.



Exercício 19.

O atributo cor é definido como privado, e não possui setter, apenas @property para obter a cor. Todos os aviões instanciados são setados com a cor azul pelo construtor.



Exercício 20.

O arquivo é lido e salvo na variável numeros. A função map transforma todos os itens do arquivo em int. A função filter seleciona apenas os valores pares. A função sorted ordena de forma decrescente pelo valor, selecionando os 5 primeiros. A função sum soma todos os 5 valores.



Exercício 21.

A função filter seleciona apenas os caracteres que são vogais. O resultado é transformado em uma lista de caracteres e a função len obtém o tamanho dessa lista, que é o número de vogais.



Exercício 22.

A função map transforma o primeiro valor de cada tupla como positivo caso o segundo valor seja igual a C (crédito) e como negativo caso contrário (débito). A função reduce realiza a soma acumulada de todos os valores, somando créditos e subtraindo débitos. O valor calculado é retornado ao final.



Exercício 23.

A função zip faz a junção dos operandos com as tuplas de operadores. A função map checa qual é o operador a ser executado e realiza a operação correspondente, salvando na lista resultados. A função max encontra o maior valor dessa lista.



Exercício 24.

O arquivo é lido e salvo na variável dados. Cada linha é salva em uma lista com o método readlines. A função map remove os espaços em branco e divide os itens da linha nas vírgulas, salvando em uma lista. O laço for percore cada estudante da lista, pegando seu nome, suas notas com a função map transformando os valores para inteiro, as 3 maiores notas com a função sorted ordenando as notas de forma decrescente, e a média com a função sum somando as 3 maiores notas e dividindo por 3, arredondando com 2 casas decimais. Todos esses itens são utilizados para criar um dicionário para cada estudante, e cada dicionário é armazenado na lista resultado. Depois, a função sorted ordena essa lista em ordem alfabética.



Exercício 25.

A função sum soma os preços dos produtos do dicionário e divide pela quantidade, obtendo a média. Para obter os maiores que a média, é usado list comprehension, iterando sobre os produtos do dicionário ordenado pelo valor com a função sorted. A lista inclui apenas os valores maiores que a média, já de maneira ordenada do maior para o menor.



Exercício 26.

A função inicia o num com valor 2. Cada vez que o generator for chamado, caso a condição do while seja True, num sera retornado e seu valor será incrementado em dois. O yield garante que o valor esteja sempre salvo.



ETL

Leitura do arquivo

Primeiramente, importei a função reduce da biblioteca functool, pois será necessária. Para a leitura do arquivo, utilizei with open com o caminho do arquivo, utilizando o prefixo r para que as barras invertidas não sejam interpretadas como caracteres de escape.

from functools import reduce

with open(r"Sprint 2\Exercicios\Parte4\Arquivo\actors.csv") as dados:
    linhas = dados.readlines()
    listas = list(map(lambda linha: linha.strip('\n').split(','), linhas))
    listas.pop(0)

Utilizei o método readlines para ler cada linha do arquivo. Depois, apliquei map em cada linha para remover a quebra de linha e dividir os itens da linha nas vírgulas, salvando cada ator como uma lista. Por fim, removi a primeira linha, que consiste nos nomes das colunas.


Tratamento dos dados

Criei um nova lista, que será responsável por armazenar dicionários, um para cada ator.

dic_atores = []

Após isso, utilizei um laço for para percorrer cada lista, que corresponde a um ator. Tratando o caso especial do Robert Downey Jr., que possui vírgula separando seu nome do sobrenome e aspas no início e no fim.

 for lista in listas:
        if lista[1] == ' Jr."':
            actor = lista[0].strip('"') + lista[1].strip('"')
            total_gross = float(lista[2])
            number_of_movies = int(lista[3])
            average_per_movie = float(lista[4])
            movie_1 = lista[5]
            gross = float(lista[6])
        else:
            actor = lista[0]
            total_gross = float(lista[1])
            number_of_movies = int(lista[2])
            average_per_movie = float(lista[3])
            movie_1 = lista[4]
            gross = float(lista[5])

        dic_atores.append({
            'actor' : actor,
            'total_gross' : total_gross,
            'number_of_movies' : number_of_movies,
            'average_per_movie' : average_per_movie,
            'movie_1' : movie_1,
            'gross' : gross
        })

O if verifica se o segundo item da lista é igual a ' Jr."'. Caso for, atribui à variável actor a concatenação do nome e do sobrenome, removendo as aspas. Os itens da lista são atribuídos a uma váriavel com o mesmo nome das colunas do arquivo csv, sendo convertidos para seu tipo correto. Cada ator é inserido como um dicionário na lista dic_atores.


Etapa 1 - Apresentar o ator/atriz com maior número de filmes e a respectiva quantidade

  with open(r"Sprint 2\Exercicios\Parte4\etapa-1.txt", "w", encoding="utf-8") as arquivo:
        ordenado_por_filmes = sorted(dic_atores, key=lambda x: x['number_of_movies'], reverse=True)
        ator_com_mais_filmes = ordenado_por_filmes[0]

        texto = f'O(A) ator/atriz que possui mais filmes no dataset é {ator_com_mais_filmes['actor']} com {ator_com_mais_filmes['number_of_movies']} filmes.'
        arquivo.write(texto)

O arquivo etapa-1.txt é aberto para escrita. A lista de atores é ordenada de forma decrescente, baseada no número de filmes. O ator com mais filmes é o índice 0 dessa lista. Após isso, o texto é formatado e escrito no arquivo.



Etapa 2 - Apresentar a média de receita de bilheteria bruta dos principais filmes, considerando todos os atores

 with open(r"Sprint 2\Exercicios\Parte4\etapa-2.txt", "w", encoding="utf-8") as arquivo:
        media_de_receita = reduce(lambda soma, x: x['gross'] + soma, dic_atores, 0) / len(dic_atores)

        texto = f'A média de receita de bilheteria dos principais filmes de cada ator no dataset é de {round(media_de_receita, 2)} milhões de dólares.'
        arquivo.write(texto)

O arquivo etapa-2.txt é aberto para escrita. A média da receita é calculada utilizando reduce, somando todos os valores da coluna gross e dividindo pela quantidade de atores. Após isso, o texto é formatado e escrito no arquivo.



Etapa 3 - Apresentar o ator/atriz com a maior média de receita de bilheteria bruta por filme

  with open(r"Sprint 2\Exercicios\Parte4\etapa-3.txt", "w", encoding="utf-8") as arquivo:
        ordenado_por_media = sorted(dic_atores, key=lambda x: x['average_per_movie'], reverse=True)
        ator_com_maior_media = ordenado_por_media[0]

        texto =(
            f'O(A) ator/atriz que possui maior média de receita de bilheteria bruta por filme no dataset é '
            f'{ator_com_maior_media['actor']} com {ator_com_maior_media['average_per_movie']} milhões de dólares de média.'
        )

        arquivo.write(texto)

O arquivo etapa-3.txt é aberto para escrita. A lista de atores é ordenada de forma decrescente, baseada na coluna average_per_movie. O ator com maior média é o índice 0 dessa lista. Após isso, o texto é formatado e escrito no arquivo.



Etapa 4 - Realizar a contagem de aparições do filme de melhor bilheteria de cada ator, ordenando pela quantidade em ordem decrescente e, em segundo nível, pelo nome do filme.

 with open(r"Sprint 2\Exercicios\Parte4\etapa-4.txt", "w", encoding="utf-8") as arquivo:
        lista_quantidades = []
        for item in dic_atores:
            lista_quantidades.append(item['movie_1'])
        
        lista_final = []

        for filme in lista_quantidades:
            quantidade = lista_quantidades.count(filme)
            lista_final.append((filme,quantidade))

        set1 = set(lista_final)
        lista_final = list(sorted(set1, key=lambda x: (-x[1], x[0])))

        for item in lista_final:
            texto = f'O filme {item[0]} aparece {item[1]} vez no dataset\n' if item[1] == 1 else f'O filme {item[0]} aparece {item[1]} vezes no dataset\n'
            arquivo.write(texto)

O arquivo etapa-4.txt é aberto para escrita. É criada uma lista para armazenar todos os filmes de maior bilheteria de cada ator. Depois, é criada uma lista final, onde o laço for conta quantas vezes cada filme apareceu e armazena na lista final o nome do filme e a quantidade. Depois, a lista é transformada em um set para eliminar os duplicados, e depois é novamente passada para lista ordenando primeiramente pela quantidade em ordem decrescente, e depois pelo nome do filme em ordem alfabética. Após isso, o texto é formatado e escrito no arquivo, tratando como plural os casos em que aparecem mais de uma vez.



Etapa 5 - Apresentar a lista dos atores ordenada pela receita bruta de bilheteria dos seus filmes, em ordem decrescente

with open(r"Sprint 2\Exercicios\Parte4\etapa-5.txt", "w", encoding="utf-8") as arquivo:
        ordenado_por_receita = sorted(dic_atores, key=lambda x: x['total_gross'], reverse=True)
        
        for item in ordenado_por_receita:
            texto = f'{item['actor']} - {item['total_gross']}\n'
            arquivo.write(texto)

O arquivo etapa-5.txt é aberto para escrita. A lista de atores é ordenada de forma decrescente, baseada na coluna total_gross. Após isso, o laço for formata o texto e escreve no arquivo, linha por linha.


Certificados

A Sprint atual não possui certificados.