Начиная с кадра данных со столбцами A B D P:
import numba
import numpy as np
import pandas as pd
import vaex
d = {'A':[0,1,2,3,4,5,6],'B':[30,35,32,35,31,39,37],'D':[12,10,13,19,12,21,13],'P':[3,3,3,3,3,3,3]}
df = pd.DataFrame(data=d)
df['C'] = 0
df
Экспорт в hdf5:
df.to_csv("v_df", index=False)
df = vaex.from_csv("v_df", convert=True, chunk_size=5_000_000)
Мне нужно вычислить столбец «C» с каждой строкой с желаемым результатом следующим образом:
'C': [0, 1.666666667, 0.552380952, 2.333630952, 0.962202381, 6.38155722, 5.714890553]
Чтобы достичь этого результата, мне нужно перебрать каждую строку, начиная с row (1), и вычислить что-то вроде:
%%time
@numba.njit
def func(B, D, C, b_0=0):
n = len(B)
b = np.full(n, b_0, dtype=np.float64)
for i in range(1, n):
b[i] = ((((B[i] - B[i - 1]) / B[i - 1])) * D[i]) + C[i-1]
return b
df['C'] = func(df['B'].to_numpy(),df['D'].to_numpy(),df['C'].to_numpy())
df
Но не работает.
Это нормально для первой и второй строки:
'C': [0, 1.666666667, -1.114286, 1.781250, -1.371429, 5.419355, -0.666667]
Я пробовал «сдвиг» (предложение Сэммивемми). Он работает нормально для этого примера кадра данных перед 'vaex.from_csv', но при реализации концепции для кадра больших данных через vaex сдвиг не работает.
Итак, возникает вопрос: существует ли способ «хорошей практики» для выполнения этого вычисления (повторение результата строки в столбце «C» с учетом предыдущих строк в «C») с большим источником данных (я использую vaex импортировать из 1 миллиона строк csv)?
Заранее спасибо.
df.B.shift(-1).sub(df.B).div(df.B).mul(df.D.shift(-1)).cumsum().shift(fill_value=0)
- person sammywemmy   schedule 12.04.2021shift
- person sammywemmy   schedule 12.04.2021