我正在考虑使用一个具有当前状态的闭包来计算滚动窗口(在我的情况下是宽度为2),以回答我自己最近提出的question。有点像:
def test(init_value):
def my_fcn(x,y):
nonlocal init_value
actual_value = (x + y) * init_value
init_value = actual_value
return init_value
return my_fcn
其中my_fcn是用于测试的虚函数。因此,例如,我们假设初始值为零时,函数可能会被初始化为tsugh actual_fcn = test(0);
。最后,可以通过ddf.apply使用该函数(其中ddf是实际的dask数据帧)。
最后一个问题:如果保留计算的顺序,这将起作用,否则一切都会被扰乱。我没有测试它,因为 - 即使它通过 - 我不能100%确定它将始终保持订单。所以,问题是:
dask dataframe的apply方法是否保留了行顺序?
还有其他想法吗?任何帮助高度赞赏。
显然是的。我正在使用dask 1.0.0。
以下代码:
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, 4)), columns=list('ABCD'))
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).compute()
表现如预期。有一个很大的警告:如果前一个状态是通过引用提供的(即:它是某个类的某个对象),那么用户应该小心在嵌套函数中使用相等来更新以前的状态:因为它会产生副作用,如果通过引用传递状态。
严格地说,这个例子并不能证明在任何情况下都保留了秩序;所以我仍然有兴趣能否依靠这个假设。