Estoy tratando de lograr un cálculo que involucre progresión geométrica (división). ¿Hay alguna forma efectiva/eficiente de hacerlo? El conjunto de datos tiene millones de filas. Necesito la columna "Traded_quantity"
| Marcador | Acción | cantidad_negociada | ||
|---|---|---|---|---|
| 2019-11-05 | 09:25 | 0 | 0 | |
| 09:35 | 2 | COMPRAR | 3 | |
| 09:45 | 0 | 0 | ||
| 09:55 | 1 | COMPRAR | 4 | |
| 10:05 | 0 | 0 | ||
| 10:15 | 3 | COMPRAR | 56 | |
| 10:24 | 6 | COMPRAR | 8128 |
tortuga = 2 (Definido por el usuario)
base_quantity = 1 (definido por el usuario)
def turtle_split(row): if row['Action'] == 'BUY': return base_quantity * (turtle ** row['Marker'] - 1) // (turtle - 1) else: return 0 df['Traded_quantity'] = df.apply(turtle_split, axis=1).round(0).astype(int)Para la fila 0, Traded_quantity debe ser cero (porque el marcador es cero)
Para la primera fila, la cantidad negociada debe ser (1x1) + (1x2) = 3 (el marcador 2 se dividirá en 1 y 1, el primero 1 se multiplicará con la cantidad base>>1x1, el segundo 1 se multiplicará con el resultado del primer 1 veces tortuga>>1x2), luego hacemos una suma de estos dos números)
Para la segunda fila, Traded_quantity debe ser cero (porque el marcador es cero)
Para la 3.ª fila, la cantidad negociada debe ser (2x2) = 4 (el marcador 1 se multiplicará con la última división de la tortuga de tiempo de la fila 1, es decir, 2x2)
Para la cuarta fila, Traded_quantity debe ser cero (porque el marcador es cero)
Para la quinta fila, la cantidad negociada debe ser (4x2)+(4x2x2)+(4x2x2x2) = 56 (el marcador 3 se dividirá en 1, 1 y 1, el primero 1 se multiplicará con la última división de la fila 3 por la tortuga >> 4x2, El segundo 1 se multiplicará con el resultado del primer 1 con tortuga>>8x2), el tercer 1 se multiplicará con el resultado del segundo 1 con tortuga>>16x2) luego hacemos una suma de estos tres números)
Para la sexta fila, la cantidad negociada debe ser (32x2)+(32x2x2)+(32x2x2x2)+(32x2x2x2x2)+(32x2x2x2x2x2) = 8128
Siempre que haya una COMPRA, la cantidad negociada se calculará utilizando el último lote de Traded_quantity multiplicado por tortuga.
Resulta que el código está generando Traded_quantity correcto cuando no hay cero en Marker. Una vez que haya una brecha con un par de ceros, la progresión geométrica no ayudará, necesitaría la figura anterior (de Cache) para volver a calcular Traded_q. probé con lru_cache para la recursividad, no funcionó.
Esto debería funcionar
def turtle_split(row): global base_quantity if row['Action'] == 'BUY': summation = base_quantity * (turtle ** row['Marker'] - 1) // (turtle - 1) base_quantity = base_quantity * (turtle ** (row['Marker'] - 1))*turtle return summation else: return 0