Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyspark:如何应用该函数来获取数据帧中的斜率?_Python_Numpy_Pyspark - Fatal编程技术网

Python Pyspark:如何应用该函数来获取数据帧中的斜率?

Python Pyspark:如何应用该函数来获取数据帧中的斜率?,python,numpy,pyspark,Python,Numpy,Pyspark,我有这样一个spark数据框(x和y列,每个列有6个数据点)。我希望能够通过拟合一条简单的回归线来提取斜率(基本上可以看到y的趋势,增加或减少) 我想使用此函数,但在应用到dataframe时出错。应用这个包含两个数组的函数的正确方法是什么 import numpy as np def trendline(x,y, order=1): coeffs = np.polyfit(x, y, order) slope = coeffs[-2] return float(slop

我有这样一个spark数据框(x和y列,每个列有6个数据点)。我希望能够通过拟合一条简单的回归线来提取斜率(基本上可以看到y的趋势,增加或减少)

我想使用此函数,但在应用到dataframe时出错。应用这个包含两个数组的函数的正确方法是什么

import numpy as np
def trendline(x,y, order=1):
    coeffs = np.polyfit(x, y, order)
    slope = coeffs[-2]
    return float(slope)

#example to run
x_example=[1,2,3,4,5,6]
y_example=[3.42102562348192,4.2159323917750995,3.924587540944015,4.167182871752131,4.109192066532302,4.297804458327455 ]
slope=trendline(x_example,y_example)
print(slope)  
这个函数本身的工作原理与上面的示例类似,但是我在应用到dataframe时遇到了问题,我想在dataframe中创建一个带有返回slope的新列

谢谢

我试过了,但没用

def get_slope_func(x,y, order=1):
    coeffs = np.polyfit(x, y, order)
    slope = coeffs[-2]
    return float(slope)
get_slope = pandas_udf(get_slope_func, returnType=LongType())

df.select(get_slope(col("x"), col("y"))).show()


因此,您在
get\u slope\u func
中返回一个
,在注册
自定义项时,您已将返回类型设置为
LongType()
这基本上是
SQL
中的一个
BigInt
。将返回类型设置为DoubleType()

from pyspark.sql import functions as F
from pyspark.sql.type import *
import numpy as np
def get_slope_func(x,y,order=1):
    coeffs = np.polyfit(x, y, order)
    slope = coeffs[-2]
    return float(slope)
get_slope = F.udf(get_slope_func, returnType=DoubleType())

df.select(get_slope(F.col("x"), F.col("y")).alias("slope")).show(truncate=False)
#+----------------------+
#|slope                 |
#+----------------------+
#|1.2303624369449727E-7 |
#|-3.1609849970704353E-7|
#+----------------------+

您必须通过
x=df['x']传递值。值
y=df['y']。值
其中
df
是您的数据帧。然后如果我使用
np.polyfit(x[0],y.T)
它对我有效。试一试?@NikP我试过了,出现了错误“TypeError:只能将list(而不是float)连接到list”顺便说一句,我的代码是这样的:
df_pandas=df.toPandas()x=df_pandas['x'].值y=df_pandas['y'].值np.polyfit(x[0],y.T,1)
get_slope\u func(x,y)
在哪一行出现这个错误“TypeError:只能将列表(而不是“float”)连接到列表”?@NikP np.polyfit(x[0],y.T,1)。get_slope func行也有相同的错误,因为它只是我编写的调用polyfit的函数
from pyspark.sql import functions as F
from pyspark.sql.type import *
import numpy as np
def get_slope_func(x,y,order=1):
    coeffs = np.polyfit(x, y, order)
    slope = coeffs[-2]
    return float(slope)
get_slope = F.udf(get_slope_func, returnType=DoubleType())

df.select(get_slope(F.col("x"), F.col("y")).alias("slope")).show(truncate=False)
#+----------------------+
#|slope                 |
#+----------------------+
#|1.2303624369449727E-7 |
#|-3.1609849970704353E-7|
#+----------------------+