ruby中'apply' pandas函数的语法

hc2pp10m  于 2022-11-27  发布在  Ruby
关注(0)|答案(1)|浏览(228)

我需要将一个python脚本转换成ruby,我使用gem PandasNumpy,这使得工作非常简单。
例如我有这样的台词:

# python
# DF is a dataframe from Pandas

DF['VAL'].ewm(span = vDAY).mean()
DF['VOLAT'].rolling(vDAY).std()

所以没有人问我,我就这样改变了信仰:

# ruby
df['VAL'].ewm(span: vDAY).mean
df['VOLAT'].rolling(vDAY).std

别紧张
但是我有一个来自Pandas的函数apply,它把一个函数作为第一个参数,我真的不知道如何把它转换成ruby,它是这样的:

# python
import numpy as np

DF['VAL'].rolling(vDAY).apply(lambda x: np.polyfit(range(len(x)), x, 1)[0])
# output=> NaN or Float

我试图这样分解lambda:

# ruby
polyfit = ->(x) { t = Numpy.polyfit((0...x.size).to_a, x, 1); t[0] }

puts polyfit.call(<insert Array argument>) 
#=> I have a satisfying output for my lambda

# but...
df['VAL'].rolling(vDAY).apply(&polyfit)
# output=> `apply': <class 'TypeError'>: must be real number, not NoneType (PyCall::PyError)

# or
df['VAL'].rolling(vDAY).apply{ |x| polyfit.call(x) }
# output=> `apply': <class 'TypeError'>: apply() missing 1 required positional argument: 'func' (PyCall::PyError)

# or
df['VAL'].rolling(vDAY).apply(polyfit)
#output=> `apply': <class 'TypeError'>: must be real number, not NoneType (PyCall::PyError)

# or
df['VAL'].rolling(vDAY).apply(:polyfit)
# output=> `apply': <class 'TypeError'>: 'str' object is not callable (PyCall::PyError)

很明显,它不起作用。问题是python内联语法中的“x”参数,我真的不知道如何以“ruby方式”获取它。
如果有人能把这个apply函数从python语法“翻译”成ruby,那就太好了:)
我只是想指出,我是一个ruby/rails开发人员,从专业Angular 讲,我对python并不了解。
最新消息:
好吧,这完全是对python代码的误解:apply需要一个函数参数作为一个可调用的对象,所以在ruby中它不是一个lambda,而是一个我需要的Proc。
所以对于那些遇到同样问题的人的解决办法是:

# ruby
polyfit = Proc.new { t = Numpy.polyfit((0...x.size).to_a, x, 1); t[0] }
df['VAL'].rolling(vDAY).apply(polyfit)
4dc9hkyq

4dc9hkyq1#

如果有人能将这个apply函数从python语法“翻译”为ruby,那就太好了。
等效得Ruby语法为:

DF['VAL'].rolling(vDAY).apply(-> x { np.polyfit(range(len(x)), x, 1)[0] })

相关问题