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

KRSW

駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

役に立ったらシェアしてくれると励みになります。
If you felt this article is useful, please share.
にほんブログ村 IT技術ブログへ

-Python, 開発
-,

Translate »
Social media & sharing icons powered by UltimatelySocial

Copyright© ITips , 2020 All Rights Reserved.