Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Complementar utils para incluir funções frequentes #1287

Open
trevineju opened this issue Sep 26, 2024 · 0 comments
Open

Complementar utils para incluir funções frequentes #1287

trevineju opened this issue Sep 26, 2024 · 0 comments
Labels
enhancement Melhoria, novo recurso ou ferramenta

Comments

@trevineju
Copy link
Member

trevineju commented Sep 26, 2024

Algumas lógicas são bastantes comuns no repositório e ter um módulo de utils que fica sendo importado e utilizado, pode facilitar o desenvolvimento e a revisão de raspadores.

requisições mensais ou anuais

A rrule, que cria datas recorrentes, às vezes incorre em alguns problemas:

  • se o dia da data inicial for maior que o dia da data final, o mês final não é incluído.
    • A base municipioonline contornou a situação forçando o end_date a ser contado
dates_of_interest = [
    dt
    for dt in rrule(freq=YEARLY, dtstart=self.start_date, until=self.end_date)
]

if self.end_date not in dates_of_interest:
    dates_of_interest.append(self.end_date)
  • se a recorrência for mensal e começar nos dias 29, 30 ou 31, os meses que não tem o dia não entram
>>> from datetime import datetime as dt
>>> start = dt(2023, 3, 31)
>>> end = dt(2023, 6, 15)
>>> list(rrule(freq=MONTHLY, dtstart=start, until=end))
[datetime.datetime(2023, 3, 31, 0, 0), datetime.datetime(2023, 5, 31, 0, 0)]
# nesse caso, o mês 4 e o 6 foram prejudicados

Para Maricá-RJ #1252 uma abordagem inicial foi proposta para a frequencia mensal, usando rruleset:

monthly_dates = rruleset()
monthly_dates.rrule(rrule(MONTHLY, dtstart=self.start_date, until=self.end_date, bymonthday=[1]))
monthly_dates.rdate(dt(self.start_date.year, self.start_date.month, 1))
for monthly_date in monthly_dates

OU SEJA: já poderiamos ter algumas funções para frequencia anual, mensal e semanal construídas para lidar com limitações conhecidas e testadas para casos críticos; e, a partir disso, usar sempre elas.

requisições com pares inicio-fim

  • para interagir com sites que tem filtro de data, uma rotina de "janela deslizante" para cobrir todos os pares (data inicial, data final). Por exemplo:
def _sliding_window(self, iterable, n):
    it = iter(iterable)
    window = deque(islice(it, n - 1), maxlen=n)
    for x in it:
       window.append(x)
       yield tuple(window)

for filter_start, filter_end in self._sliding_window(dates_of_interest, 2):

Tarefa

Podemos encarar esse módulo utils como incremental, mas já daria para criá-lo a partir desses casos iniciais.

@trevineju trevineju added the enhancement Melhoria, novo recurso ou ferramenta label Sep 26, 2024
@trevineju trevineju changed the title Criar um módulo de utils para rotinas frequentes Complementar utils para incluir funções frequentes Sep 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement Melhoria, novo recurso ou ferramenta
Projects
Development

No branches or pull requests

1 participant