#!/usr/bin/env python
# coding: utf-8

# # Parte 1: Lectura de datos con diferentes formatos

# In[1]:


get_ipython().run_line_magic('reset', '-f')


# In[175]:


import pandas as pd
import numpy as np
import os
from datetime import datetime
# Librería para tratamiento de ficheros xml
import xml.etree.ElementTree as ET
# Librería para efectuar peticiones a páginas web
import requests


# Vamos a generar las funciones necesarias para cargar los datos en los diferentes formatos

# In[104]:


# carga de archivos xml

def cargaXml():
    inicio = datetime.now()
    xml_data = open('./data/calendario_laboral_2021.xml', 'r').read()  # Leer archivo
    root = ET.XML(xml_data)  # Parsear el XML
    data = []
    cols = []
    for i, child in enumerate(root):
        data.append([subchild.text for subchild in child])
        cols.append(child.tag)

    df = pd.DataFrame(data).T  # Escribir en DF y transponer datos
    df.columns = cols  # Actualizamos nombres de columna Update column names
    
    return ((datetime.now()-inicio).total_seconds())


# In[107]:


# carga de archivos xlsx
def cargaXlsx ():
    inicio = datetime.now()
    xlsx_data = pd.read_excel('./data/calendario_laboral_2021.xlsx', sheet_name='calendario_laboral_2021')
    return ((datetime.now()-inicio).total_seconds())


# In[109]:


# carga de archivos csv
def cargaCsv ():
    inicio = datetime.now()
    csv_data = pd.read_csv('./data/calendario_laboral_2021.csv', sep=';')
    return ((datetime.now()-inicio).total_seconds())


# In[110]:


# carga de archivos json
def cargaJson ():
    inicio = datetime.now()
    json_data = pd.read_json('./data/calendario_laboral_2021.json')
    return ((datetime.now()-inicio).total_seconds())


# In[111]:


cargaXml()


# In[114]:


cargaXlsx()


# In[118]:


cargaCsv()


# In[121]:


cargaJson()


# Vemos que la carga de datos más rápida es a través de CSV's.  También podemos cargar archivos directamente de internet...

# In[122]:


# carga de archivos csv internet
def cargaCsvInternet ():
    inicio = datetime.now()
    csv_data = pd.read_csv('https://opendata.euskadi.eus/contenidos/ds_eventos/calendario_laboral_2021/opendata/calendario_laboral_2021.csv', sep=';')
    return ((datetime.now()-inicio).total_seconds())


# In[126]:


cargaCsvInternet()


# Lo ponemos bonito y automatizamos... Ejecutaremos el proceso 5 veces para tener un tiempo medio de carga por tipo de archivo

# In[148]:


resultados = pd.DataFrame(columns=['xml','xlsx','csv','json','csvInternet'])
tiempos = np.array([])
for a in range(5):
    print ('Iteración:', a)
    xml = cargaXml()
    xlsx = cargaXlsx()
    csv = cargaCsv()
    json = cargaJson()
    csvInternet = cargaCsvInternet()
    
    tiempos = pd.Series(np.array([xml, xlsx, csv, json, csvInternet]), index=resultados.columns)
    resultados = resultados.append(tiempos, ignore_index=True)


# In[149]:


resultados


# Calculamos los tiempos medios para cada tipo de archivo

# In[173]:


tiemposMedios = pd.DataFrame(columns=['xml','xlsx','csv','json','csvInternet'])

tiemposMedios.loc ['0','xml'] = round(resultados ['xml'].mean(),3)
tiemposMedios.loc ['0','xlsx'] = round(resultados ['xlsx'].mean(),3)
tiemposMedios.loc ['0','csv'] = round(resultados ['csv'].mean(),3)
tiemposMedios.loc ['0','json'] = round(resultados ['json'].mean(),3)
tiemposMedios.loc ['0','csvInternet'] = round(resultados ['csvInternet'].mean(),3)


# In[174]:


tiemposMedios


# También podemos cargar tablas desde una url en internet...

# In[195]:


url = 'http://www.ffiec.gov/census/report.aspx?year=2011&state=01&report=demographic&msa=11500'
html = requests.get(url).content
df_list = pd.read_html(html)
df = df_list[-1] # Nos quedamos con la ultima tabla descargada

df.to_csv('tabla descargada de internet.csv')
df


# Concatenación de tablas (iguales) descargadas desde internet...

# In[209]:


urls = ["http://www.marca.com/estadisticas/futbol/primera/2016_17/jornada_38/",
         "http://www.marca.com/estadisticas/futbol/primera/2017_18/jornada_38/",
         "http://www.marca.com/estadisticas/futbol/primera/2018_19/jornada_38/",
         "http://www.marca.com/estadisticas/futbol/primera/2019_20/jornada_38/",
         "http://www.marca.com/estadisticas/futbol/primera/2020_21/jornada_38/"]


# In[231]:


tablas = []
for a in range(len(urls)):
    print(a)
    html = requests.get(urls[a]).content
    df_list = pd.read_html(html)
    tablas.append(df_list[-1]) # Nos quedamos con la ultima tabla descargada


# In[233]:


tablas[2]

