Prazo de entrega recomendado:
Nesta tarefa vamos exercitar a criação de funções e como utilizá-las para resolver problemas mais complexos.
Cientista de dados é o profissional que investiga dados, tentando explicar eventos, identificar tendências, prever indicadores, correlacionar acontecimentos etc. Entre as suas principais ferramentas de trabalho estão as medidas estatísticas, como média, mediana, moda, etc. Como as aplicações modernas acumulam milhares e até milhões de pontos de dados, é indispensável utilizar um computador para preparar, filtrar, manipular e processar os dados. Nesta tarefa, você implementará algumas ferramentas para ajudar um cientista de dados a visualizar e explorar conjuntos de dados.
1. Implementando as funções básicas
Embora os dados que queremos analisar possam ter as mais diversas aplicações, muitas vezes queremos fazer um mesmo tipo de pergunta. Por exemplo, podemos estar interessados na média de idades dos clientes de uma loja, ou na média de salários dos funcionários de uma companhia. Por esse motivo, ao invés de implementar o mesmo algoritmo diversas vezes, utilizamos um módulos com funções genéricas. Você deve construir um módulo em Python com diversas funções para análise e processamento de dados.
Seu repositório tem um arquivo chamado modulo_analise.py
com
vários stubs das funções que devem ser implementadas. A finalidade
de cada função está descrita em uma string de documentação
correspondente. Complete a implementação dessas funções.
Atenção: Não utilize funções prontas do Python para implementar os algoritmos pedidos (você pode usar apenas funções e métodos prontos listados na seção de dicas). Como agora só estamos exercitando o uso de funções, não é necessário implementar os algoritmos mais rápidos e eficientes.
Testando seu módulo
Como um módulo é apenas um conjunto de funções, você pode se
perguntar: como podemos testar esse módulo antes de utilizá-lo em um
programa? A resposta é escrevendo uma ou mais funções de teste para
cada função dos módulos, que passa alguns parâmetros de entrada de
exemplo e compara o resultado obtido com o resultado esperado. Cada
uma dessas funçõezinhas é chamada de teste de unidade. Nesta tarefa,
um conjunto de testes de unidades já está pronto no arquivo
teste_modulo_analise.py
. Você não deve modificá-lo, mas deve ler e
entender o que ele faz. No futuro, você precisará criar seus próprios
testes de unidade.
2) Explorando filmes
Um cientista de dados — e cinéfilo amador — encontrou o arquivo
testes/filmes.dat
com uma lista de 4000 filmes. Cada linha do
arquivo é formada pelo identificador de um filme, o país de origem, o
ano de lançamento, a classificação indicativa e a duração em minutos.
Como o arquivo é muito grande, ele gostaria de criar um programa para
resumir e descobrir diversas curiosidades sobre esses filmes.
Você deve criar um programa explorando-filmes.py
que realiza uma
série de tarefas listadas abaixo. Seu programa deverá estar organizado
em funções, cada uma com uma responsabilidade bem definida e
documentada. Evite repetição de código, reutilizando funções sempre
que fizer sentido, particularmente as funções do módulo
modulo_analise.py
.
Para determinar qual ação seu programa irá realizar em cada
execução, ele irá receber um parâmetro com um identificador da tarefa.
Em Python, os parâmetros são passados pela lista sys.argv
. Veja um
programa de exemplo que recebe parâmetros passados pela de linha de
comando e executa diferentes ações dependendo desses parâmetros.
import sys
def somar(a, b):
return a + b
def subtrair(a, b):
return a - b
def main():
if len(sys.argv) < 4:
print("Uso inválido")
return
acao = sys.argv[1]
a, b = int(sys.argv[2]), int(sys.argv[3])
if acao == 'somar':
resultado = somar(a, b)
else:
resultado = subtrair(a, b)
print(resultado)
main()
user@host:~/ra123456/tarefa05/$ python3 calcular.py somar 40 2
42
a) Produtividade
Para a ação produtividade
, dados inteiros inicio
e fim
, informe
a quantidade de filmes lançados em cada ano, desde inicio
até fim
.
Entrada
1990 1994
Saída
1990: 11
1991: 12
1992: 14
1993: 12
1994: 6
b) Anos presentes
Para a ação anos_presentes
, dados inteiros inicio
e fim
, informe, em ordem
crescente, os anos em que foram lançados filmes, desde inicio
até fim
.
Entrada
1990 1994
Saída
1990
1991
1992
1993
1994
c) Filmes por classificação
Para a ação filmes_por_classificacao
, dada uma string classificacao
,
informe, em ordem crescente, os identificadores dos filmes com a classificação
indicativa classificacao
.
Entrada
TV-Y7-FV
Saída
476
954
1098
8679
d) Histograma dos anos
Para a ação histograma_dos_anos
, dada uma lista intervalos
, informe o
histograma dos anos de lançamento dos filmes, considerando os intervalos
formados por números seguidos [intervalos[i], intervalos[i+1])
, onde o
primeiro intervalo é fechado e o segundo aberto.
Entrada
2000 2005 2008 2010
Saída
[2000, 2005): 146
[2005, 2008): 147
[2008, 2010): 146
e) Filmes por país e classificação
Para a ação filmes_por_pais_e_classificacao
, dadas strings pais
e
classificacao
, informe, em ordem crescente, os identificadores dos filmes
lançados no país pais
e que possuem classificação indicativa classificacao
.
Entrada
Brazil R
Saída
7932
Dicas
-
Crie uma função responsável por ler os dados do arquivo e devolver as informações contidas nele. Sua função pode conter um código parecido com o trecho abaixo, que utiliza uma lista para guardar cada uma das características um filme. Existem coleções de dados mais apropriadas para essa tarefa, mas elas só serão introduzidas posteriormente no curso. Também veremos arquivos com calma depois.
# [...] with open("testes/filmes.dat") as f: for linha in f: indice, pais, ano, classe, duracao = linha.split() indices.append(int(indice)) paises.append(pais) anos.append(int(ano)) classes.append(classe) duracoes.append(int(duracao)) # [...]
-
Para ordenar uma lista em ordem crescente, utilize a função abaixo. Para ordenar em ordem decrescente, passe um parâmetro
reverse = True
.lista.sort(reverse = False)
-
Para ler uma lista de inteiros dada como entrada, com todos os elementos na mesma linha, utilize uma instrução como abaixo.
dados = list(map(int, input().split()))
Correção
Depois de submetida e terminada a tarefa, você deverá apresentá-la
a um monitor PED. Para isso, você deve procurar atendimento em algum
horário com monitor PED e digitar apresentar 5 no canal
fila-apresentar
para entrar na fila.
Esta tarefa contém diversos exercícios e atividades. É recomendável
realizar todas elas. Para passar na tarefa, você deve resolver
corretamente pelo menos sete testes de unidade do módulo modulo_analise.py
e passar em pelo menos um teste de unidade do programa
explorando-filmes.py
.
A pasta da tarefa no seu repositório vem inicialmente com um arquivo
nao_corrigir.txt
que serve para indicar que você ainda está
trabalhando nesta tarefa. Você pode realizar quantos pushes quanto
forem necessários. O monitor só irá corrigir sua tarefa quando esse
arquivo for removido do repositório.