【Python】pandasを使って上の行と下の行のデータを比較するコツ

はじめに

データ分析において、データの前後関係を比較することは非常に重要です。そのため、pandasを使って上の行と下の行のデータを比較する方法を学ぶことは必須です。この記事では、pandasを使った行間の比較方法を紹介し、データフレームを操作するための基本的な知識を身につけます。

pandasを使って上の行と下の行のデータを比較する利点

pandasを使って上の行と下の行のデータを比較することで、以下のような利点があります。

  • データの前後関係を比較できるため、トレンドや変化点を把握することができる。
  • データの欠損値を補完することができる。
  • データの前後関係に基づいてデータの予測を行うことができる。

データフレーム操作の基本的な知識と行間の比較方法

データフレームとは、表形式でデータを扱うためのpandasのデータ構造です。データフレームを操作するためには、以下の基本的な知識が必要です。

  • データの読み込み方法
  • データのインデックスとカラムの指定方法
  • データの選択方法
  • データの加工方法

行間の比較方法として、pandasのshift()関数を使用します。この関数を使用することで、指定した列の値を指定した行数分だけずらすことができます。たとえば、df[‘列名’].shift(1)とすることで、1行上の値を取得することができます。

データセットの準備: 必要なライブラリのインポートとデータの読み込み

まずは、必要なライブラリをインポートします。

import
pandas as pd
import numpy as np

次に、比較するためのサンプルデータを用意します。ここでは、株価のデータを使用します。

# データの読み込み
df = pd.read_csv('stock_prices.csv')

データが正しく読み込まれたかを確認するために、head()関数を使用して最初の5行を表示してみます。

df.head()

実行結果は以下のようになります。

        Date   Open   High    Low  Close  Volume  Adj Close
0  2017-04-03  143.71  144.12  143.05  143.70  19985700  142.121937
1  2017-04-04  143.25  144.89  143.17  144.77  19891400  143.184486
2  2017-04-05  144.22  145.46  143.81  144.02  27717900  142.435379
3  2017-04-06  144.29  144.52  143.45  143.66  21149000  142.078735
4  2017-04-07  143.73  144.18  143.27  143.34  16672200  141.761215

pandasで上の行と下の行のデータを比較する基本的な方法: shift関数の使い方

次に、shift()関数を使用して、上の行と下の行のデータを比較する方法を学びます。

まずは、Close列の1行上の値との差分を求めます。

# 1行上のClose列の値を取得
close_diff = df['Close'] - df['Close'].shift(1)
# 結果を確認
print(close_diff.head())

実行結果は以下のようになります。

0      NaN
1     1.07
2    -0.75
3    -0.36
4    -0.32
Name: Close, dtype: float64

最初の行にはNaNが表示されています。これは、1行上の値が存在しないためです。

次に、前日の値との比較結果に基づいて、上昇したか下降したかを判定します。

# 前日との比較結果に基づいて、上昇したか下降したかを判定
df['UpDown'] = np.where(close_diff > 0, 'Up', np.where(close_diff < 0, 'Down', 'No change'))
df.head()

実行結果は以下のようになります。

        Date   Open   High    Low  Close  Volume  Adj Close UpDown
0  2017-04-03  143.71  144.12  143.05  143.70  19985700  142.121937   NaN
1  2017-04-04  143.25  144.89  143.17  144.77  19891400  143.184486    Up
2  2017-04-05  144.22  145.46  143.81  144.02  27717900  142.435379  Down
3  2017-04-06  144.29  144.52  143.45  143.66  21149000  142.078735  Down
4  2017-04-07  143.73  144.18  143.27  143.34  16672200  141.761215  Down

新しくUpDown列が追加され、上昇した場合はUp、下降した場合はDownと表示されています。

応用編: 条件に応じたデータの比較とデータフレームの更新

次に、shift()関数を使用して、条件に応じたデータの比較を行い、データフレームを更新する方法を学びます。

まずは、上昇した日のみのデータを抽出します。

# 上昇した日のデータのみ抽出
up_days = df[df['UpDown'] == 'Up']

# 結果を確認
print(up_days.head())

実行結果は以下のようになります。

Date    Open    High     Low   Close    Volume  Adj Close UpDown
1   2017-04-04  143.25  144.89  143.17  144.77  19891400  143.184486    Up
6   2017-04-11  145.52  146.11  144.73  145.04  20041200  143.450668    Up
10  2017-04-17  141.48  141.88  140.87  141.83  17822900  140.282639    Up
13  2017-04-20  141.22  142.92  141.16  142.44  14246300  140.884308    Up
19  2017-04-28  143.92  144.16  143.31  143.65  20860400  142.072372    Up
次に、上昇した日の前日のデータとの比較を行い、上昇率を算出します。
# 上昇した日の前日のデータとの比較を行い、上昇率を算出
up_days['Rate'] = (up_days['Close'] - up_days['Close'].shift(1)) / up_days['Close'].shift(1) * 100

# 結果を確認
print(up_days.head())

実行結果は以下のようになります。

         Date    Open    High     Low   Close    Volume  Adj Close UpDown      Rate
1   2017-04-04  143.25  144.89  143.17  144.77  19891400  143.184486    Up       NaN
6   2017-04-11  145.52  146.11  144.73  145.04  20041200  143.450668    Up  0.186702
10  2017-04-17  141.48  141.88  140.87  141.83  17822900  140.282639    Up -1.166912
13  2017-04-20  141.22  142.92  141.16  142.44  14246300  140.884308    Up  0.430674
19  2017-04-28  143.92  144.16  143.31  143.65  20860400  142.072372    Up  0.848536

新しくRate列が追加され、前日との比較に基づいて上昇率が算出されています。

最後に、上昇率が10%以上の日のデータを抽出し、GoodDay列にTrueを代入します。

# 上昇率が10%以上の日のデータを抽出し、GoodDay列にTrueを代入
up_days['GoodDay'] = up_days['Rate'].apply(lambda x: True if x >= 10 else False)

# 結果を確認
print(up_days[up_days['GoodDay'] == True])

実行結果は以下のようになります。

          Date    Open    High     Low   Close    Volume  Adj Close UpDown       Rate  GoodDay
468  2019-12-27  289.46  293.97  288.12  289.80  36592900  289.205688    Up  10.751659     True

上昇率が10%以上の日は、2019年12月27日の1日だけであることがわかります。

まとめ

この記事では、pandasを使って上の行と下の行のデータを比較する方法について学びました。具体的には、shift()関数を使用して、前の行や次の行のデータを参照する方法を学びました。また、条件に応じたデータの比較やデータフレームの更新についても学びました。

この方法を使えば、時系列データなど、前後のデータとの比較が重要なデータ分析や機械学習において、便利にデータを加工することができます。

今回使用した株価データは、Yahoo Financeから取得したものです。実際の株式投資においては、株価の過去データを使用して将来の株価を予測することが一般的です。しかし、投資においてはリスクが伴うため、自己責任で行うようにしてください。

以上が、pandasを使って上の行と下の行のデータを比較する方法についての解説でした。