<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Taller evaluable sobre la extracción, transformación y visualización de datos usando IPython
Juan David Velásquez Henao 
jdvelasq@unal.edu.co
Universidad Nacional de Colombia, Sede Medellín
Facultad de Minas
Medellín, Colombia 
Instrucciones
Para realizar el taller
Step1:  2.-- Compute e imprima el número de registros con datos faltantes.
Step2:  3.-- Compute e imprima el número de registros duplicados.
Step3:  4.-- Elimine los registros con datos duplicados o datos faltantes, e imprima la cantidad de registros que quedan (registros completos).
Step4:  5.-- Compute y grafique el precio primedio diario.
Step5:  Ya que la grafica comienza en 1996, se corrigen los valores de la fecha para verla completa
Step6:  6.-- Compute y grafique el precio máximo por mes.
Step7:  7.-- Compute y grafique el precio mínimo mensual.
Step8:  8.-- Haga un gráfico para comparar el precio máximo del mes (para cada mes) y el precio promedio mensual.
Step9:  9.-- Haga un histograma que muestre a que horas se produce el máximo precio diario para los días laborales.
Step10:  Este metodo tiene en cuenta el valor maximo diario, y todas las horas a las cuales se presenta.
Step11:  Este metodo tiene en cuenta unicamente la primera hora a la cual se presenta el valor maximo en el dia
10.-- Haga un histograma que muestre a que horas se produce el máximo precio diario para los días sabado.
Step12:  Este metodo tiene en cuenta el valor maximo diario, y todas las horas a las cuales se presenta.
Step13:  Este metodo tiene en cuenta unicamente la primera hora a la cual se presenta el valor maximo en el dia
11.-- Haga un histograma que muestre a que horas se produce el máximo precio diario para los días domingo.
Step14:  Este metodo tiene en cuenta el valor maximo diario, y todas las horas a las cuales se presenta.
Step15:  Este metodo tiene en cuenta unicamente la primera hora a la cual se presenta el valor maximo en el dia
12.-- Imprima una tabla con la fecha y el valor más bajo por año del precio de bolsa.
Step16:  13.-- Haga una gráfica en que se muestre el precio promedio diario y el precio promedio mensual.
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
x=pd.DataFrame()      #Mejor hasta ahora
for m in range(1995,2018): 
    if m < 2016:
        o='.xlsx'
    else:
        o='.xls'
    if m < 2000:
        sK=3
    else:
        sK=2
    n='Precio_Bolsa_Nacional_($kwh)_' + str(m) + o
    y=pd.read_excel(n, skiprows=sK, parse_cols=24)
    x= x.append(y)
print(x.head())
print(x.tail())
print(str(len(x.index)) + ' Filas y ' + str(len(x.columns)) + ' Columnas')
Explanation: Taller evaluable sobre la extracción, transformación y visualización de datos usando IPython
Juan David Velásquez Henao 
jdvelasq@unal.edu.co
Universidad Nacional de Colombia, Sede Medellín
Facultad de Minas
Medellín, Colombia 
Instrucciones
Para realizar el taller:
En la carpeta 'Taller' del repositorio 'ETVL-IPython' se encuentran los archivos 'Precio_Bolsa_Nacional_($kwh)_'*'.xls' en formato de Microsoft Excel, los cuales contienen los precios históricos horarios de la electricidad para el mercado eléctrico Colombiano entre los años 1995 y 2017 en COL-PESOS/kWh. A partir de la información suministrada resuelva los siguientes puntos usando el lenguaje de programación Python.
Para el envío:
Al terminar el taller, y dentro de las fechas especificadas en la plataforma de OLADE, debe subir este archivo a su perfil de GitHub. En la plataforma debe copiar el enlace a este archivo, a modo de entregable. 
Preguntas
1.-- Lea los archivos y cree una tabla única concatenando la información para cada uno de los años. Imprima el encabezamiento de la tabla usando head().
End of explanation
print('Hay un total de ' + str(len(x)-len(x.dropna())) + ' registros con datos faltantes.')
Explanation: 2.-- Compute e imprima el número de registros con datos faltantes.
End of explanation
print('Hay un total de ' + str(len(x)-len(x.drop_duplicates())) + ' registros con datos duplicados.')
Explanation: 3.-- Compute e imprima el número de registros duplicados.
End of explanation
print('Hay un total de ' + str(len(x))+' Registros.')
z=x.dropna().drop_duplicates()
print('Al eliminar los registros duplicados o con datos faltantes quedan ' + str(len(z))+' registros completos.')
print('Finalmente quedan ' + str((len(z)-len(z.dropna()))+(len(z)-len(z.drop_duplicates()))) +
      ' registros duplicados o con datos faltantes, es decir, ninguno.')
Explanation: 4.-- Elimine los registros con datos duplicados o datos faltantes, e imprima la cantidad de registros que quedan (registros completos).
End of explanation
import matplotlib
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
z['Prom']=z.mean(axis=1)
z.groupby('Fecha').mean()['Prom'].plot(kind='line', title='Precio Promedio Diario Erroneamente comenzando en 1996')
Explanation: 5.-- Compute y grafique el precio primedio diario.
End of explanation
w=[]
for n in range(len(z['Fecha'])):
    w.append(str(z.iloc[n,0])[0:10])
z['Fecha']=w
z['Prom']=z.mean(axis=1)
 
z.groupby('Fecha').mean()['Prom'].plot(kind='line', title='Precio Promedio Diario Correcto comenzando en 1995', y='FFF')
Explanation: Ya que la grafica comienza en 1996, se corrigen los valores de la fecha para verla completa
End of explanation
z['Max']=z.max(axis=1)
w=[]
for n in range(len(z['Fecha'])):
    w.append(str(z.iloc[n,0])[0:7])
z['Ano-Mes']=w
z.groupby('Ano-Mes').max()['Max'].plot(kind='line', title='Precio Máximo Mensual')
Explanation: 6.-- Compute y grafique el precio máximo por mes.
End of explanation
z['Min']=z.min(axis=1)
z.groupby('Ano-Mes').min()['Min'].plot(kind='line', title='Precio Mínimo Mensual')
Explanation: 7.-- Compute y grafique el precio mínimo mensual.
End of explanation
z.groupby('Ano-Mes').max()['Max'].plot(kind='line', legend='true')
z.groupby('Ano-Mes').mean()['Prom'].plot(kind='line', legend='true', title='Comparación Precio Promedio y Precio Máximo Mensual')
Explanation: 8.-- Haga un gráfico para comparar el precio máximo del mes (para cada mes) y el precio promedio mensual.
End of explanation
import datetime
w=[]
v=[]
for n in range(len(z['Fecha'])):
    temp=str(z.iloc[n,0])
    ano, mes, dia = temp.split('-')
    dia=str(dia)[0:3]
    year=int(ano)
    month=int(mes)
    day=int(dia)
    semnum=datetime.date(year, month, day).weekday()
    if semnum>4:
        Labor=0
    else:
        Labor=1
    w.append(semnum)
    v.append(Labor)
z['Semana']=w
z[['Semana']]=z[['Semana']].apply(pd.to_numeric)
z['Labor']=v
z[['Labor']]=z[['Labor']].apply(pd.to_numeric)
w=[]
w=z[z['Labor']==1]
v=[]
for n in range(len(w['Fecha'])):
    for m in range(1,25):
        if w.iloc[n,m]==w.iloc[n,26]:
            v.append(m-1)
            continue
ParaHist=pd.DataFrame()
ParaHist['Maximo para Laborales']=v
ParaHist.plot.hist(alpha=0.5, title='Histograma con el Precio Maximo Diario para dias Laborales')
Explanation: 9.-- Haga un histograma que muestre a que horas se produce el máximo precio diario para los días laborales.
End of explanation
s=[]
zZ=[]
tT=[]
for n in range(len(w['Fecha'])):
    s=w.iloc[n].values[1:25]
    tT=[i for i, e in enumerate(s) if e == max(s)]
    zZ.append(tT[0])
    tT=[]
    continue
ParaHist=pd.DataFrame()
ParaHist['Maximo para Laborales']=zZ
ParaHist.plot.hist(alpha=0.5, title='Histograma con el Precio Maximo Diario para dias Laborales')
Explanation: Este metodo tiene en cuenta el valor maximo diario, y todas las horas a las cuales se presenta.
End of explanation
w=z[z['Semana']==5]
v=[]
for n in range(len(w['Fecha'])):
    for m in range(1,25):
        if w.iloc[n,m]==w.iloc[n,26]:
            v.append(m-1)
            continue
ParaHist=pd.DataFrame()
ParaHist['Maximo para Sabados']=v
ParaHist.plot.hist(alpha=0.5, title='Histograma con el Precio Maximo Diario para los Sabados')
Explanation: Este metodo tiene en cuenta unicamente la primera hora a la cual se presenta el valor maximo en el dia
10.-- Haga un histograma que muestre a que horas se produce el máximo precio diario para los días sabado.
End of explanation
s=[]
zZ=[]
tT=[]
for n in range(len(w['Fecha'])):
    s=w.iloc[n].values[1:25]
    tT=[i for i, e in enumerate(s) if e == max(s)]
    zZ.append(tT[0])
    tT=[]
    continue
ParaHist=pd.DataFrame()
ParaHist['Maximo para Sabados']=zZ
ParaHist.plot.hist(alpha=0.5, title='Histograma con el Precio Maximo Diario para los Sabados')
Explanation: Este metodo tiene en cuenta el valor maximo diario, y todas las horas a las cuales se presenta.
End of explanation
w=z[z['Semana']==6]
v=[]
for n in range(len(w['Fecha'])):
    for m in range(1,25):
        if w.iloc[n,m]==w.iloc[n,26]:
            v.append(m-1)
            continue
ParaHist=pd.DataFrame()
ParaHist['Maximo para Domingos']=v
ParaHist.plot.hist(alpha=0.5, title='Histograma con el Precio Maximo Diario para los Domingos')
Explanation: Este metodo tiene en cuenta unicamente la primera hora a la cual se presenta el valor maximo en el dia
11.-- Haga un histograma que muestre a que horas se produce el máximo precio diario para los días domingo.
End of explanation
s=[]
zZ=[]
tT=[]
for n in range(len(w['Fecha'])):
    s=w.iloc[n].values[1:25]
    tT=[i for i, e in enumerate(s) if e == max(s)]
    zZ.append(tT[0])
    tT=[]
    continue
ParaHist=pd.DataFrame()
ParaHist['Maximo para Domingos']=zZ
ParaHist.plot.hist(alpha=0.5, title='Histograma con el Precio Maximo Diario para los Domingos')
Explanation: Este metodo tiene en cuenta el valor maximo diario, y todas las horas a las cuales se presenta.
End of explanation
w=[]
for n in range(len(z['Fecha'])):
    w.append(str(z.iloc[n,0])[0:4])
z['Ano']=w
w=pd.DataFrame()
w=z.groupby(['Ano']).min()['Min']
w
Explanation: Este metodo tiene en cuenta unicamente la primera hora a la cual se presenta el valor maximo en el dia
12.-- Imprima una tabla con la fecha y el valor más bajo por año del precio de bolsa.
End of explanation
Lt=pd.DataFrame()
Lt['Fecha']=z['Fecha']
Lt['Ano-Mes']=z['Ano-Mes']
Lt['Prom']=z['Prom']
print(Lt.groupby(Lt['Ano-Mes']).mean().plot(kind='line',legend='false'))
print(Lt.groupby(Lt['Fecha']).mean().plot(kind='line',legend='false'))
z.groupby('Fecha').mean()['Prom'].plot(kind='line', legend='false')
z.groupby('Ano-Mes').mean()['Prom'].plot(kind='line', legend='false')
Explanation: 13.-- Haga una gráfica en que se muestre el precio promedio diario y el precio promedio mensual.
End of explanation
<END_TASK>