Python Pyspark使用窗口函数和我自己的函数

Python Pyspark使用窗口函数和我自己的函数,python,pandas,pyspark,window,Python,Pandas,Pyspark,Window,我有一个熊猫的代码,可以计算出x窗口上线性回归的R2。请参阅我的代码: def lr_r2_Sklearn(data): data = np.array(data) X = pd.Series(list(range(0,len(data),1))).values.reshape(-1,1) Y = data.reshape(-1,1) regressor = LinearRegression() regressor.fit(X,Y) ret

我有一个熊猫的代码,可以计算出x窗口上线性回归的R2。请参阅我的代码:

def lr_r2_Sklearn(data):
    data = np.array(data)
    X = pd.Series(list(range(0,len(data),1))).values.reshape(-1,1)
    Y = data.reshape(-1,1)

    regressor = LinearRegression()  
    regressor.fit(X,Y)

    return(regressor.score(X,Y))

r2_rolling = df[['value']].rolling(300).agg([lr_r2_Sklearn])
我正在做一个300号的卷轴,计算每个窗口的r2。我希望做完全相同的事情,但是使用pyspark和spark数据帧。我知道我必须使用窗口功能,但它比熊猫更难理解,所以我迷路了

我有这个,但我不知道如何让它工作

w = Window().partitionBy(lit(1)).rowsBetween(-299,0)
data.select(lr_r2('value').over(w).alias('r2')).show()
(lr_r2返回r2)


谢谢

您需要一个带有约束条件的udf。这在spark3.0开发之前是不可能的。 请参阅此处的答案: 但是,您可以浏览pyspark的ml软件包: 因此,您可以定义一个模型,比如linearSVC,并在组装后将数据帧的各个部分传递给它。我建议使用一个由stage、assembler和classifier组成的管道,然后使用数据帧的各个部分,通过一些惟一的id对其进行过滤,在循环中调用它们