はじめに
データ分析において、データの前後関係を比較することは非常に重要です。そのため、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を使って上の行と下の行のデータを比較する方法についての解説でした。