Python 開発

pandasでrollingしたときにcolumnが重複して困った話

pandasでrollingしたときにcolumnが重複。

まるでルー語のような出だしだが、Pythonユーザーだったら1回くらいは躓いた事があるかもしれない。
今回はpandasで rolling を使う際のちょっとした注意点を記述する。


rollingって?

直近X回分のデータの平均値や最大値といった集合の一部を集計することができる窓関数の機能。
株価の例だと移動平均を取得するのに使われる。

pandas.DataFrame.rolling — pandas 0.24.0 documentation


使い方

まず集計する対象のデータを準備する。

コード1(前準備)

import pandas as pd

x = pd.DataFrame([["A",1],["B",2],["C",3],["D",4],["E",5],["F",6],["G",7]],columns=["Col1","Col2"])
print(x)
print(type(x))

表示

Col1  Col2
0    A     1
1    B     2
2    C     3
3    D     4
4    E     5
5    F     6
6    G     7
class 'pandas.core.frame.DataFrame'

そして .rolling(window=(集計する範囲)).mean() で移動平均を取得する。

コード2(移動平均)

ma = x["Col2"].rolling(window=4).mean()
print(ma)
print(type(ma))

表示

0    NaN
1    NaN
2    NaN
3    2.5
4    3.5
5    4.5
6    5.5
Name: Col2, dtype: float64
class 'pandas.core.series.Series'


[注意] 移動平均をconcatで結合するとカラム名が重複する

下のコード例のように、concatで結合するとカラム「Col2」が2個になってしまう。
ちなみに rolling で作成された移動平均は DataFrame型 ではなく Series型 なのでrenameでは対処不可。

コード3(concat結合)

x_ma = pd.concat([x,ma], axis=1)
print(x_ma)

表示

  Col1  Col2  Col2
0    A     1   NaN
1    B     2   NaN
2    C     3   NaN
3    D     4   2.5
4    E     5   3.5
5    F     6   4.5
6    G     7   5.5


移動平均を結合するなら別カラム名を定義して挿入

下のコード例のように、元となるDataFrameに別カラムを定義して挿入してしまえば別のカラム名を使って移動平均を格納できる。

コード4(別カラムに挿入)

x["ma"] = x["Col2"].rolling(window=4).mean()
print(x)

表示

  Col1  Col2   ma
0    A     1  NaN
1    B     2  NaN
2    C     3  NaN
3    D     4  2.5
4    E     5  3.5
5    F     6  4.5
6    G     7  5.5

ITipsと同じようなブログを作る方法

ブログに興味がありますか?

もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

ランキング参加中

にほんブログ村 IT技術ブログへ

他にもブログやSNSで紹介してくれると励みになります。

はてブのコメントで酷評されると泣きます(´;ω;`)

-Python, 開発
-,

© 2024 ITips