パンダを使って計算できます
- を使用した単純移動平均SMA
pandas.stats.moments.rolling_mean
- を使用した指数移動平均EMA
pandas.stats.moments.ewma
しかし、ウィキペディアhttp://en.wikipedia.org/wiki/Exponential_smoothing ...で説明されているように、パンダを使用して加重移動平均(WMA)を計算するにはどうすればよいですか?
WMAを計算するパンダ関数はありますか?
パンダを使って計算できます
pandas.stats.moments.rolling_mean
pandas.stats.moments.ewma
しかし、ウィキペディアhttp://en.wikipedia.org/wiki/Exponential_smoothing ...で説明されているように、パンダを使用して加重移動平均(WMA)を計算するにはどうすればよいですか?
WMAを計算するパンダ関数はありますか?
パンダを使用すると、次を使用して加重移動平均(wma)を計算できます
。.rolling()と.apply ()の組み合わせこれは、3つの加重とwindow=3
の例です。
data = {'colA': random.randint(1, 6, 10)}
df = pd.DataFrame(data)
weights = np.array([0.5, 0.25, 0.25])
sum_weights = np.sum(weights)
df['weighted_ma'] = (df['colA']
.rolling(window=3, center=True)
.apply(lambda x: np.sum(weights*x) / sum_weights, raw=False)
)
.rolling()
私は引数を使用していることに注意してくださいcenter=True
。
これがユースケースに当てはまるかどうか、または必要かどうかを確認する必要がありcenter=False
ます。
いいえ、その正確なアルゴリズムの実装はありません。ここでそれに関するGitHubの問題を作成しました:
https://github.com/pydata/pandas/issues/886
私はこれについてプルリクエストを喜んで受けます-実装は単純なCythonコーディングであり、に統合することができますpandas.stats.moments
data
がPandasDataFrameまたはSeriesであり、行のWMAを計算する場合は、次を使用して計算できます。
wma = data[::-1].cumsum().sum() * 2 / data.shape[0] / (data.shape[0] + 1)
ウィンドウの長さのローリングWMAが必要な場合はn
、
data.rolling(n).apply(lambda x: x[::-1].cumsum().sum() * 2 / n / (n + 1))
としてn = x.shape[0]
。このソリューションは、Sander van den Oordによるソリューションよりも少し遅い可能性がありますが、重みについて心配する必要はありません。
重みを使用してカーネルを構築し、を使用してシリーズに適用しますnumpy.convolve
。
import pandas as pd
import numpy as np
def wma(arr, period):
kernel = np.arange(period, 0, -1)
kernel = np.concatenate([np.zeros(period - 1), kernel / kernel.sum()])
return np.convolve(arr, kernel, 'same')
df = pd.DataFrame({'value':np.arange(11)})
df['wma'] = wma(df['value'], 4)
ここで私はこのページに従ってWMAを解釈しています:https://en.wikipedia.org/wiki/Moving_average
このタイプのWMAの場合、重みはn値の線形範囲であり、合計で1.0になります。
カーネルの前面をゼロで埋めていることに注意してください。これは、時系列の「future」値が移動平均に影響を与えないように、「片側」ウィンドウ関数が必要なためです。
numpy.convolve
とは異なり、高速apply()
です!numpy.correlate
カーネルを逆にする場合にも使用できます。