
はじめに
データ分析において、データの前後関係を比較することは非常に重要です。そのため、pandasを使って上の行と下の行のデータを比較する方法を学ぶことは必須です。この記事では、pandasを使った行間の比較方法を紹介し、データフレームを操作するための基本的な知識を身につけます。
pandasを使って上の行と下の行のデータを比較する利点
pandasを使って上の行と下の行のデータを比較することで、以下のような利点があります。
- データの前後関係を比較できるため、トレンドや変化点を把握することができる。
- データの欠損値を補完することができる。
- データの前後関係に基づいてデータの予測を行うことができる。
データフレーム操作の基本的な知識と行間の比較方法
データフレームとは、表形式でデータを扱うためのpandasのデータ構造です。データフレームを操作するためには、以下の基本的な知識が必要です。
- データの読み込み方法
- データのインデックスとカラムの指定方法
- データの選択方法
- データの加工方法
行間の比較方法として、pandasのshift()関数を使用します。この関数を使用することで、指定した列の値を指定した行数分だけずらすことができます。たとえば、df[‘列名’].shift(1)とすることで、1行上の値を取得することができます。
データセットの準備: 必要なライブラリのインポートとデータの読み込み
まずは、必要なライブラリをインポートします。
1 2 3 | import pandas as pd import numpy as np |
次に、比較するためのサンプルデータを用意します。ここでは、株価のデータを使用します。
1 2 | # データの読み込み df = pd.read_csv( 'stock_prices.csv' ) |
データが正しく読み込まれたかを確認するために、head()関数を使用して最初の5行を表示してみます。
1 | df.head() |
実行結果は以下のようになります。
1 2 3 4 5 6 | 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 2 3 4 | # 1行上のClose列の値を取得 close_diff = df[ 'Close' ] - df[ 'Close' ].shift( 1 ) # 結果を確認 print (close_diff.head()) |
実行結果は以下のようになります。
1 2 3 4 5 6 | 0 NaN 1 1.07 2 - 0.75 3 - 0.36 4 - 0.32 Name: Close, dtype: float64 |
最初の行にはNaNが表示されています。これは、1行上の値が存在しないためです。
次に、前日の値との比較結果に基づいて、上昇したか下降したかを判定します。
1 2 3 | # 前日との比較結果に基づいて、上昇したか下降したかを判定 df[ 'UpDown' ] = np.where(close_diff > 0 , 'Up' , np.where(close_diff < 0 , 'Down' , 'No change' )) df.head() |
実行結果は以下のようになります。
1 2 3 4 5 6 | 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()関数を使用して、条件に応じたデータの比較を行い、データフレームを更新する方法を学びます。
まずは、上昇した日のみのデータを抽出します。
1 2 3 4 5 | # 上昇した日のデータのみ抽出 up_days = df[df[ 'UpDown' ] = = 'Up' ] # 結果を確認 print (up_days.head()) |
実行結果は以下のようになります。
1 2 3 4 5 6 7 | 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 次に、上昇した日の前日のデータとの比較を行い、上昇率を算出します。 |
1 2 3 4 5 | # 上昇した日の前日のデータとの比較を行い、上昇率を算出 up_days[ 'Rate' ] = (up_days[ 'Close' ] - up_days[ 'Close' ].shift( 1 )) / up_days[ 'Close' ].shift( 1 ) * 100 # 結果を確認 print (up_days.head()) |
実行結果は以下のようになります。
1 2 3 4 5 6 | 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を代入します。
1 2 3 4 5 | # 上昇率が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 ]) |
実行結果は以下のようになります。
1 2 | 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を使って上の行と下の行のデータを比較する方法についての解説でした。