Juan David Velásquez Henao
jdvelasq@unal.edu.co
Universidad Nacional de Colombia, Sede Medellín
Facultad de Minas
Medellín, Colombia
Para realizar el taller:
En la carpeta 'Taller' del repositorio 'ETVL-IPython' se encuentran los archivos 'Precio_BolsaNacional($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.
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()
.
In [78]:
import pandas as pd
pd.read_excel('Precio_Bolsa_Nacional_($kwh)_1995.xlsx')
Out[78]:
In [79]:
x=[]
for n in range(1995,2018):
if n<2000:
skip=3
else:
skip=2
nombrearchivo='Precio_Bolsa_Nacional_($kwh)_' + str(n)
if n>=2016:
nombrearchivo += '.xls'
else:
nombrearchivo += '.xlsx'
y=pd.read_excel(nombrearchivo, skiprows=skip, parse_cols=24)
x.append(y)
z=pd.concat(x)
print(z.head())
print(z.tail())
2.-- Compute e imprima el número de registros con datos faltantes.
In [80]:
len(z)
Out[80]:
In [7]:
z.size
Out[7]:
In [81]:
len(z)-len(z.dropna())
Out[81]:
3.-- Compute e imprima el número de registros duplicados.
In [82]:
len(z)-len(z.drop_duplicates())
Out[82]:
In [83]:
len(z.drop_duplicates())
Out[83]:
In [84]:
len(z.dropna())
Out[84]:
4.-- Elimine los registros con datos duplicados o datos faltantes, e imprima la cantidad de registros que quedan (registros completos).
In [85]:
w=z.dropna().drop_duplicates()
len(w)
Out[85]:
In [86]:
len(w)-len(w.drop_duplicates())
Out[86]:
In [87]:
len(w)-len(w.dropna())
Out[87]:
5.-- Compute y grafique el precio primedio diario.
In [19]:
prom = w.mean(axis=1)
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
plt.xlabel('Dias')
plt.ylabel('$/kWh Promedio')
plt.title('Precios Promedios Diarios')
plt.bar(range(len(prom)),prom)
plt.show()
6.-- Compute y grafique el precio máximo por mes.
In [88]:
q=[]
for n in range(len(w['Fecha'])):
q.append (str(w.iloc[n,0])[0:7])
w['mes']=q
maximomes = w.groupby('mes').max()
maximomes= maximomes.max(axis=1)
plt.xlabel('Meses')
plt.ylabel('$/kWh Promedio')
plt.title('Precios Maximos Mensuales')
plt.bar(range(len(maximomes)),maximomes)
plt.show()
In [ ]:
7.-- Compute y grafique el precio mínimo mensual.
In [92]:
minimomes = w.groupby('mes').min()
minimomes = minimomes.min(axis=1)
plt.xlabel('Mensual')
plt.ylabel('$/kWh Promedios')
plt.title('Precios Minimo Mensual')
plt.bar(range(len(minimomes)),minimomes)
plt.show()
8.-- Haga un gráfico para comparar el precio máximo del mes (para cada mes) y el precio promedio mensual.
In [93]:
promediomes = w.groupby('mes').mean()
promediomes= promediomes.mean(axis=1)
plt.xlabel("Meses")
plt.ylabel("$/kWh")
plt.plot(pd.Series(promediomes).values,label="Promedio")
plt.plot(pd.Series(maximomes).values, label="Máximo")
plt.legend(loc="center left")
Out[93]:
9.-- Haga un histograma que muestre a que horas se produce el máximo precio diario para los días laborales.
In [94]:
from datetime import datetime, date, time, timedelta
import calendar
fecha=[]
fecha=w['Fecha']
w['Fecha']=pd.to_datetime(w['Fecha'], format="%Y-%m-%d")
w['Dia']=w['Fecha'].dt.weekday_name
Lab = w['Dia'].isin(['Monday','Tuesday','Wednesday','Thursday','Friday'])
Lab = w[Lab]
indicador = ['{}'.format(n) for n in range(len(Lab))]
Lab.index = indicador
t=[]
for n in range(len(Lab)):
x = pd.Series(Lab.loc[str(n)]).values[1:25]
t.append ([i for i, e in enumerate(x) if e == max(x)])
a=[]
for n in range(len(t)):
for i in range (len(t[n])):
a.append(t[n][i])
rep=[]
for n in range (24):
rep.append(a.count(n))
plt.xlabel("Horas")
plt.ylabel("$/kWh")
plt.bar(range(24),rep,color='r',width = 1)
plt.show()
10.-- Haga un histograma que muestre a que horas se produce el máximo precio diario para los días sabado.
In [95]:
Sab = w['Dia'].isin(['Saturday'])
Sab = w[Sab]
indicador = ['{}'.format(n) for n in range(len(Sab))]
Sab.index = indicador
s=[]
for n in range(len(Sab)):
x = pd.Series(Sab.loc[str(n)]).values[1:25]
s.append ([i for i, e in enumerate(x) if e == max(x)])
a=[]
for n in range(len(s)):
for i in range (len(s[n])):
a.append(s[n][i])
rep=[]
for n in range (24):
rep.append(a.count(n))
plt.xlabel("Sabado")
plt.ylabel("$/kWh")
plt.bar(range(24),rep,color='r',width = 1)
plt.show()
11.-- Haga un histograma que muestre a que horas se produce el máximo precio diario para los días domingo.
In [96]:
Sab = w['Dia'].isin(['Sunday'])
Sab = w[Sab]
indicador = ['{}'.format(n) for n in range(len(Sab))]
Sab.index = indicador
s=[]
for n in range(len(Sab)):
x = pd.Series(Sab.loc[str(n)]).values[1:25]
s.append ([i for i, e in enumerate(x) if e == max(x)])
a=[] # Este Fragmento hace una matriz de la matriz u que contenia horas en que el maximo se repetia.
for n in range(len(s)):
for i in range (len(s[n])):
a.append(s[n][i])
rep=[]
for n in range (24):
rep.append(a.count(n))
plt.bar(range(24),rep,color='r',width = 1)
plt.show()
12.-- Imprima una tabla con la fecha y el valor más bajo por año del precio de bolsa.
In [97]:
A=[]
nmatriz=w
for n in range(len(nmatriz['Fecha'])):
A.append (str(nmatriz.iloc[n,0])[0:4])
nmatriz['ano']=A
minimoano = nmatriz.groupby('ano').min()
minimoano= minimoano.min(axis=1)
minimoano
Out[97]:
13.-- Haga una gráfica en que se muestre el precio promedio diario y el precio promedio mensual.
In [98]:
indicador = ['{}'.format(n) for n in range(len(w))]
w.index = indicador
In [99]:
promediomes=[]
for n in range (len(w)):
y=w.groupby('mes')
f=w.loc[y.groups[w['mes'][n]]].mean()
f=f.mean()
promediomes.append(f)
plt.xlabel("Meses")
plt.ylabel("$/kWh")
plt.plot(pd.Series(promediomes).values,label='Promedio mes')
plt.plot(pd.Series(prom).values,label="Promedio diario")
plt.legend(loc="center left")
plt.show()