1 votos

¿Cómo hacer un estudio de eventos para múltiples empresas con diferentes fechas de eventos?

Hola a todos Me gustaría utilizar Python (o cualquier otro programa que funcione bien como R, Excel, etc.) para analizar el impacto de un evento. Supongamos que tengo el siguiente conjunto de datos (empresa en las columnas, fecha en las filas):

         A       B       C       D
Date1   0.11    0.21    0.31    0.41
Date2   0.12    0.22    0.32    0.42
Date3   0.13    0.23    0.33    0.43
Date4   0.14    0.24    0.34    0.44
Date5   0.15    0.25    0.35    0.45
Date6   0.16    0.26    0.36    0.46
Date7   0.17    0.27    0.37    0.47
Date8   0.18    0.28    0.38    0.48

Supongamos que quiero seleccionar un intervalo de elementos en función de los valores de la lista, como por ejemplo de esta matriz:

A   Date2   Date5
B   Date3   Date6
C   Date4   Date7
D   Date5   Date8

Es decir, de la empresa A Quiero seleccionar los valores de Date2 hasta Date5 (que son: 0.12 , 0.13 , 0.14 y 0.15 ); de la empresa B Quiero seleccionar los valores de Date3 hasta Date6 (que son: 0.23 , 0.24 , 0.25 y 0.26 ) y así sucesivamente. Observe que los rangos de fechas siempre tendrán la misma longitud.

Por lo tanto, me gustaría obtener este nuevo conjunto de datos:

 A       B       C       D
0.12    0.23    0.34    0.45
0.13    0.24    0.35    0.46
0.14    0.25    0.36    0.47
0.15    0.26    0.37    0.48

¿Cómo puedo conseguirlo? Me disculpo si no proporciono alguna parte del código Python pero no tengo idea de cómo hacerlo, lo intenté con VBS pero combiné el uso de macros con correcciones a mano...

Sólo tengo una idea: estaba pensando en crear un vector para cada columna que asuma el valor de 1 en correspondencia con el rango de fechas y 0 de lo contrario, es decir:

        A       B       C       D
Date1   0       0       0       0
Date2   1       0       0       0
Date3   1       1       0       0
Date4   1       1       1       0
Date5   1       1       1       1
Date6   0       1       1       1
Date7   0       0       1       1
Date8   0       0       0       1

y luego multiplicando este nuevo conjunto de datos con el anterior obtendríamos:

        A       B       C       D
Date1   0       0       0       0
Date2   0.12    0       0       0
Date3   0.13    0.23    0       0
Date4   0.14    0.24    0.34    0
Date5   0.15    0.25    0.35    0.45
Date6   0       0.26    0.36    0.46
Date7   0       0       0.37    0.47
Date8   0       0       0       0.48

Como último paso deberíamos eliminar todas las "celdas" que tienen el valor de cero. No sé si esta es la forma más fácil de hacerlo y no soy capaz de hacer todo el proceso.

Gracias por su visión :)

1voto

dmuir Puntos 146

Este código de Python hará lo que le pidas. No es la forma más pitónica de lograr esto, pero lo dejé así porque pensé que tendría sentido si no estás muy familiarizado con Python. Utilizo Pandas para lograr esto porque el .shift() lo hace fácil, pero podrías hacer esto en Numpy o en Python puro igualmente.

Construí el DataFrame a mano a partir de tu pregunta y utilicé fechas para el índice que convertí en objetos datetime de pandas utilizando .to_datetime() porque asumo que tendrás tipos de datos similares cuando realmente trabajes en esto. Probablemente querrá construir el DataFrame programáticamente, pero eso está fuera del alcance de su pregunta.

import pandas as pd

dates = ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
         '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08']

df = pd.DataFrame({'A': [.11, .12, .13, .14, .15, .16, .17, .18],
                   'B': [.21, .22, .23, .24, .25, .26, .27, .28],
                   'C': [.31, .32, .33, .34, .35, .36, .37, .38],
                   'D': [.41, .42, .43, .44, .45, .46, .47, .48]},
                  index=pd.to_datetime(dates))

result = pd.DataFrame(index=df.index)
i = 1
for col in df.columns:
    result[col] = df[col].iloc[i:i+4]
    result[col] = result[col].shift(-i)
    i += 1

result.reset_index(level=None, inplace=True)
result.drop('index', axis=1, inplace=True)
result.dropna(inplace=True)

print(result)

El anterior script devuelve esto:

      A     B     C     D
0  0.12  0.23  0.34  0.45
1  0.13  0.24  0.35  0.46
2  0.14  0.25  0.36  0.47
3  0.15  0.26  0.37  0.48

0 votos

Muchas gracias por su respuesta. ¿Cómo puedo aplicar esto si las fechas no son consecutivas? Por ejemplo si Fecha 1 = 05/04/2018 y Fecha 2 = 08/04/2018?

0 votos

No necesitas usar el índice en absoluto. El bucle no lo necesita y su salida deseada no lo necesita. Solo lo incluí porque asumí que tendrías fechas con las que trabajar. Simplemente no incluya index=pd.to_datetime() al construir el marco de datos y los índices serán simplemente enteros, por lo que no importará si son consecutivos o no.

0 votos

Gracias por tu respuesta pero me temo que me he expresado mal. Tengo las fechas para trabajar, tengo una serie temporal (fechas en orden ascendente) pero a veces el dato siguiente se refiere a una fecha NO inmediatamente posterior. Un ejemplo, para explicarme mejor: si tengo el dato del 8 de enero de 2021, puede ocurrir que el siguiente dato disponible sea el 11 de enero de 2021 (por días no laborables). Entonces, ¿lo que has escrito en el comentario anterior sigue siendo válido?

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X