Faça funções Python para:
Calcular a média mensal de cada mês, para um dado ano.
Calcular a média mensal de cada mês, para um dado ano.
Passo 1
Beleza, aqui o enunciado diz “Faça funções Python para calcular a média mensal de cada mês, para um dado ano.”
Isso é conteúdo de Python básico: vamos criar uma função que receba um ano e uma lista de dados (data + valor) e devolva, pra cada mês desse ano, a média dos valores.
O que precisamos:
Isso é conteúdo de Python básico: vamos criar uma função que receba um ano e uma lista de dados (data + valor) e devolva, pra cada mês desse ano, a média dos valores.
O que precisamos:
- Dicionário para agrupar valores por mês
- Laços de repetição (
for
) - Módulo
datetime
(ou datas em formato simples) - Cálculo de média:
Passo 2
Primeiro, vamos preparar um dicionário que tenha uma chave para cada mês (1 a 12) e uma lista vazia pra acumular valores:
from datetime import datetime
def media_mensal(ano, dados):
# dados é uma lista de tuplas (string_data, valor) ou (datetime, valor)
meses = {m: [] for m in range(1, 13)}
Passo 3
Agora, percorremos cada registro, transformamos a data em objeto
datetime
(se for string), verificamos se pertence ao ano pedido e colocamos o valor na lista correta: for data, valor in dados:
# se vier como string, converte. Ex: "2023-04-15"
if isinstance(data, str):
data = datetime.fromisoformat(data)
if data.year == ano:
meses[data.month].append(valor)
Passo 4
Com tudo agrupado, basta calcular a média de cada lista. Se não tiver valor no mês, a gente pode usar
None
ou zero, conforme preferir. Vamos usar None
: medias = {}
for mes, lista_valores in meses.items():
if lista_valores:
soma = sum(lista_valores)
n = len(lista_valores)
medias[mes] = soma / n # aplica bar{x} = sum(x_i)/n
else:
medias[mes] = None
return medias
Passo 5
meses = {m: [] for m in range(1, 13)}
Passo 6
for data, valor in dados:
if isinstance(data, str):
data = datetime.fromisoformat(data)
if data.year == ano:
meses[data.month].append(valor)
if isinstance(data, str):
data = datetime.fromisoformat(data)
if data.year == ano:
meses[data.month].append(valor)
Passo 7
medias = {}
for mes, lista_valores in meses.items():
if lista_valores:
medias[mes] = sum(lista_valores) / len(lista_valores)
else:
medias[mes] = None
for mes, lista_valores in meses.items():
if lista_valores:
medias[mes] = sum(lista_valores) / len(lista_valores)
else:
medias[mes] = None
return medias
Exemplo de uso:
```python
dados_ex = [
("2023-01-10", 10),
("2023-01-20", 20),
("2023-02-05", 30),
("2022-01-15", 50),
]
print(media_mensal(2023, dados_ex))
# Saída: {1: 15.0, 2: 30.0, 3: None, ..., 12: None}
Resposta
from datetime import datetime
def media_mensal(ano, dados):
"""
Calcula a média mensal de cada mês para um ano dado.
Parâmetros:
- ano: int, ano que queremos filtrar.
- dados: lista de tuplas (data, valor). Data pode ser datetime ou string "YYYY-MM-DD".
Retorna:
- dict onde a chave é o mês (1 a 12) e o valor é a média ou None se não houver dados.
"""