Trabalhando com dados semanais em R

O script aqui apresentado foi desenvolvido em linguagem R para agrupar dados diários em semanas e apresentar algumas considerações ao trabalhar com esse tipo de sazonalidade. Primeiramente, ele começa carregando as bibliotecas necessárias (zoo e timeDate) e os dados a serem trabalhados (dois arquivos em formato CSV).

Os dados de entrada estão no formato “data,valor”, com a data no formato YYYY-MM-DD e o valor em ponto flutuante. Cada linha refere-se a um valor diário, que devem ser unidas em uma só variável através do comando “rbind” – considerando-se que a última data do arquivo “dados_obs.csv” é o dia anterior da primeira data do arquivo “dados_prev.csv”. Como uma série é de valores observados e a outra de valores previstos, a ideia é somar os valores diários de uma mesma semana, sejam eles observados ou previstos. Caso já tenha uma série sem falhas de valores diários, esse passo é dispensável.

Deve ser criada uma série de dados como um objeto “zoo” para facilitar o trabalho, informando os valores e as respectivas datas. Em seguida, a função “nextfri” é usada para definir o final de cada semana – no caso, sexta-feira. Desse modo, cada semana começa no sábado. Para alterar o limite final, basta mudar onde está 5 (número para sexta-feira) por outro (0 para domingo). Fontes: zoo reference e StackOverflow.

A função “aggregate” serve para juntar os dados da série (1º parâmetro) conforme a regrada dada pela função discutida no parágrafo anterior e o modo como os dados devem ser agregados: soma (sum). Imprimindo a saída, os totais são relacionados conforme o limite final da semana:

2018-06-01 2018-06-08 2018-06-15 2018-06-22 2018-06-29 2018-07-06 2018-07-13 
       0.0       16.3        3.1        2.1        0.0       31.0        0.0

Por exemplo: os dados somados entre os dias 2018-06-30 e 2018-07-06 (inclusive eles) resultam em 31.0, sendo identificado pelo último dia da sequência.

Caso queira separar novamente os dados em “observados” e “futuros”, primeiro deve-se definir um critério de separação. Por exemplo: considerando-se hoje como 2018-07-03, a semana que contém esse dia possui também um período do passado (dia 30 de junho e dias 1 e 2 de julho) e do futuro (dias 4, 5 e 6 de julho). Caso considere a semana atual (entre 2018-06-30 e 2018-07-06) correspondendo às semanas previstas, basta usar a data de hoje (comando “Sys.Date()”) para finalizar (“end”) as semanas de passado e iniciar (“start”) as semanas de futuro através do comando “window”. Nesse caso, as semanas finalizadas em 2018-07-06 e 2018-07-13 formam o vetor de previsão.

Por fim, o último bloco mostra como calcular a semana do ano (geralmente um número entre 1 e 52, também conhecido como “ordem da semana”) para cada dia de encerramento da semana. Essa conversão pode ser útil para identificar mais facilmente a semana no ano. Para isso, é feito um loop nas datas do objeto zoo (extraídas através do comando “time”). No caso do dia pertencer à semana do ano anterior (caso de 2017-01-01), o número da semana é 0; se o dia pertencer à primeira semana do ano seguinte (caso de 2018-12-31), o número da semana é 53. Para conferir, você pode consultar esse link com um calendário com o número das semanas (com semana começando na segunda). Com os dados desse exemplo, a saída deve ser formada dos números 22 a 28.

Atualização: para extrair as datas de um objeto zoo, pode-se também usar a função “index(x)”, e para extrair os dados, “coredata(x)”.

O script e os arquivos com dados para teste estão disponíveis nesse link do GitHub/day2week, pondendo ser executado no terminal através do comando “Rscript semanais.R”.

Extra – encontrar próximo dia da semana

Essa função busca o próximo dia do mês que corresponda a um determinado dia da semana. Por exemplo, se deseja a próxima sexta-feira, deve-se executar a função entrando como parâmetros a data de hoje e o número 6 para indicar sexta-feira.

# Function to get next particular day (Friday = 6)
nextweekday = function(date, wday) {
	date = as.Date(date)
	diff = wday - wday(date)
	if( diff < 0 )
		diff = diff + 7
	return(date + diff)
}

prox_sexta = nextweekday(Sys.Date(), 6)

Fonte: StackOverflow

Compartilhe :)

One comment

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.