Этот вопрос является более сложным, чем он впервые появился. В итоге я использовал numba jit для компиляции функции генератора для вычисления экспоненциальных сумм. Мой конечный результат вычисляет экспоненциальную сумму в 5 миллионов строк за секунду на моем компьютере, который, надеюсь, будет достаточно быстрым для ваших нужд.
# Initial dataframe.
df = pd.DataFrame({'time': [1, 2.1, 2.13, 3.7, 10, 10.2],
'A': [1, 3, -1, 7, 2, 1]})
# Initial decay parameter.
decay_constant = 1
Мы можем определить весовые коэффициенты затухания, как ехр (-time_delta * decay_constant), и установить его начальное значение, равное одному:
df['weight'] = np.exp(-df.time.diff() * decay_constant)
df.weight.iat[0] = 1
>>> df
A time weight
0 1 1.00 1.000000
1 3 2.10 0.332871
2 -1 2.13 0.970446
3 7 3.70 0.208045
4 2 10.00 0.001836
5 1 10.20 0.818731
Теперь мы будем использовать JIT от numba оптимизировать генератор функция, которая вычисляет тригонометрические суммы:
from numba import jit
@jit(nopython=True)
def exponential_sum(A, k):
total = A[0]
yield total
for i in xrange(1, len(A)): # Use range in Python 3.
total = total * k[i] + A[i]
yield total
Мы будем использовать генератор для добавления значения в dataframe:
df['expSum'] = list(exponential_sum(df.A.values, df.weight.values))
Которая производит желаемый результат:
>>> df
A time weight expSum
0 1 1.00 1.000000 1.000000
1 3 2.10 0.332871 3.332871
2 -1 2.13 0.970446 2.234370
3 7 3.70 0.208045 7.464850
4 2 10.00 0.001836 2.013708
5 1 10.20 0.818731 2.648684
Так давайте масштаб до 5 миллионов строк и проверить производительность:
df = pd.DataFrame({'time': np.random.rand(5e6).cumsum(), 'A': np.random.randint(1, 10, 5e6)})
df['weight'] = np.exp(-df.time.diff() * decay_constant)
df.weight.iat[0] = 1
%%timeit -n 10
df['expSum'] = list(exponential_sum(df.A.values, df.weight.values))
10 loops, best of 3: 726 ms per loop
вы можете RESAMPLE ваш dataframe так, чтобы она равномерно? – maxymoo
@Alexander Я спрашиваю о суммах, а не в среднем, хотя, возможно, есть очевидное преобразование –
@Alexander Я только что прочитал этот вопрос более тщательно, и я не думаю, что он обращается к моему вопросу, а именно к векторизованному вычислению numpy/pandas , У меня нет проблем с вычислением экспоненциальных сумм в цикле python, я просто делаю это на достаточно больших кадрах, которые могут векторизовать вычисления. –