Prazo de entrega recomendado:
Você deverá visualizar e analisar dados climáticos. Para isso, precisará exercitar algoritmos iterativos e ordenação.
Preocupados com o aquecimento global, um grupo de meteorologistas precisa analisar os dados climáticos de alguns países. Um dos objetivos é identificar padrões nas mudanças de temperatura além de dados discrepantes, normalmente chamados de outliers. Para isso, você precisará processar um arquivo com um histórico de temperaturas de cada país.
Os históricos de temperatura dos países estão armazenados em diversos
arquivos CSV disponíveis em seu diretório. Por exemplo, os dados da
Suíça estão em um arquivo chamado dados/Suica.csv
. Este arquivo
possui um registro de temperatura por linha, cada uma composta por
duas colunas separadas por vírgula. A primeira coluna contém o mês em
que foi realizado o registro e a segunda, a temperatura média naquele
mês. Veja um trecho do arquivo:
01/2000,-1.81
02/2000,1.856
03/2000,4.121
04/2000,7.904
05/2000,13.393
...
11/2013,4.219
12/2013,-0.564
Nesse exemplo, os dados correspondem às temperaturas médias mensais durante 14 anos, compreendendo o período de 01/2000 até 12/2013. Observe que neste exemplo, as linhas já estão ordenadas por data, mas nem todos os arquivos estão tão bem organizados.
Visando facilitar a análise dos dados por parte dos meteorologistas, você precisará realizar diversas subtarefas a fim de cumprir a sua missão.
1. Descobrindo tendências
Num primeiro momento, os meteorologistas gostariam de entender a tendência de crescimento da temperatura média anual. O problema é que, devido a alguns fenômenos climáticos, como El Niño, alguns meses podem ter uma temperatura muito atípica. Isso pode influenciar na temperatura média anual e prejudicar a análise da tendência.
Para determinar se um mês tem temperatura discrepante, os meteorologistas precisam calcular o desvio padrão das medidas em cada ano. Eles decidiram que um mês tem uma medida regular se a temperatura desse mês, $\tau$, não diferir da média daquele ano, $\mu$, de mais do que uma vez e meia o desvio padrão do ano, $\sigma$, isso é, se $\mu - 1{,}5\sigma \le \tau \le \mu + 1{,}5\sigma$. Todas as outras medidas desse ano são discrepantes.
Lembre-se de que o desvio padrão de um conjunto de $n$ medidas é dado pela fórmula:
$$ \sigma = \sqrt{\frac{\sum_{i = 0}^n(\tau_i - \mu)^2}{n}}. $$
Sua tarefa é construir um programa tendencia.py
que calcula as
médias anuais de temperatura de um país.
Entrada
A entrada contém uma linha contendo o nome do arquivo CSV.
dados/Suica.csv
Saída
A saída deve conter a sequência dos meses discrepantes e as médias de temperaturas anuais, excluídos os meses discrepantes, conforme o exemplo. Os dados devem ser apresentados em ordem de data.
Outliers:
01/2000
12/2001
01/2002
08/2003
01/2006
07/2006
12/2007
01/2009
07/2010
01/2011
02/2012
07/2013
Tendência de média anual:
2000: 9.51
2001: 8.93
2002: 9.37
2003: 7.54
2004: 7.85
2005: 7.57
2006: 8.26
2007: 9.42
2008: 8.11
2009: 9.35
2010: 6.16
2011: 9.74
2012: 9.31
2013: 6.55
2. Identificando eventos
Mais do que identificar a tendência do crescimento da temperatura média anual, é importante identificar fenômenos isolados que provocaram variação pontual de temperatura. Assim, é importante listar quais meses têm maiores discrepâncias com relação a média histórica.
Isso é feito da seguinte forma: para cada mês do ano, calculamos a discrepância desse mês como o número de desvios-padrão da diferença absoluta de temperatura com a média histórica para esse mês. Mais precisamente, se $\tau$ é a temperatura do mês de um ano, $\mu$ e $\sigma$ são, respectivamente, a média e o desvio padrão da média daquele mês considerando o histórico de todos os anos, então a discrepância é $\alpha = \frac{|\tau - \mu|}{\sigma}$.
Entrada
A entrada contém uma linha contendo o nome do arquivo CSV.
Sua tarefa é construir um programa discrepancias.py
que identifica
os meses com maior discrepância de temperatura.
dados/Suica.csv
Saída
A saída deve conter os 10 maiores valores de discrepância, ordenados por data.
09/2001: 1.93
10/2001: 1.98
06/2003: 2.94
08/2003: 2.38
10/2003: 2.13
07/2006: 2.29
08/2006: 1.89
01/2007: 2.09
04/2007: 2.42
05/2013: 2.00
Dicas
-
Ainda estudaremos como lidar com arquivos, mas ler cada registro de um arquivo
.csv
em Python é simples:with open("dados.csv") as arquivo: for linha in arquivo: data, temperatura = linha.split(",") ...
Critérios
-
Nesta tarefa, você deve implementar os algoritmos explicitamente. Não é permitido utilizar algoritmos prontos para ordenar ou calcular média, desvio padrão, etc. Funções como
sum
,mean
,sorted
são proibidas. Sempre que tiver dúvida, pergunte no canal de atendimento! -
Para o cálculo da raiz quadrada, não use
math.sqrt()
ou exponenciação (**). Em vez disso, use o método de aproximações sucessivas de Newton, conforme exercício 6 da lista 4.
Correção
Esta tarefa será corrigida automaticamente sempre que você realizar um
git push
. Depois de submetida a versão final da 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 6
no canal fila-apresentar
para entrar na fila.