Rubyのパンダ関数の構文

概要

Python スクリプトを Ruby に変換する必要があります。そのために、作業を非常に簡単にする宝石 Pandas と Numpy を使用します。

たとえば、次のような行があります。

# 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から関数適用を持っていますが、それを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

ラムダを次のように分解してみました。

# 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 の方法」でそれを取得する方法が本当にわかりません。

誰かがこの適用関数をPython構文からRubyに「翻訳」できれば、本当に素晴らしいでしょう:)

ただ、私は Ruby/Rails 開発者であり、Python については専門的には知らないことを指摘しておきたいと思います。

アップデート:

OK、これは私の Python コードに対する完全な誤解です。apply には呼び出し可能なオブジェクトとして関数の引数が必要です。したがって、Rubyではラムダではなく、Procが必要です。

したがって、同じ問題に遭遇した人のための解決策は次のとおりです。

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

解決策

解決策は、Proc を使用することです (元の質問の「UPDATE」セクションを参照)

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