close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 14 years ago

Closed 14 years ago

Last modified 14 years ago

#1281 closed doubt (fixed)

Pasar series diarias a horarias

Reported by: Lander Ibarra Iriondo Owned by: Víctor de Buen Remiro
Priority: normal Milestone: Mantainance
Component: TimeAlgebra Version: head
Severity: normal Keywords:
Cc:

Description (last modified by Víctor de Buen Remiro)

Buenos días, en el piloto en el que me encuentro trabajando estoy en la siguiente situación:
Tengo 24 series en Diario que hacen referencia a una hora de día y
quiero pasar cada una de ellas a la serie horaria con el dato en la hora correspondiente en el fechado horario. Ya lo estoy haciendo pero me parece que mi solución es un poco "engorrosa", paso a contárosla:
1.- Me creo el fechado:

TimeSet Lan_Hor = Hourly*(
 H(0)+H(1)+H(2)+H(3)+H(4)+H(5)+
 H(6)+H(7)+H(8)+H(9)+H(10)+H(11)+
 H(12)+H(13)+H(14)+H(15)+H(16)+H(17)+
 H(18)+H(19)+H(20)+H(21)+H(22)+H(23));

2.- Creo la serie indicadora, hago el fechado inverso:

Serie Ser_Ind = CalInd(Lan_Hor, Hourly); 
Serie Hora_00 = InvCh(Hora_00_Diario, Ser_Ind);
Serie Hora_01 = InvCh(Hora_01_Diario, Ser_Ind);
....
....
Serie Hora_23 = InvCh(Hora_23_Diario, Ser_Ind);

3.- Me encuentro con que todas las series están en fechado horario pero con el valor de la Serie en las 00 horas.
4.- La solución engorrosa que le he dado es aplicar un B con los retardos que obtengo del nombre de la serie y extender todas las series por la izquierda y por la derecha.
¿Se os ocurre una forma menos "engorrosa" de darle solución?

Change History (2)

comment:1 Changed 14 years ago by Víctor de Buen Remiro

Description: modified (diff)
Resolution: fixed
Status: newclosed

Yo tengo una función para separar series horarias en diarias y otra para reconstruirla horaria a partir de las componentes diarias que están suficientemente testadas. La idea es en abstracto la misma que la que propones solo que programada estructuradamente con ciclos de control en vez de manualmente:

////////////////////////////////////////////////////////////////////////////////
//Separa una serie horaria en 24 series diarias con los valores correspondientes 
//a cada hora del día
Set SeparaSerieHorariaEnDiarias(Serie horaria)
////////////////////////////////////////////////////////////////////////////////
{
  //Prefijo meramente ornamental para poner nombres a las componentes
  Text prefix = If(Name(horaria)!="",
    Name(horaria),
    "SeparaHorariaEnDiarias");
  //Fechas de cálculo
  Date f = First(horaria);
  Date l = Last(horaria);
  //División en componentes diarias por horas
  For(0,23,Serie(Real h) 
  { 
    //Se adelanta la serie horaria el número correspondienete de horas para que
    //al pasar a Diario con FirstS queden sólo los datos de esa hora
    Serie aux = SubSer(DatCh((F^h):horaria, Diario, FirstS),f,l);
    //Renombramos las series para visualizarlas mejor
    Eval(prefix+".H"<<FormatReal(h,"%02.0lf")+"=aux")
  })
};

////////////////////////////////////////////////////////////////////////////////
//Reconstruye una serie horaria a partir de un conjunto de series
//diarias con los valores correspondientes a cada hora del día
Serie ReconstruyeSerieHoraria(Set diarias.porHoras)
////////////////////////////////////////////////////////////////////////////////
{
  //Pasamos a horario cada componente diaria y la adelantamos las horas que
  //le corresponden
  Set ser.hor = For(0,23,Serie(Real h) 
  { 
    (B^h):InvCh(diarias.porHoras[h+1],CalInd(W,Horario)) 
  });
  //Fechas de cálculo
  Date f = SetMinDate(EvalSet(ser.hor,First));
  Date l = SetMaxDate(EvalSet(ser.hor,Last));
  //Variable auxiliar para completar por delante y por detrás cada componente
  Serie zero = SubSer(CalInd(W,Horario),f,l);
  //Sumamos las componentes completadas
  SetSum(For(0,23,Serie(Real h) 
  { 
    zero << ser.hor[h+1] >> zero
  }))
};

//Serie horaria original aleatoria
Serie horaria.original = SubSer(Rand(-1,1,Horario),y2011,y2011m01d04h23);

//Series diarias con los valores correspondientes a cada hora del día
Set diarias.porHoras = SeparaSerieHorariaEnDiarias(horaria.original);


//Serie horaria reconstruida
Serie horaria = ReconstruyeSerieHoraria(diarias.porHoras);

//Comprobamos que la serie reconstruida es igual que la original
Real ok = And
(
  First(horaria.original)==First(horaria),
  Last(horaria.original)==Last(horaria),
  MaxS(Abs(horaria.original-horaria))==0
);

A lo que no le veo sentido alguno es al fechado Lan_Hor puesto que es exactamete lo mismo que Hourly sólo que más lento.

comment:2 Changed 14 years ago by Víctor de Buen Remiro

Cuando las series diarias están exactamente en las mismas fechas existe una forma mucho más rápida de reconstruir la serie horaria que se basa en el paso a matrices

////////////////////////////////////////////////////////////////////////////////
//Reconstruye una serie horaria a partir de un conjunto de series diarias con 
//los valores correspondientes a cada hora del día. El método sól osirve si 
//todas las compoenentes diarias están definidas exactamente entre las mismas
//fechas
Serie ReconstruyeSerieHoraria.FechasFijas(Set diarias.porHoras)
////////////////////////////////////////////////////////////////////////////////
{
  Matrix D = Tra(SerSetMat(diarias.porHoras));
  MatSerSet(GetNumeric([[D]]),Horario,First(diarias.porHoras[1]))[1]
};

//Serie horaria reconstruida
Serie horaria.FechasFijas = ReconstruyeSerieHoraria.FechasFijas(diarias.porHoras);

//Comprobamos que la serie reconstruida es igual que la original
Real ok.FechasFijas = And
(
  First(horaria.original)==First(horaria.FechasFijas),
  Last(horaria.original)==Last(horaria.FechasFijas),
  MaxS(Abs(horaria.original-horaria.FechasFijas))==0
);

Note: See TracTickets for help on using tickets.