Estoy buscando una forma rápida de reconstruir el libro de órdenes en el momento de la creación de cada nueva orden limitada.
Los datos que tengo son de creación y finalización de pedidos:
OrderID
hora_de_creación
tiempo_completado
precio
a
1
2
10
b
1
6
11
c
3
8
9
d
4
5
8
e
9
10
7
(Aquí se puede ignorar el volumen). Me gustaría averiguar rápidamente las órdenes existentes en el libro de órdenes al crearse cada nueva orden, y calcular los parámetros de distribución en base a ellos.
Por ejemplo, para el OrderID d, primero averiguaría que sólo las órdenes b y c están todavía en el libro de órdenes, porque en el momento de la creación de la orden d (t=4), a se ha llenado, b y c se han creado pero no se han llenado, y e todavía no se ha creado.
A partir de ahí, calcularía los parámetros de la distribución, como la media, la mediana, los percentiles, etc. En el caso de la orden d, el precio medio de las órdenes pendientes sería (11 + 9) / 2 = 10.
La forma más sencilla que se me ocurre es crear una función que filtre los datos de los pedidos no cumplidos y luego extraiga los parámetros de distribución. Esta función se aplicaría entonces de forma iterativa a cada fila del marco de datos. Por ejemplo:
def get_params(ser):
unfilled_orders = df[(df['time_created'] < ser['time_created']) & (df['time_completed'] > ser['time_created'])]
mean = unfilled_orders['price'].mean()
25perc = unfilled_orders['price'].quantile(0.25)
return pd.Series([mean, 25perc])
df.apply(get_params, axis=1)
Sin embargo, el problema de esta implementación es que es demasiado lenta. El resultado de cada fila está muy relacionado con los resultados de la fila anterior, pero esta implementación no lo aprovecha. Estoy pensando si hay una solución más rápida, quizás una solución basada en una ventana rodante (si consideramos irrelevantes los pedidos demasiado antiguos) o expansiva. Gracias.