Electricity.DemandPrice es un programa que muestra como analizar
y visualizar con Tol (Time Oriented Languaje) series temporales públicas de
demanda eléctrica y de precios de la electricidad en fechados, TimeSet,
de frecuencia horaria, Horario, y diaria, Diario.
Este programa lee los datos desde ficheros Tol de formato Bdt que están
guardados en un directorio llamado data:
a) un fichero para la demanda horaria (fichero demandahorario.bdt),
b) otro fichero para los precios hora a hora (fichero preciohorario.bdt) y
c) finalmente, otro fichero que contiene la demanda agregada por días y
los precios medios diarios (fichero datadiario.bdt).
El programa Electricity.DemandPrice
se ejecuta de forma lineal como una secuencia de declaraciones de series
temporales, polinomios, conjuntos temporales y valores reales,
en el que no se declaran funciones Tol.
Todo el programa está en un solo fichero Tol que como visualiza gráficos de
series temporales para algunos de sus resultados,
lo ideal es que se ejecute con Tolbase 1.1.5 o Tolbase 2.0.1,
que son, respectivamente, los entornos de desarrollo integrado
(IDE, integrated development environment) de Tol 1.1.5 y Tol 2.0.1.
Este programa realiza las siguientes clases de acciones:
a) Asume definidos los 2 conjuntos temporales (TimeSet, fechados)
Horario y Diario y con ellos lee, mediante la función IncludeBdt(),
datos de demanda y precios en el sector eléctrico del directorio llamado
data.
b) A partir de dichos datos realiza un conjunto de operaciones con series
temporales y polinomios de tiempo mientras que visualiza los resultados
paso a paso.
c) Finalmente compara los datos por días de la semana (lunes, martes,
miércoles, jueves, viernes, sábado y domingo) y analiza el
comportamiento de las series temporales durante la Semana Santa.
Electricity.DemandPrice análisis de series de tiempo de demanda y precios del mercado eléctrico
Inclusiones
Set incDemHorSet incPreHorSet incBdtDiaProceso
Polyn PolynB012Serie PreMov012Set SubDemPreSet DemH2DSerie FacHorOctSet LogSqrPotSet Dif1_BSet DemPorMesSet DemTrendSet DiaSemSet ViePreSet DemSem//////////////////////////////////////////////////////////////////////////////
Set incDemHor = Include("data/demandahorario.bdt");
//////////////////////////////////////////////////////////////////////////////
PutDescription("Lectura de datos de demanda hora a hora.",incDemHor);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(DemandaH), "./001demandah.gif"), Empty);

//////////////////////////////////////////////////////////////////////////////
Set incPreHor = Include("data/preciohorario.bdt");
//////////////////////////////////////////////////////////////////////////////
PutDescription("Lectura de datos de precios hora a hora.",incPreHor);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(PrecioH), "./002precioh.gif"), Empty);

//////////////////////////////////////////////////////////////////////////////
Set incBdtDia = Include("data/datadiario.bdt"); //
//////////////////////////////////////////////////////////////////////////////
PutDescription("Lectura de demanda y precios diarios.",incBdtDia);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(DemandaD,
PrecioD), "./003dempredia.gif"), Empty);

//////////////////////////////////////////////////////////////////////////////
Polyn PolynB012 = 1+B+B^2+B^3 +B^4 +B^5+B^6+B^7+B^8+B^9+B^10+B^11;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Polinomio backguard de 12 terminos.",PolynB012);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Serie PreMov012 = (PolynB012:PrecioH) / 12;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Media movil del precio de 12 horas.",PolynB012);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(PrecioH,
PreMov012), "./004premedmov12h.gif"), Empty);

//////////////////////////////////////////////////////////////////////////////
Set SubDemPre =
{
Date demandIni = First(DemandaH); // Primer dato de la demanda horaria
Date demandSuc = Succ(demandIni, C, 2); // 2 dias despues
Serie demandSub = SubSer(DemandaH, demandIni, demandSuc);
Serie precioSub = SubSer(PrecioH, demandIni, demandSuc);
Set If(FALSE, Chart(SetOfSerie(demandSub, precioSub),
"./005subdempre.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Subseries de 2 dias de demanda y precio.",SubDemPre);
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Set DemH2D =
{
Serie demTotDia = DatCh(DemandaH, Diario, SumS); // Demanda total por dia
Serie demMedDia = DatCh(DemandaH, Diario, AvrS); // Demanda media por dia
Serie demMaxDia = DatCh(DemandaH, Diario, MaxS); // Demanda maxima
Serie demMinDia = DatCh(DemandaH, Diario, MinS); // Demanda minima
Set If(FALSE, Chart(SetOfSerie(demMedDia,demMaxDia,demMinDia),
"./006demmedmaxmin.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Demandas diarias a partir de horarias.",DemH2D);
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Serie FacHorOct = PrecioH * DemandaH;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Facturacion del mes de octubre.
La serie de precios esta para el mes de octubre.
La serie de demanda para noviembre y octubre.
Por tanto, el producto, facturacion, solo se calcula para octubre",
FacHorOct);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(FacHorOct), "c./007fachoroct.gif"), Empty);

//////////////////////////////////////////////////////////////////////////////
Set LogSqrPot =
{
Serie facLog = Log(FacHorOct)*10; // Logaritmo de la facturacion x 10
Serie demSqr = SqRt(DemandaH); // Raiz cuadrada de la demanda horaria
Serie prePot = PrecioH^2.5; // Potencia 2.5 del precio
Set If(FALSE, Chart(SetOfSerie(facLog,demSqr,prePot),
"./008logsqrpot.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Logaritmo, raiz cuadrada y potencia.",LogSqrPot);
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Set Dif1_B =
{
Serie demHor10d = SubSer(DemandaH, First(DemandaH), y2001m10d10h23);
Serie preHor10d = SubSer(PrecioH, First(PrecioH), y2001m10d10h23);
Real difMax = (MaxS(demHor10d)/MaxS(preHor10d))/4;
Serie demHorDif = (1-B):demHor10d; // Diferencia 1-B de la demanda
Serie preHorDif = ((1-B):preHor10d)*difMax; // Diferencia 1-B del precio
Set If(FALSE, Chart(SetOfSerie(demHorDif,preHorDif),
"./009diferencias.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Diferencia 1-B de la demanda y del precio.",Dif1_B);
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Set DemPorMes =
{
Serie demMen = DatCh(DemandaD, Mensual, SumS); // Demanda Mensual
Serie demMe1998 = (B^24):SubSer(demMen, y1998m01, y1998m12); // 1998 -> 2000
Serie demMe1999 = (B^12):SubSer(demMen, y1999m01, y1999m12); // 1999 -> 2000
Serie demMe2000 = SubSer(demMen, y2000m01, y2000m12); // 2000
Serie demMe2001 = (F^12):SubSer(demMen, y2001m01, y2001m11); // 2001 -> 2000
Set If(TRUE, Chart(SetOfSerie(demMe1998,demMe1999,demMe2000,demMe2001),
"./010demandasmensuales.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Demandas mensuales por años reunidas en el 2000.",DemPorMes);
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Set DemTrend =
{
Serie demAgrDia = SubSer(DifEq(1/(1-B), DemandaD/1000000, CalInd(W,Diario)),
First(DemandaD),Last(DemandaD));
Serie tre1998 = Trend(First(DemandaD),Diario);
Serie demMed98 = demAgrDia / tre1998;
Serie demMedDiv = demMed98*1000;
Set If(FALSE, Chart(SetOfSerie(demAgrDia, tre1998, demMedDiv),
"./011demandatendencia.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Tendencia de la demanda.",DemTrend);
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Set DiaSem =
{
Serie preLun = DatCh( PrecioD, WD(1), FirstS); // Lunes
Serie preMar = DatCh( F:PrecioD, WD(1), FirstS); // Martes
Serie preMie = DatCh((F^2):PrecioD, WD(1), FirstS); // Miercoles
Serie preJue = DatCh((F^3):PrecioD, WD(1), FirstS); // Jueves
Serie preVie = DatCh((F^4):PrecioD, WD(1), FirstS); // Viernes
Serie preSab = DatCh((F^5):PrecioD, WD(1), FirstS); // Sabado
Serie preDom = DatCh((F^6):PrecioD, WD(1), FirstS); // Domingo
Set If(FALSE, Chart(SetOfSerie(preLun,preMar,preMie,
preJue,preVie,preSab,preDom),
"./012preciodiassemana.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Precios por dias de la semana.",DiaSem);
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Set ViePre =
{
Serie vieDem = DatCh(DemandaD/1000000, WD(5), FirstS); // Demanda viernes
TimeSet viSTms = Succ(Easter,-2); // Los Viernes Santos
Serie viSSer = (CalInd(viSTms, WD(5))*.15)+.5;
TimeSet viUTms = Succ(M(1)*D(1),-1, WD(5)); // Ultimos viernes del año
Serie viUSer = (CalInd(viUTms, WD(5))*.25)+.5;
TimeSet viATms = Succ(M(8)*D(18),-1, WD(5)); // Viernes central agosto
Serie viASer = (CalInd(viATms, WD(5))*.35)+.5;
Set If(FALSE, Chart(SetOfSerie(vieDem, viSSer, viUSer, viASer),
"./013viernessanto.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Precios del Viernes Santo y otros viernes.",ViePre);
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Set DemSem =
{
Serie demSemSum = DatCh(DemandaD, WD(1), SumS); // suma en semanal
Serie demSemAvg = DatCh(DemandaD, WD(1), AvrS); // media semanal
Set If(TRUE, Chart(SetOfSerie(demSemSum, demSemAvg),
"x./014demandasemanal.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Demanda semanal acumulada y media diaria.",DemSem);
//////////////////////////////////////////////////////////////////////////////

Text WriteLn("\nElectricity.DemandPrice make: end");
//////////////////////////////////////////////////////////////////////////////
// FILE : make.tol
// AUTHOR : http://www.asolver.com
// CLASS : Series; Chart
// VERSION : Tolbase 1.1.5; Tolbase 2.0.1
// PURPOSE : Electricity.DemandPrice es un programa que muestra como analizar
// y visualizar con Tol (Time Oriented Languaje) series temporales públicas de
// demanda eléctrica y de precios de la electricidad en fechados, TimeSet,
// de frecuencia horaria, Horario, y diaria, Diario.
//
// Este programa lee los datos desde ficheros Tol de formato Bdt que están
// guardados en un directorio llamado data:
// a) un fichero para la demanda horaria (fichero demandahorario.bdt),
// b) otro fichero para los precios hora a hora (fichero preciohorario.bdt) y
// c) finalmente, otro fichero que contiene la demanda agregada por días y
// los precios medios diarios (fichero datadiario.bdt).
// _
// El programa Electricity.DemandPrice
// se ejecuta de forma lineal como una secuencia de declaraciones de series
// temporales, polinomios, conjuntos temporales y valores reales,
// en el que no se declaran funciones Tol.
//
// Todo el programa está en un solo fichero Tol que como visualiza gráficos de
// series temporales para algunos de sus resultados,
// lo ideal es que se ejecute con Tolbase 1.1.5 o Tolbase 2.0.1,
// que son, respectivamente, los entornos de desarrollo integrado
// (IDE, integrated development environment) de Tol 1.1.5 y Tol 2.0.1.
// _
// Este programa realiza las siguientes clases de acciones:
// a) Asume definidos los 2 conjuntos temporales (TimeSet, fechados)
// Horario y Diario y con ellos lee, mediante la función IncludeBdt(),
// datos de demanda y precios en el sector eléctrico del directorio llamado
// data.
// b) A partir de dichos datos realiza un conjunto de operaciones con series
// temporales y polinomios de tiempo mientras que visualiza los resultados
// paso a paso.
// c) Finalmente compara los datos por días de la semana (lunes, martes,
// miércoles, jueves, viernes, sábado y domingo) y analiza el
// comportamiento de las series temporales durante la Semana Santa.
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// INCLUDE
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nElectricity.DemandPrice make: begin");
//////////////////////////////////////////////////////////////////////////////
Set incDemHor = Include("data/demandahorario.bdt");
//////////////////////////////////////////////////////////////////////////////
PutDescription("Lectura de datos de demanda hora a hora.",incDemHor);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(DemandaH), "./001demandah.gif"), Empty);
//////////////////////////////////////////////////////////////////////////////
Set incPreHor = Include("data/preciohorario.bdt");
//////////////////////////////////////////////////////////////////////////////
PutDescription("Lectura de datos de precios hora a hora.",incPreHor);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(PrecioH), "./002precioh.gif"), Empty);
//////////////////////////////////////////////////////////////////////////////
Set incBdtDia = Include("data/datadiario.bdt"); //
//////////////////////////////////////////////////////////////////////////////
PutDescription("Lectura de demanda y precios diarios.",incBdtDia);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(DemandaD,
PrecioD), "./003dempredia.gif"), Empty);
//////////////////////////////////////////////////////////////////////////////
// MAKE
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nElectricity.DemandPrice make: process");
//////////////////////////////////////////////////////////////////////////////
Polyn PolynB012 = 1+B+B^2+B^3 +B^4 +B^5+B^6+B^7+B^8+B^9+B^10+B^11;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Polinomio backguard de 12 terminos.",PolynB012);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Serie PreMov012 = (PolynB012:PrecioH) / 12;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Media movil del precio de 12 horas.",PolynB012);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(PrecioH,
PreMov012), "./004premedmov12h.gif"), Empty);
//////////////////////////////////////////////////////////////////////////////
Set SubDemPre =
{
Date demandIni = First(DemandaH); // Primer dato de la demanda horaria
Date demandSuc = Succ(demandIni, C, 2); // 2 dias despues
Serie demandSub = SubSer(DemandaH, demandIni, demandSuc);
Serie precioSub = SubSer(PrecioH, demandIni, demandSuc);
Set If(FALSE, Chart(SetOfSerie(demandSub, precioSub),
"./005subdempre.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Subseries de 2 dias de demanda y precio.",SubDemPre);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set DemH2D =
{
Serie demTotDia = DatCh(DemandaH, Diario, SumS); // Demanda total por dia
Serie demMedDia = DatCh(DemandaH, Diario, AvrS); // Demanda media por dia
Serie demMaxDia = DatCh(DemandaH, Diario, MaxS); // Demanda maxima
Serie demMinDia = DatCh(DemandaH, Diario, MinS); // Demanda minima
Set If(FALSE, Chart(SetOfSerie(demMedDia,demMaxDia,demMinDia),
"./006demmedmaxmin.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Demandas diarias a partir de horarias.",DemH2D);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Serie FacHorOct = PrecioH * DemandaH;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Facturacion del mes de octubre.
La serie de precios esta para el mes de octubre.
La serie de demanda para noviembre y octubre.
Por tanto, el producto, facturacion, solo se calcula para octubre",
FacHorOct);
//////////////////////////////////////////////////////////////////////////////
Set If(FALSE, Chart(SetOfSerie(FacHorOct), "c./007fachoroct.gif"), Empty);
//////////////////////////////////////////////////////////////////////////////
Set LogSqrPot =
{
Serie facLog = Log(FacHorOct)*10; // Logaritmo de la facturacion x 10
Serie demSqr = SqRt(DemandaH); // Raiz cuadrada de la demanda horaria
Serie prePot = PrecioH^2.5; // Potencia 2.5 del precio
Set If(FALSE, Chart(SetOfSerie(facLog,demSqr,prePot),
"./008logsqrpot.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Logaritmo, raiz cuadrada y potencia.",LogSqrPot);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set Dif1_B =
{
Serie demHor10d = SubSer(DemandaH, First(DemandaH), y2001m10d10h23);
Serie preHor10d = SubSer(PrecioH, First(PrecioH), y2001m10d10h23);
Real difMax = (MaxS(demHor10d)/MaxS(preHor10d))/4;
Serie demHorDif = (1-B):demHor10d; // Diferencia 1-B de la demanda
Serie preHorDif = ((1-B):preHor10d)*difMax; // Diferencia 1-B del precio
Set If(FALSE, Chart(SetOfSerie(demHorDif,preHorDif),
"./009diferencias.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Diferencia 1-B de la demanda y del precio.",Dif1_B);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set DemPorMes =
{
Serie demMen = DatCh(DemandaD, Mensual, SumS); // Demanda Mensual
Serie demMe1998 = (B^24):SubSer(demMen, y1998m01, y1998m12); // 1998 -> 2000
Serie demMe1999 = (B^12):SubSer(demMen, y1999m01, y1999m12); // 1999 -> 2000
Serie demMe2000 = SubSer(demMen, y2000m01, y2000m12); // 2000
Serie demMe2001 = (F^12):SubSer(demMen, y2001m01, y2001m11); // 2001 -> 2000
Set If(TRUE, Chart(SetOfSerie(demMe1998,demMe1999,demMe2000,demMe2001),
"./010demandasmensuales.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Demandas mensuales por años reunidas en el 2000.",DemPorMes);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set DemTrend =
{
Serie demAgrDia = SubSer(DifEq(1/(1-B), DemandaD/1000000, CalInd(W,Diario)),
First(DemandaD),Last(DemandaD));
Serie tre1998 = Trend(First(DemandaD),Diario);
Serie demMed98 = demAgrDia / tre1998;
Serie demMedDiv = demMed98*1000;
Set If(FALSE, Chart(SetOfSerie(demAgrDia, tre1998, demMedDiv),
"./011demandatendencia.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Tendencia de la demanda.",DemTrend);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set DiaSem =
{
Serie preLun = DatCh( PrecioD, WD(1), FirstS); // Lunes
Serie preMar = DatCh( F:PrecioD, WD(1), FirstS); // Martes
Serie preMie = DatCh((F^2):PrecioD, WD(1), FirstS); // Miercoles
Serie preJue = DatCh((F^3):PrecioD, WD(1), FirstS); // Jueves
Serie preVie = DatCh((F^4):PrecioD, WD(1), FirstS); // Viernes
Serie preSab = DatCh((F^5):PrecioD, WD(1), FirstS); // Sabado
Serie preDom = DatCh((F^6):PrecioD, WD(1), FirstS); // Domingo
Set If(FALSE, Chart(SetOfSerie(preLun,preMar,preMie,
preJue,preVie,preSab,preDom),
"./012preciodiassemana.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Precios por dias de la semana.",DiaSem);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set ViePre =
{
Serie vieDem = DatCh(DemandaD/1000000, WD(5), FirstS); // Demanda viernes
TimeSet viSTms = Succ(Easter,-2); // Los Viernes Santos
Serie viSSer = (CalInd(viSTms, WD(5))*.15)+.5;
TimeSet viUTms = Succ(M(1)*D(1),-1, WD(5)); // Ultimos viernes del año
Serie viUSer = (CalInd(viUTms, WD(5))*.25)+.5;
TimeSet viATms = Succ(M(8)*D(18),-1, WD(5)); // Viernes central agosto
Serie viASer = (CalInd(viATms, WD(5))*.35)+.5;
Set If(FALSE, Chart(SetOfSerie(vieDem, viSSer, viUSer, viASer),
"./013viernessanto.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Precios del Viernes Santo y otros viernes.",ViePre);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set DemSem =
{
Serie demSemSum = DatCh(DemandaD, WD(1), SumS); // suma en semanal
Serie demSemAvg = DatCh(DemandaD, WD(1), AvrS); // media semanal
Set If(TRUE, Chart(SetOfSerie(demSemSum, demSemAvg),
"x./014demandasemanal.gif"), Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Demanda semanal acumulada y media diaria.",DemSem);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// END
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nElectricity.DemandPrice make: end");
2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio