<jupyter_start><jupyter_text>Etapa 1: Pré-processamento dos dados. Links- [Atividade no Classroom](https://classroom.google.com/u/0/c/MTQ4MzY4NzYyMDM3/a/MTU1OTk5ODg0OTcx/details)- [Artigo <NAME>](https://drive.google.com/file/d/1dNBfmRlWIvUj_8mzpTEBtRqQF9tVl0kh/view)- [Cálculo de nascer e por do sol](https://www.inf.ufrgs.br/~cabral/Nascer_Por_Sol.html:~:text=Subtraindo%206%20horas%20do%20meio,pa%C3%ADs%2C%20estes%20hor%C3%A1rios%20seriam%20corretos.) EnunciadoEsta etapa consiste na conversão das fórmulas disponíveis no artigo para programação juntamente com o tratamento dos dados.O tratamento dos dados deverá ter foco no horário do nascimento do sol na cidade de Água Branca - AL, convertendo o tempo total de sol em minutos por dia.Para isso, você precisa calcular a hora que o sol nasce para um dado dia (Utilizar o artigo Cálculo do Nascer e Pôr do Sol).A entrega deverá ser feita até o dia 03/11, as 23:59. Etapas1. Conversão das fórmulas do artigo2. Cálcular a hora que o sol nasce cada dia3. Converter o tempo total de sol em minutos por dia<jupyter_code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>Ler XLS e montar o DataFrameFiz upload do arquivo aqui no colab (vocês podem ver clicando na pasta na que tem lá na esquerda), então ele deve ficar disponível pra todo mundo. Refs- [Função read_excel](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html)<jupyter_code>pag = pd.read_excel("Janeiro 2008.xls",
                    sheet_name = [0, 1, 2],
                    skiprows = [0, 2, 3],
                    header = 0)

df = pd.concat([pag[0], pag[1], pag[2]])
df<jupyter_output><empty_output><jupyter_text>Conversão das fórmulas do artigo<jupyter_code>from numpy import (
    sin,
    cos,
    tan,
    arccos,
    radians,
    degrees,
    absolute,
)

from datetime import (
    timedelta,
    datetime,
    date,
)
def earth_declination(n):
    return 23.45 * sin(radians(360/365 * (284+n)))

def td(lat, day):
    dec = earth_declination(day)
    cofactor = -(tan(radians(lat)) * tan(radians(dec)))
    return 2/15 * degrees(arccos(cofactor))

def longitude_correction(lng, fuse):
    diff = absolute(lng) - absolute(fuse)
    
    return timedelta(
        minutes=(diff * 60) / 15
    )

def day_range(td, lng, fuse):
    td /= 2
    sunrise = timedelta(hours=12-td)
    sunset = timedelta(hours=12+td)

    correction = longitude_correction(lng, fuse)
    sunrise += correction
    sunset += correction
    
    return (sunrise, sunset)
"""
Teste com dados do artigo
valores esperados:
daytime = 11,15174 
sunrise = 6h 32min 4s
sunset = 17h 41min 05s
"""

lat = -23.543333
lng = 46.633056
fuse = 45
day = 119

daytime = td(lat, day)
sunrise, sunset = day_range(daytime, lng, fuse)

print(f"""daytime = {daytime}
sunrise = {sunrise}
sunset = {sunset}""")<jupyter_output>daytime = 11.151741131164016
sunrise = 6:31:58.799404
sunset = 17:41:05.067476<jupyter_text>Calcular a hora que o sol nasce cada dia<jupyter_code>all_days = map(lambda ts: ts.date(), df["TIMESTAMP"])
days = pd.Series(all_days).unique()
def date_to_nth_day(d):
  new_year = date(d.year, 1, 1)
  delta = (d - new_year)
  delta += timedelta(days = 1)
  return delta.days
# Coordenadas de Água Branca - AL
lat = -9.25402
lng = -37.9449
fuse = 45

def daytime_from_day(day):
  day_int = date_to_nth_day(day)
  daytime = td(lat, day_int)
  sunrise, sunset = day_range(daytime, lng, fuse)

#  print(f"""\ndaytime = {daytime}
#sunrise = {sunrise}
#sunset = {sunset}""")

  daytime = pd.Timedelta(daytime, 'h')
  sunrise = pd.to_datetime(day) + sunrise
  sunset = pd.to_datetime(day) + sunset

  return (daytime, sunrise, sunset)

pd.DataFrame(map(daytime_from_day, days),
             columns=["Horas de Sol", "Nascer", "Pôr"])<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11752470098803952, 'fraction_numerical': 0.04628185127405096, 'mean_word_length': 4.088624338624339, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 4, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '108300', 'license': 'MIT', 'n_tokens_mistral': 1650, 'n_tokens_neox': 1505, 'n_words': 373, 'path': 'estatistica-e-probabilidade/nascer-do-sol/Ricardo.ipynb', 'repo_name': 'kbcvcbk/cesar-school', 'size': '3850'}