-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscraping_uf_sii.py
More file actions
60 lines (44 loc) · 2.3 KB
/
Copy pathscraping_uf_sii.py
File metadata and controls
60 lines (44 loc) · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import requests
import pandas as pd
from bs4 import BeautifulSoup
from io import StringIO
def calcular_uf_anual(anio):
url = f'https://www.sii.cl/valores_y_fechas/uf/uf{anio}.htm'
response = requests.get(url)
response.encoding = 'latin1'
if response.status_code != 200:
raise ConnectionError(f"No se pudo obtener la página para el año {anio}")
soup = BeautifulSoup(response.text, 'html.parser')
tabla_uf_html = soup.find('table', id='table_export', class_='table table-hover table-bordered')
if tabla_uf_html is None:
raise ValueError("No se encontró la tabla con id 'table_export'")
df_uf = pd.read_html(StringIO(str(tabla_uf_html)), flavor='bs4')[0]
columnas_esperadas = ['Día', 'Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic']
df_uf.columns = columnas_esperadas[:len(df_uf.columns)]
df_long = df_uf.melt(id_vars=['Día'], var_name='mes', value_name='valor')
df_long = df_long.dropna(subset=['valor'])
meses_num = {'Ene':1, 'Feb':2, 'Mar':3, 'Abr':4, 'May':5, 'Jun':6, 'Jul':7,
'Ago':8, 'Sep':9, 'Oct':10, 'Nov':11, 'Dic':12}
df_long['mes_num'] = df_long['mes'].map(meses_num)
df_long['valor'] = df_long['valor'].astype(str).str.replace('.', '', regex=False)
df_long['valor'] = df_long['valor'].str.replace(',', '.', regex=False)
df_long['valor'] = df_long['valor'].astype(float)
df_long['fecha'] = pd.to_datetime(dict(year=anio, month=df_long['mes_num'], day=df_long['Día']))
df_resultado = df_long[['fecha', 'valor']].sort_values('fecha').reset_index(drop=True)
return df_resultado
def descargar_uf_varios_anios(anios):
lista_df = []
for anio in anios:
print(f"Descargando UF para el año {anio}...")
df_anio = calcular_uf_anual(anio)
lista_df.append(df_anio)
# Combinar todos los años en uno solo
df_completo = pd.concat(lista_df).reset_index(drop=True)
return df_completo
if __name__ == "__main__":
anios_a_descargar = range(2013, 2024)
df_uf_completo = descargar_uf_varios_anios(anios_a_descargar)
# Guardar en Excel
nombre_archivo = "uf_varios_años.xlsx"
df_uf_completo.to_excel(nombre_archivo, index=False)
print(f"Archivo guardado como {nombre_archivo}")