SAS9

Emparejamiento de datos en una ventana de tiempo deslizante

Simon 4 Aufrufe

Uno de los desafíos clásicos en la manipulación de datos (Data Management) es cruzar dos tablas no por una igualdad estricta, sino por una ventana de tiempo relativa.

El escenario típico es el siguiente: usted tiene una tabla de referencia que contiene fechas de eventos clave (ej: fecha de balance, fecha de campaña de marketing) y una segunda tabla que contiene un historial de transacciones. El objetivo es recuperar, para cada evento clave, todas las transacciones que tuvieron lugar en los 12 meses anteriores.

A diferencia de una fusión clásica (MERGE) que exige claves idénticas, este problema requiere una unión de desigualdad.

El Escenario

Tomemos dos conjuntos de datos para ilustrar la problemática:

  1. Tabla de Referencia (HAVE_BASE) : Contiene las empresas y sus fechas pivote. Tenga en cuenta que la empresa 'A' aparece dos veces con dos fechas diferentes.

  2. Tabla de Eventos (HAVE_EVENT) : Contiene el historial de resultados financieros (EPS) por empresa en diversas fechas.

El objetivo es extraer las líneas de la tabla EVENT donde la fecha está comprendida entre [Fecha de Referencia - 12 meses] y [Fecha de Referencia].

Preparación de los datos

Dado que las fechas a menudo se importan como cadenas de caracteres (ej: "199701"), el primer paso crítico es convertirlas a fechas SAS© numéricas verdaderas para permitir los cálculos aritméticos.

1DATA have_base;
2 INPUT company $ _date :$6. profit;
3 /* Conversion de 'YYYYMM' en date SAS (1er du mois) */
4 date = INPUT(_date !! '01', yymmdd8.);
5 FORMAT date monyy6.;
6 drop _date;
7 DATALINES;
8a 199701 5
9a 199606 9
10b 201404 6
11f 200004 78
12;
13RUN;
14 
15/* Même traitement pour la table historique */
16DATA have_event;
17 INPUT company $ _date :$6. EPS;
18 date = INPUT(_date !! '01', yymmdd8.);
19 FORMAT date monyy6.;
20 drop _date;
21 /* ... données ... */
22RUN;

¿Por qué el paso DATA (Merge) no es adecuado?

Un intento intuitivo sería utilizar el paso DATA con una instrucción MERGE. Sin embargo, MERGE empareja las líneas secuencialmente basándose en una igualdad estricta de las variables BY.

Si intenta filtrar con condiciones como if date >= intnx('month', date_b, -12), esto a menudo fallará en los casos "Muchos a Muchos" (varias fechas de referencia para la misma empresa) porque el puntero de lectura de SAS© no puede "retroceder" para volver a probar las líneas históricas para la segunda fecha de referencia.

La Solución Óptima: PROC SQL

El lenguaje SQL es perfecto para este caso porque genera un producto cartesiano sobre la clave de unión (company), luego filtra los resultados según la ventana de tiempo. Esto permite que una misma línea de evento se asocie a varias fechas de referencia si las ventanas se superponen.

El Código

La función clave aquí es INTNX, que permite desplazar una fecha un número preciso de intervalos (aquí, -12 meses).

1PROC SQL;
2 create TABLE want as
3 select
4 base.company,
5 base.profit,
6 base.date as Date_Reference,
7 evt.EPS,
8 evt.date as Date_Evenement
9 from
10 have_base as base,
11 have_event as evt
12 where
13 /* 1. Jointure sur l'identifiant */
14 base.company = evt.company
15 AND
16 /* 2. Jointure sur la fenêtre temporelle :
17 La date de l'événement doit être entre (Date Ref - 12 mois) et (Date Ref) */
18 intnx('month', base.date, -12) <= evt.date <= base.date;
19QUIT;

Análisis de la cláusula WHERE

  1. base.company = evt.company : Indispensable. Sin esto, compararía las fechas de la empresa A con las de la empresa B.

  2. intnx('month', base.date, -12) : Calcula el límite inferior de la ventana (la fecha situada exactamente 12 meses antes de la fecha de referencia).

  3. El operador <= : El encuadre Límite_Inf <= Fecha_Evt <= Límite_Sup es el método más eficaz y legible para definir el intervalo.

Resultado e Interpretación

Si la empresa 'A' tiene una fecha de referencia en Enero de 1997 y otra en Junio de 1996 :

  • El SQL tratará primero Enero de 1997 : Buscará todos los eventos de 'A' entre Ene 96 y Ene 97.

  • Luego tratará Junio de 1996 : Buscará todos los eventos de 'A' entre Jun 95 y Jun 96.

  • Si un evento tiene lugar en Mayo de 1996, aparecerá dos veces en el resultado final (una vez asociado a la referencia del 97, otra vez a la del 96), lo cual es el comportamiento correcto esperado para un análisis de este tipo.

Para cruzar datos en intervalos de tiempo (ventanas deslizantes):

  • Priorice PROC SQL en el paso DATA.

  • Asegúrese de que sus fechas estén en formato numérico.

  • Utilice INTNX para calcular dinámicamente los límites de su ventana de tiempo en la cláusula WHERE.