Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Obter o n dia útil para uma variável booleana

Olá galera, boa tarde.

Estou aperfeiçoando um modelo de dados para treinar usando Machine Learning, entretanto estou com dificuldade em obter o n dia útil de um mês para armazenar em uma variável com 0 ou 1.

Atualmente eu estou com o modelo de dados abaixo:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from datetime import date, datetime, timezone

feriados = ['2015-01-01','2015-02-17','2015-04-03','2015-04-05','2015-04-21','2015-05-01','2015-06-04','2015-09-07',
        '2015-10-12','2015-11-02','2015-11-15','2015-12-25','2016-01-01','2016-02-09','2016-03-25','2016-03-27',
        '2016-04-21','2016-05-01','2016-05-26','2016-06-04','2016-09-07','2016-10-12','2016-11-02','2016-11-15',
        '2016-12-25','2017-01-01','2017-02-28','2017-04-14','2017-04-16','2017-04-21','2017-05-01','2017-05-26',
        '2017-06-15','2017-09-07','2017-10-12','2017-11-02','2017-11-15','2017-12-25','2018-01-01','2018-02-13',
        '2018-03-30','2018-04-01','2018-04-21','2018-05-01','2018-05-31','2018-09-07','2018-10-12','2018-11-02',
        '2018-11-15','2018-12-25','2019-01-01','2019-03-05','2019-04-19','2019-04-21','2019-05-01','2019-06-20',
        '2019-09-07','2019-10-12','2019-11-02','2019-11-15','2019-12-25']
feriados = pd.to_datetime(feriados, format='%Y-%m-%d')
feriados = pd.DataFrame({'data':feriados})

dados = pd.read_csv('./transactions.csv')
dados['data'] = pd.to_datetime(dados['data'], format='%d/%m/%Y')
df = pd.merge(dados, feriados, how='left', on='data', indicator = True)
dados['feriado'] = np.where(df['_merge'] == 'both', 1, 0)
dados['dia'] = (dados['data'].dt.day)
dados['mes'] = (dados['data'].dt.month)
dados['ano'] = (dados['data'].dt.year)
dados['diaDoAno'] = (dados['data'].dt.dayofyear)
dados['diaSemana'] = (dados['data'].dt.dayofweek)
dados['diaUtil'] = ((dados['diaSemana'] < 5) & (dados.feriado == 0))
dados['diaDeProducao'] = (((dados.diaSemana == 1) | (dados.diaSemana == 3)) & dados.diaUtil == True)
dados['segDia5'] = ((dados['data'].dt.dayofweek == 0) & (dados['dia'] == 5) & (dados.feriado == 0))
dados['segDia10'] = ((dados['data'].dt.dayofweek == 0) & (dados['dia'] == 10) & (dados.feriado == 0))
dados['inicioSemana'] = (dados['diaSemana'] < 3)
dados['semanaAno'] = (dados['data'].dt.weekofyear)
#dados['inicioMes'] = (dados['data'].dt.is_month_start)
#dados['fimMes'] = (dados['data'].dt.is_month_end)

Entretanto obter o quinto ou décimo dia útil tem grande valor para o aprendizado de máquina ser refinado.

Alguém passou por esse problema e achou alguma solução fácil?

Obrigado!

1 resposta
solução!

Consegui!

Utilizei a lib workalendar, abaixo segue um exemplo.

from workalendar.america import Brazil
cal = Brazil()

dados['dia5'] = 0
dados['dia10'] = 0

dias = np.array(dados['dia'].tolist())
meses = np.array(dados['mes'].tolist())
anos = np.array(dados['ano'].tolist())

for i in range(len(dados)):
    if(dados['data'][i] == pd.Timestamp(cal.add_working_days(date(anos[i], meses[i], 1), 5))):
        dados['dia5'][i] = 1
    if(dados['data'][i] == pd.Timestamp(cal.add_working_days(date(anos[i], meses[i], 1), 10))):
        dados['dia10'][i] = 1

Bem, consegui resolver o meu problema, porém acredito que deva ter formas melhores de obter esse dado. ^^'