Я пытался решить это через закрытие. Я опубликую эталонные тесты на некоторых данных, как только я завершу разработку кода. На данный момент у меня есть следующий игрушечный пример, который, кажется, работает: поскольку методы применения dask dataframe, похоже, сохраняют порядок строк.
import numpy as np
import pandas as pd
import dask.dataframe as dd
number_of_components = 30
df = pd.DataFrame(np.random.randint(0,number_of_components,size=(number_of_components, 2)), columns=list('AB'))
my_data_frame = dd.from_pandas(df, npartitions = 1 )
def sumPrevious( previousState ) :
def getValue(row):
nonlocal previousState
something = row['A'] - previousState
previousState = row['A']
return something
return getValue
given_func = sumPrevious(1 )
out = my_data_frame.apply(given_func, axis = 1 , meta = float)
df['computed'] = out.compute()
Теперь плохие новости, я попытался абстрагировать их, передавая состояние вокруг и используя скользящее окно любой ширины, через эту новую функцию:
def generalised_coupled_computation(previous_state , coupled_computation, previous_state_update) :
def inner_function(actual_state):
nonlocal previous_state
actual_value = coupled_computation(actual_state , previous_state )
previous_state = previous_state_update(actual_state, previous_state)
return actual_value
return inner_function
Предположим, мы инициализируем функцию с помощью:
init_state = df.loc[0]
coupled_computation = lambda act,prev : act['A'] - prev['A']
new_update = lambda act, prev : act
given_func3 = generalised_coupled_computation(init_state , coupled_computation, new_update )
out3 = my_data_frame.apply(given_func3, axis = 1 , meta = float)
Попробуйте запустить его и будьте готовы к неожиданностям: первый элемент неправильный, возможно, некоторые проблемы с указателем, учитывая странный результат. Любое понимание?
Так или иначе, если кто-то передает примитивные типы, он, кажется, функционирует.
Обновление:
решение в использовании копии:
import copy as copy
def new_update(act, previous):
return copy.copy(act)
Теперь функции ведут себя как положено; конечно, необходимо адаптировать обновления функций и функцию связанных вычислений, если требуется более связанная логика