Análisis del precio horario PVPC frente Gas Natural Fenosa

El objetivo de este libro de notas es analizar la tendencia del Precio Voluntario del Pequeño Consumidor (PVPC) regulado por el estado Español y comparar dicho precio con la tarifa ofrecida por Gas Natural Fenosa.


In [1]:
%matplotlib inline
import datetime
import matplotlib.pyplot as plt
import os
import pandas as pd
import pytz
import ree_pvpc
import seaborn as sb
from datetime import datetime
plt.rcParams['figure.figsize'] = (18, 10)
FILE_NAME = "GEN_20141129_20151129.csv"

Tomaremos los datos de PVPC para un año, desde el 29 de Noviembre del 2014 hasta el 29 de Noviembre del 2015.


In [2]:
if os.path.exists(FILE_NAME):
    tz = pytz.timezone("Europe/Madrid")
    pvpc_ts = pd.Series.from_csv(FILE_NAME, header=0)
    pvpc_ts.index = pvpc_ts.index.map(lambda x: x.replace(tzinfo=tz))
else:
    pvpc_ts = ree_pvpc.generate_series("20141129","20151129")
    pvpc_ts.to_csv(FILE_NAME, header=True, date_format="%Y-%m-%d %H:%M:%S%z", index_label="datetime")

Y de Gas Natural Fenosa, mirando las facturas, sabemos que hasta el 31 de Julio de 2015 el precio kWh fue de $0.141019$ €/kWh y desde el día siguiente de $0.136557$ €/kWh.


In [3]:
gn_p1 = [0.141019] * len(pvpc_ts[:datetime(2015, 7, 31, 23)])
gn_p2 = [0.136557] * len(pvpc_ts[datetime(2015, 8, 1):])
gn_ts = pd.Series(gn_p1 + gn_p2, index=pvpc_ts.index)

In [4]:
print "len(ts) = ",pvpc_ts.shape


len(ts) =  (8784,)

Calculamos la diferencia entre PVPC y la tarifa de Gas Natural, y agrupamos en datos diurnos (entre las 10 y las 22) y datos nocturnos (entre las 23 y las 9 del día siguiente).


In [5]:
diff = pvpc_ts - gn_ts
g = diff.groupby(lambda x: x.hour>9 and x.hour < 23)
diff_day = diff[g.groups[True]]
diff_night = diff[g.groups[False]]

Histograma datos diurnos


In [6]:
diff_day.hist(bins=50)


Out[6]:
<matplotlib.axes.AxesSubplot at 0x7f24d0edc3d0>

Histograma datos nocturnos


In [7]:
diff_night.hist(bins=50)


Out[7]:
<matplotlib.axes.AxesSubplot at 0x7f24a9bea5d0>

Violin para datos agrupados por horas


In [8]:
pvpc_hours = pvpc_ts.index.map(lambda x: x.hour)
pvpc_df = pd.DataFrame({"datetime":pvpc_ts.index, "hour":pvpc_hours, "value":pvpc_ts.values})
sb.violinplot(x="hour",y="value",data=pvpc_df)


Out[8]:
<matplotlib.axes.AxesSubplot at 0x7f24a9766d50>
/usr/lib/pymodules/python2.7/matplotlib/collections.py:548: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  if self._edgecolors == 'face':