我正在考虑使用具有当前状态的闭包来计算滚动窗口(在我的情况下为宽度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是用于测试的伪函数。因此,函数可以通过actual_fcn = test(0);
进行初始化,例如,我们假设初始值为零。最后,可以通过ddf.apply使用功能(其中ddf是实际的dask数据帧)。
最后一个问题:如果保留计算顺序,这将起作用,否则所有内容将被打乱。我尚未对其进行测试,因为-即使它通过了-我也不能100%确信它将始终保留该订单。因此,问题是:
dask数据框的apply方法是否保留行顺序?
还有其他想法吗?任何帮助表示高度赞赏。
答案 0 :(得分:0)
显然是。我正在使用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()
表现符合预期。有一个很大的警告:如果以前的状态是通过引用提供的(即:它是某个类的某个对象),则用户应谨慎使用嵌套函数内部的相等性来更新以前的状态:因为它将产生副作用,如果状态通过引用传递。
严格地说,此示例不能证明在任何情况下都可以保留订单;所以我仍然会对我是否可以依靠这个假设感兴趣。