更新日:2023年11月11日
ファイナンスの戦略的テクノロジープラットホームとなったPython。
Pythonの地位向上に大きく貢献したのが、Pandasです。
このブログ記事では、株価分析を題材にPython+Pandasを楽しく学べるように解説しました。
- Pythonを使って株価分析をはじめたい
- PythonやPandasを学びはじめた初心者
このような方は、サンプルコードを実際に自分で書いて試すをオススメします。
その他にも、覚え書き・リファレンスとしても使えるように配慮しています。
繰り返しご活用いただけるよう、ブックマークもご検討下さい。
動画で解説
Pandasとは
Pandasとは、Pythonのデータ解析用ライブラリです。
「財務データを定量分析するためのツール」として開発がスタートしました。
Pythonでデーター解析をするのに、無くてはならない存在です。
もちろん株価分析にも必須なライブラリーです。
Pandasのインストール
インストールが済んでいない方は、pipでインストールしましょう。
1 |
pip install pandas |
Pandasのインポート
1 2 |
#Pandasを PD という名前で使えるようにインポートします。 import pandas as pd |
株価データーの取得
株価データーを取得しましょう。
ここでは3種類の方法を解説します。
APIを使って株価データーを取得
APIを使って株価データーを取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#APIを使って株価データーを取得するためのライブラリー #pandas_datareader を web という名前でインポートします。 import pandas_datareader.data as web #データー取得の開始日を指定 start="1949/5/16" #データー取得の終了日を指定 end="2021/10/01" #セントルイス連邦準備銀行から1949年以降のデータを取得 #N225 = web.DataReader("NIKKEI225", 'fred',start,end) #格納するデーターフレーム名 = web.DataReader("銘柄名", '取得先',開始日,終了日) #セントルイス連邦準備銀行から1949年以降最新のデータまで取得 #endを指定していないので、最新のデーターまで取得される N225 = web.DataReader("NIKKEI225", 'fred',start) #データーフレームを表示させる N225 |
NIKKEI225 | |
---|---|
DATE | |
1949-05-16 | 176.21 |
1949-05-17 | 174.80 |
1949-05-18 | 172.53 |
1949-05-19 | 171.34 |
1949-05-20 | 169.20 |
… | … |
2021-09-27 | 30240.06 |
2021-09-28 | 30183.96 |
2021-09-29 | 29544.29 |
2021-09-30 | 29452.66 |
2021-10-01 | 28771.07 |
18885 rows × 1 columns
取得したデーターをCSV形式で保存します。
取得取得したデーターをCSV形式で保存します。
1 2 |
# to_csvで取得したデーターを"N225_fred.csv"という名前を付けて保存 N225.to_csv("N225_fred.csv") |
Shift-JIS 形式の CSV ファイル形式で出力する場合。
N225.to_csv(“N225_fred.csv”, encoding=”shift_jis”)
CSVデーターを読み込む
CSVデーターをデーターフレームとして読み込みます。
1 2 3 4 5 6 7 8 |
# read_csvで,ファイル名"N225_fred.csv"のCSVデーターを読み込む N225CSV = pd.read_csv('N225_fred.csv') # 読み込むデーターに日本語が含まれる場合は、 encoding='shift-jis' を追加する #df_population_data = pd.read_csv('N225_fred.csv',encoding='shift-jis') #データーフレームを表示させる N225CSV |
DATE | NIKKEI225 | |
---|---|---|
0 | 1949-05-16 | 176.21 |
1 | 1949-05-17 | 174.80 |
2 | 1949-05-18 | 172.53 |
3 | 1949-05-19 | 171.34 |
4 | 1949-05-20 | 169.20 |
… | … | … |
18880 | 2021-09-27 | 30240.06 |
18881 | 2021-09-28 | 30183.96 |
18882 | 2021-09-29 | 29544.29 |
18883 | 2021-09-30 | 29452.66 |
18884 | 2021-10-01 | 28771.07 |
18885 rows × 2 columns
取得したデーターをエクセル形式で保存する
1 2 3 4 5 |
# to_excelでExcel形式で書き出す #N225CSV.to_excel('N225_fred.xlsx') # シート名を指定して書き出す場合 N225CSV.to_excel('N225_fred.xlsx',sheet_name='sample') |
※書き込みに失敗する場合
openpyxlをインストールしてください
pip install openpyxl
エクセルのデーターを読み込む
1 2 3 4 5 6 7 8 9 10 |
# 最初のシートを読み込む N225XLS = pd.read_excel('N225_fred.xlsx') # シート名を指定し、1行目をスキップする場合 #N225XLS = pd.read_excel('N225_fred.xlsx', sheet_name="sample", skiprows=1) #データーフレームを表示させる N225XLS |
Unnamed: 0 | DATE | NIKKEI225 | |
---|---|---|---|
0 | 0 | 1949-05-16 | 176.21 |
1 | 1 | 1949-05-17 | 174.80 |
2 | 2 | 1949-05-18 | 172.53 |
3 | 3 | 1949-05-19 | 171.34 |
4 | 4 | 1949-05-20 | 169.20 |
… | … | … | … |
18880 | 18880 | 2021-09-27 | 30240.06 |
18881 | 18881 | 2021-09-28 | 30183.96 |
18882 | 18882 | 2021-09-29 | 29544.29 |
18883 | 18883 | 2021-09-30 | 29452.66 |
18884 | 18884 | 2021-10-01 | 28771.07 |
18885 rows × 3 columns
エクセルから読み込む際に新たにインデックスが割り振られたため、データーフレームの左側列に行が追加されています。
※読み込みに失敗する場合
xlrdをインストールしてください
pip install xlrd
matplotlibでチャート表示
せっかく株価データーを取得したので、matplotlibを使ってチャート表示させましょう。
※matplotlibの解説はここでは省きます
1 2 3 4 5 |
%matplotlib inline import matplotlib.pyplot as plt N225.plot(color='darkblue') plt.ylabel('N225 index') |
データーの概要を調べる
データーの概要を簡単に調べることができます。 先ほど取得した日経平均株価のデーターフレームを見てみます。
1 2 |
#日経平均株価のデーターを表示させる N225 |
Out[38]:
NIKKEI225 | |
---|---|
DATE | |
1949-05-16 | 176.21 |
1949-05-17 | 174.80 |
1949-05-18 | 172.53 |
1949-05-19 | 171.34 |
1949-05-20 | 169.20 |
… | … |
2021-09-27 | 30240.06 |
2021-09-28 | 30183.96 |
2021-09-29 | 29544.29 |
2021-09-30 | 29452.66 |
2021-10-01 | 28771.07 |
18885 rows × 1 columns
1 2 |
#データー型を調べる N225.dtypes |
1 2 |
NIKKEI225 float64 dtype: object |
日経平均株価のデーター型はfloat64(小数点型)です。
データーフレームの結合
データーフレームの結合を行います。
結合するデーターとして、セントルイス連邦準備銀行から,ドル円為替レートを取得しす。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#ドル円の為替レートをセントルイス連邦準備銀行のAPI(fred)から取得 #必要なライブラリーをインポート import pandas as pd import pandas_datareader.data as web #データー取得の開始日を指定 start="1949/5/16" #データー取得の終了日を指定 end="2021/10/01" #セントルイス連邦準備銀行から1949年以降のデータを取得 #N225 = web.DataReader("NIKKEI225", 'fred',start,end) #格納するデーターフレーム名 = web.DataReader("銘柄名", '取得先',開始日,終了日) #セントルイス連邦準備銀行からドル円為替レートを取得 fx = web.DataReader('DEXJPUS',"fred",start,end) #データーフレームを表示させる fx |
DEXJPUS | |
---|---|
DATE | |
1971-01-04 | 357.73 |
1971-01-05 | 357.81 |
1971-01-06 | 357.86 |
1971-01-07 | 357.87 |
1971-01-08 | 357.82 |
… | … |
2021-09-20 | 109.47 |
2021-09-21 | 109.33 |
2021-09-22 | 109.59 |
2021-09-23 | 110.17 |
2021-09-24 | 110.72 |
13235 rows × 1 columns
concatで結合
concatを使って日経平均株価(NK225)とドル円為替レート(fx)を結合します。
1 2 3 4 5 6 7 8 9 |
#concatで結合する #axis=0 縦方向に連結(デフォルト省略可) #axis=1 横方向に連結 #dropna() 欠損値を除外(削除) N225fx = pd.concat([N225,fx],axis=1).dropna() #結合したデーターを表示する N225fx |
NIKKEI225 | DEXJPUS | |
---|---|---|
DATE | ||
1971-01-04 | 2001.34 | 357.73 |
1971-01-05 | 1989.44 | 357.81 |
1971-01-06 | 1981.74 | 357.86 |
1971-01-07 | 2000.96 | 357.87 |
1971-01-08 | 2040.93 | 357.82 |
… | … | … |
2021-09-16 | 30323.34 | 109.67 |
2021-09-17 | 30500.05 | 109.94 |
2021-09-21 | 29839.71 | 109.33 |
2021-09-22 | 29639.40 | 109.59 |
2021-09-24 | 30248.81 | 110.72 |
12142 rows × 2 columns
concatのオプションで結合方法を変更することができます。
axis=0 縦方向に連結(デフォルト省略可)
axis=1 横方向に連結
dropna() 欠損値を除外(削除)
オプションを変更して、縦方向に結合してみます。
N225fx = pd.concat([N225,fx],axis=0)
1 2 3 4 5 6 7 8 9 |
#concatで結合する #axis=0 縦方向に連結(デフォルト省略可) #axis=1 横方向に連結 #dropna() 欠損値を除外(削除) N225fx0 = pd.concat([N225,fx],axis=0) #結合したデーターを表示する N225fx0 |
NIKKEI225 | DEXJPUS | |
---|---|---|
DATE | ||
1949-05-16 | 176.21 | NaN |
1949-05-17 | 174.80 | NaN |
1949-05-18 | 172.53 | NaN |
1949-05-19 | 171.34 | NaN |
1949-05-20 | 169.20 | NaN |
… | … | … |
2021-09-20 | NaN | 109.47 |
2021-09-21 | NaN | 109.33 |
2021-09-22 | NaN | 109.59 |
2021-09-23 | NaN | 110.17 |
2021-09-24 | NaN | 110.72 |
32120 rows × 2 columns
mageメソッドで結合
データーを結合する方法も複数あります。
インデックスをキーに結合
1 2 3 4 5 6 7 |
#必要なライブラリーをインポート import pandas as pd #インデックスをキーに結合する場合オプションを指定する #left_index=True, right_index=True pd.merge(N225,fx, left_index=True, right_index=True) |
NIKKEI225 | DEXJPUS | |
---|---|---|
DATE | ||
1971-01-04 | 2001.34 | 357.73 |
1971-01-05 | 1989.44 | 357.81 |
1971-01-06 | 1981.74 | 357.86 |
1971-01-07 | 2000.96 | 357.87 |
1971-01-08 | 2040.93 | 357.82 |
… | … | … |
2021-09-20 | NaN | 109.47 |
2021-09-21 | 29839.71 | 109.33 |
2021-09-22 | 29639.40 | 109.59 |
2021-09-23 | NaN | 110.17 |
2021-09-24 | 30248.81 | 110.72 |
13235 rows × 2 columns
日経平均株価に欠損値が含まれていることを確認してください。
mage結合の種類
mage結合の種類
4種類の結合方法があります。
・inner
・left
・right
・outer
◇inner
2つのデータフレームの共通しているキーのみ結合する方法
◇left
左(left)のデータは全部残り、右(right)のデーターは共通している部分だけ残る。
◇right
右(right)のデータは全部残り、左(left)のデーターは共通している部分だけ残る。
◇outer
共通するキーで結合し、左(left)のデーター、右(right)のデーターはすべて残す。
mage結合テスト用のデーターフレームを作ります。
1 2 3 |
df_left = pd.DataFrame( {'name':['AAA', 'BBB', 'CCC', 'DDD'], 'score1':[10, 20, 30, 40]}) df_left |
name | score1 | |
---|---|---|
0 | AAA | 10 |
1 | BBB | 20 |
2 | CCC | 30 |
3 | DDD | 40 |
1 2 3 4 5 |
import pandas as pd df_right = pd.DataFrame( {'name':['AAA', 'BBB', 'EEE', 'DDD'], 'score2':[50.1, 60.1, 70.1, 80.1]}) df_right |
name | score2 | |
---|---|---|
0 | AAA | 50.1 |
1 | BBB | 60.1 |
2 | EEE | 70.1 |
3 | DDD | 80.1 |
inner結合
結合キーは、 on=’name’
結合方法は、 how=’inner’
1 |
pd.merge(df_left ,df_right, on='name',how='inner') |
name | score1 | score2 | |
---|---|---|---|
0 | AAA | 10 | 50.1 |
1 | BBB | 20 | 60.1 |
2 | DDD | 40 | 80.1 |
inner結合はデフォルトなので、how=’inner’を指定しなくても結果は同じです。
1 |
pd.merge(df_left ,df_right, on='name') |
name | score1 | score2 | |
---|---|---|---|
0 | AAA | 10 | 50.1 |
1 | BBB | 20 | 60.1 |
2 | DDD | 40 | 80.1 |
left結合
結合キーは、 on=’name’
結合方法は、 how=’left’
1 |
pd.merge(df_left ,df_right, on='name',how='left') |
name | score1 | score2 | |
---|---|---|---|
0 | AAA | 10 | 50.1 |
1 | BBB | 20 | 60.1 |
2 | CCC | 30 | NaN |
3 | DDD | 40 | 80.1 |
right結合
結合キーは、 on=’name’
結合方法は、 how=’right’
1 |
pd.merge(df_left ,df_right, on='name',how='right') |
name | score1 | score2 | |
---|---|---|---|
0 | AAA | 10.0 | 50.1 |
1 | BBB | 20.0 | 60.1 |
2 | EEE | NaN | 70.1 |
3 | DDD | 40.0 | 80.1 |
outer結合
1 |
pd.merge(df_left ,df_right, on='name',how='outer') |
name | score1 | score2 | |
---|---|---|---|
0 | AAA | 10.0 | 50.1 |
1 | BBB | 20.0 | 60.1 |
2 | CCC | 30.0 | NaN |
3 | DDD | 40.0 | 80.1 |
4 | EEE | NaN | 70.1 |
どちらのデーターフレームに含まれているのか表示させる。
オプション:indicator=True
1 |
pd.merge(df_left ,df_right, on='name',how='outer', indicator=True) |
name | score1 | score2 | _merge | |
---|---|---|---|---|
0 | AAA | 10.0 | 50.1 | both |
1 | BBB | 20.0 | 60.1 | both |
2 | CCC | 30.0 | NaN | left_only |
3 | DDD | 40.0 | 80.1 | both |
4 | EEE | NaN | 70.1 | right_only |
両方のテーブルにある:both
左のデータフレームのみ:left_only
右のデータフレームのみ:right_only
値の抽出
値の抽出を行います。
まず、株価データーフレームを作成します。
最初にソニーの株価をポーランドのstooqというAPIから取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#APIを使って株価データーを取得するためのライブラリー #pandas_datareader を web という名前でインポートします。 import pandas_datareader.data as web #ポーランドのstooqというAPIからソニー(6758)の株価を取得します。 df = web.DataReader('6758.JP','stooq') ########################################################## #APIサーバー負荷軽減のため,2回目以降は保存したCSVファイルを読み込む。 # read_csvで,ファイル名"N225_fred.csv"のCSVデーターを読み込む #header=0csv 先頭行をヘッダーとして読み込むオプション(省略可能) #index_col='Date' インデックスの列を指定 #parse_dates=True datetime型を指定 #df = pd.read_csv('stooq6758.csv', header=0,index_col='Date', parse_dates=True) ########################################################### #繰り返しデーターを取得してサーバーに負担を掛けては申し訳ないので、CSV形式で保存しておきます。 # to_csvで取得したデーターを"N225_fred.csv"という名前を付けて保存</span> #df.to_csv("stooq6758.csv) #データーフレームを表示させる</span> df |
Out[21]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-14 | 12445.00 | 12555.00 | 12400.00 | 12555.00 | 2730400 |
2021-10-13 | 12295.00 | 12370.00 | 12215.00 | 12360.00 | 2869600 |
2021-10-12 | 12530.00 | 12585.00 | 12285.00 | 12330.00 | 2942600 |
2021-10-11 | 12095.00 | 12390.00 | 11990.00 | 12385.00 | 3303000 |
2021-10-08 | 11865.00 | 11990.00 | 11790.00 | 11860.00 | 2988600 |
… | … | … | … | … | … |
2016-10-24 | 3247.96 | 3249.91 | 3221.66 | 3231.43 | 5278558 |
2016-10-21 | 3298.59 | 3303.46 | 3219.73 | 3234.33 | 9926762 |
2016-10-20 | 3301.55 | 3332.68 | 3286.92 | 3314.20 | 6265820 |
2016-10-19 | 3378.47 | 3384.32 | 3313.22 | 3313.22 | 5844732 |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 |
1218 rows × 5 columns
データーの先頭部分/後半部分を抽出
1 2 |
#先頭行を抽出します。 df.head(1) |
Out[22]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-14 | 12445.0 | 12555.0 | 12400.0 | 12555.0 | 2730400 |
1 2 |
#カッコ内の数値で取得する行数を指定します df.head(10) |
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-14 | 12445.0 | 12555.0 | 12400.0 | 12555.0 | 2730400 |
2021-10-13 | 12295.0 | 12370.0 | 12215.0 | 12360.0 | 2869600 |
2021-10-12 | 12530.0 | 12585.0 | 12285.0 | 12330.0 | 2942600 |
2021-10-11 | 12095.0 | 12390.0 | 11990.0 | 12385.0 | 3303000 |
2021-10-08 | 11865.0 | 11990.0 | 11790.0 | 11860.0 | 2988600 |
2021-10-07 | 11650.0 | 11790.0 | 11600.0 | 11695.0 | 2352300 |
2021-10-06 | 11785.0 | 12020.0 | 11515.0 | 11625.0 | 3662700 |
2021-10-05 | 11775.0 | 11895.0 | 11670.0 | 11785.0 | 3414800 |
2021-10-04 | 12210.0 | 12290.0 | 11910.0 | 11970.0 | 3185000 |
2021-10-01 | 12265.0 | 12350.0 | 12040.0 | 12085.0 | 3836100 |
1 2 |
#データーの後半部分を抽出 df.tail(3) |
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2016-10-20 | 3301.55 | 3332.68 | 3286.92 | 3314.20 | 6265820 |
2016-10-19 | 3378.47 | 3384.32 | 3313.22 | 3313.22 | 5844732 |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 |
ランダムに抽出する(ランダムサンプリング)
1 2 |
#カッコ内の数値で抽出件数を指定 df.sample(5) |
Out[25]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2019-08-27 | 5796.42 | 5827.06 | 5788.51 | 5813.22 | 3398641 |
2018-01-10 | 5446.57 | 5518.08 | 5415.22 | 5476.93 | 7435491 |
2018-05-08 | 5008.90 | 5108.07 | 5002.03 | 5088.45 | 5384417 |
2019-12-24 | 7369.96 | 7401.68 | 7301.56 | 7342.21 | 2904520 |
2019-04-11 | 4997.88 | 5091.76 | 4990.95 | 5066.06 | 5610908 |
列を指定して抽出
1 2 |
#Open(始値)の取得 df['Open'] |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Date 2021-10-14 12445.00 2021-10-13 12295.00 2021-10-12 12530.00 2021-10-11 12095.00 2021-10-08 11865.00 ... 2016-10-24 3247.96 2016-10-21 3298.59 2016-10-20 3301.55 2016-10-19 3378.47 2016-10-18 3343.41 Name: Open, Length: 1218, dtype: float64 |
1 2 3 |
#Open(始値)をデーターフレームとしての取得 #カギ括弧で列名を囲みます df[['Open']] |
Out[27]:
Open | |
---|---|
Date | |
2021-10-14 | 12445.00 |
2021-10-13 | 12295.00 |
2021-10-12 | 12530.00 |
2021-10-11 | 12095.00 |
2021-10-08 | 11865.00 |
… | … |
2016-10-24 | 3247.96 |
2016-10-21 | 3298.59 |
2016-10-20 | 3301.55 |
2016-10-19 | 3378.47 |
2016-10-18 | 3343.41 |
1218 rows × 1 columns
複数列の抽出
1 2 |
#複数列の抽出 df[['Open','Close']] |
Open | Close | |
---|---|---|
Date | ||
2021-10-14 | 12445.00 | 12555.00 |
2021-10-13 | 12295.00 | 12360.00 |
2021-10-12 | 12530.00 | 12330.00 |
2021-10-11 | 12095.00 | 12385.00 |
2021-10-08 | 11865.00 | 11860.00 |
… | … | … |
2016-10-24 | 3247.96 | 3231.43 |
2016-10-21 | 3298.59 | 3234.33 |
2016-10-20 | 3301.55 | 3314.20 |
2016-10-19 | 3378.47 | 3313.22 |
2016-10-18 | 3343.41 | 3381.38 |
1218 rows × 2 columns
行を指定して抽出
1 2 |
#行を指定して抽出 df[0:3] |
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-14 | 12445.0 | 12555.0 | 12400.0 | 12555.0 | 2730400 |
2021-10-13 | 12295.0 | 12370.0 | 12215.0 | 12360.0 | 2869600 |
2021-10-12 | 12530.0 | 12585.0 | 12285.0 | 12330.0 | 2942600 |
インデックスの期間を指定して抽出
1 2 |
#インデックスの期間を指定して抽出 df['20211001':'20210927'] |
Out[30]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-01 | 12265.00 | 12350.00 | 12040.00 | 12085.0 | 3836100 |
2021-09-30 | 12425.00 | 12530.00 | 12275.00 | 12455.0 | 3819100 |
2021-09-29 | 12635.00 | 12660.00 | 12285.00 | 12440.0 | 4999200 |
2021-09-28 | 12870.05 | 12959.84 | 12670.51 | 12890.0 | 4143220 |
2021-09-27 | 13159.37 | 13169.35 | 12929.91 | 12934.9 | 3832900 |
locで抽出
1 2 |
#インデックスの期日とカラム(列名)を指定して抽出 df.loc['2021-10-01',['Open','Close']] |
Open | Close | |
---|---|---|
Date | ||
2021-10-01 | 12265.0 | 12085.0 |
1 2 |
#期間と出力するカラム(列名)を指定して抽出 df.loc['20211001':'20210929',['Open','Close']] |
Out[32]:
Open | Close | |
---|---|---|
Date | ||
2021-10-01 | 12265.0 | 12085.0 |
2021-09-30 | 12425.0 | 12455.0 |
2021-09-29 | 12635.0 | 12440.0 |
1 2 |
#インデックスの期間をすべて表示・カラム(列名)を指定して抽出 df.loc[:,['Open','Close']] |
Out[33]:
Open | Close | |
---|---|---|
Date | ||
2021-10-14 | 12445.00 | 12555.00 |
2021-10-13 | 12295.00 | 12360.00 |
2021-10-12 | 12530.00 | 12330.00 |
2021-10-11 | 12095.00 | 12385.00 |
2021-10-08 | 11865.00 | 11860.00 |
… | … | … |
2016-10-24 | 3247.96 | 3231.43 |
2016-10-21 | 3298.59 | 3234.33 |
2016-10-20 | 3301.55 | 3314.20 |
2016-10-19 | 3378.47 | 3313.22 |
2016-10-18 | 3343.41 | 3381.38 |
1218 rows × 2 columns
ilocで抽出
ilocを使うと番号でデーターを抽出することができます。
1 2 |
#カッコ内に[行番号、列番号]を記載する。 df.iloc[0,0] |
Out[34]:
1 |
12445.0 |
1 |
df |
Out[35]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-14 | 12445.00 | 12555.00 | 12400.00 | 12555.00 | 2730400 |
2021-10-13 | 12295.00 | 12370.00 | 12215.00 | 12360.00 | 2869600 |
2021-10-12 | 12530.00 | 12585.00 | 12285.00 | 12330.00 | 2942600 |
2021-10-11 | 12095.00 | 12390.00 | 11990.00 | 12385.00 | 3303000 |
2021-10-08 | 11865.00 | 11990.00 | 11790.00 | 11860.00 | 2988600 |
… | … | … | … | … | … |
2016-10-24 | 3247.96 | 3249.91 | 3221.66 | 3231.43 | 5278558 |
2016-10-21 | 3298.59 | 3303.46 | 3219.73 | 3234.33 | 9926762 |
2016-10-20 | 3301.55 | 3332.68 | 3286.92 | 3314.20 | 6265820 |
2016-10-19 | 3378.47 | 3384.32 | 3313.22 | 3313.22 | 5844732 |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 |
1218 rows × 5 columns
1 |
df.iloc[0:9,0:4] |
Out[36]:
Open | High | Low | Close | |
---|---|---|---|---|
Date | ||||
2021-10-14 | 12445.0 | 12555.0 | 12400.0 | 12555.0 |
2021-10-13 | 12295.0 | 12370.0 | 12215.0 | 12360.0 |
2021-10-12 | 12530.0 | 12585.0 | 12285.0 | 12330.0 |
2021-10-11 | 12095.0 | 12390.0 | 11990.0 | 12385.0 |
2021-10-08 | 11865.0 | 11990.0 | 11790.0 | 11860.0 |
2021-10-07 | 11650.0 | 11790.0 | 11600.0 | 11695.0 |
2021-10-06 | 11785.0 | 12020.0 | 11515.0 | 11625.0 |
2021-10-05 | 11775.0 | 11895.0 | 11670.0 | 11785.0 |
2021-10-04 | 12210.0 | 12290.0 | 11910.0 | 11970.0 |
数値の大小で抽出(不等号)
1 2 3 |
#Close(終値)が12400円以上の値を抽出 df[df.Close > 12400] |
Out[37]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-14 | 12445.00 | 12555.00 | 12400.00 | 12555.00 | 2730400 |
2021-09-30 | 12425.00 | 12530.00 | 12275.00 | 12455.00 | 3819100 |
2021-09-29 | 12635.00 | 12660.00 | 12285.00 | 12440.00 | 4999200 |
2021-09-28 | 12870.05 | 12959.84 | 12670.51 | 12890.00 | 4143220 |
2021-09-27 | 13159.37 | 13169.35 | 12929.91 | 12934.90 | 3832900 |
2021-09-24 | 12630.60 | 12969.81 | 12555.78 | 12969.81 | 6898017 |
1 2 |
#データフレームすべてのデーター列を対象に抽出 df[df < 10000] |
Out[38]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-14 | NaN | NaN | NaN | NaN | NaN |
2021-10-13 | NaN | NaN | NaN | NaN | NaN |
2021-10-12 | NaN | NaN | NaN | NaN | NaN |
2021-10-11 | NaN | NaN | NaN | NaN | NaN |
2021-10-08 | NaN | NaN | NaN | NaN | NaN |
… | … | … | … | … | … |
2016-10-24 | 3247.96 | 3249.91 | 3221.66 | 3231.43 | NaN |
2016-10-21 | 3298.59 | 3303.46 | 3219.73 | 3234.33 | NaN |
2016-10-20 | 3301.55 | 3332.68 | 3286.92 | 3314.20 | NaN |
2016-10-19 | 3378.47 | 3384.32 | 3313.22 | 3313.22 | NaN |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | NaN |
1218 rows × 5 columns
曜日で抽出
曜日を算出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#日付データーを扱うのでdatetimeをインポート import datetime #曜日を英語表記で表す df['weekday'] =df.index.strftime('%A') #曜日を英語表記(省略表記)で表す #df['weekday'] =df.index.strftime('%a') #曜日を数値で表す #df['weekday'] =df.index.weekday df |
Out[39]:
Open | High | Low | Close | Volume | weekday | |
---|---|---|---|---|---|---|
Date | ||||||
2021-10-14 | 12445.00 | 12555.00 | 12400.00 | 12555.00 | 2730400 | Thursday |
2021-10-13 | 12295.00 | 12370.00 | 12215.00 | 12360.00 | 2869600 | Wednesday |
2021-10-12 | 12530.00 | 12585.00 | 12285.00 | 12330.00 | 2942600 | Tuesday |
2021-10-11 | 12095.00 | 12390.00 | 11990.00 | 12385.00 | 3303000 | Monday |
2021-10-08 | 11865.00 | 11990.00 | 11790.00 | 11860.00 | 2988600 | Friday |
… | … | … | … | … | … | … |
2016-10-24 | 3247.96 | 3249.91 | 3221.66 | 3231.43 | 5278558 | Monday |
2016-10-21 | 3298.59 | 3303.46 | 3219.73 | 3234.33 | 9926762 | Friday |
2016-10-20 | 3301.55 | 3332.68 | 3286.92 | 3314.20 | 6265820 | Thursday |
2016-10-19 | 3378.47 | 3384.32 | 3313.22 | 3313.22 | 5844732 | Wednesday |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 | Tuesday |
1218 rows × 6 columns
曜日で抽出
条件に一致するデータ抽出(文字列)
◇等号で抽出
1 |
df[df['weekday'] == 'Monday'] |
Out[40]:
Open | High | Low | Close | Volume | weekday | |
---|---|---|---|---|---|---|
Date | ||||||
2021-10-11 | 12095.00 | 12390.00 | 11990.00 | 12385.00 | 3303000 | Monday |
2021-10-04 | 12210.00 | 12290.00 | 11910.00 | 11970.00 | 3185000 | Monday |
2021-09-27 | 13159.37 | 13169.35 | 12929.91 | 12934.90 | 3832900 | Monday |
2021-09-13 | 11977.12 | 12201.60 | 11972.14 | 12201.60 | 2806717 | Monday |
2021-09-06 | 11932.23 | 11972.14 | 11792.55 | 11922.25 | 3094686 | Monday |
… | … | … | … | … | … | … |
2016-11-21 | 3174.93 | 3216.79 | 3171.03 | 3213.87 | 6415016 | Monday |
2016-11-14 | 3143.75 | 3179.78 | 3131.09 | 3175.89 | 6753447 | Monday |
2016-11-07 | 3134.99 | 3139.86 | 3054.15 | 3066.80 | 8468300 | Monday |
2016-10-31 | 3218.75 | 3276.21 | 3209.99 | 3273.29 | 6273830 | Monday |
2016-10-24 | 3247.96 | 3249.91 | 3221.66 | 3231.43 | 5278558 | Monday |
224 rows × 6 columns
◇isinで抽出
1 |
df[df['weekday'].isin(['Monday'])] |
Out[41]:
Open | High | Low | Close | Volume | weekday | |
---|---|---|---|---|---|---|
Date | ||||||
2021-10-11 | 12095.00 | 12390.00 | 11990.00 | 12385.00 | 3303000 | Monday |
2021-10-04 | 12210.00 | 12290.00 | 11910.00 | 11970.00 | 3185000 | Monday |
2021-09-27 | 13159.37 | 13169.35 | 12929.91 | 12934.90 | 3832900 | Monday |
2021-09-13 | 11977.12 | 12201.60 | 11972.14 | 12201.60 | 2806717 | Monday |
2021-09-06 | 11932.23 | 11972.14 | 11792.55 | 11922.25 | 3094686 | Monday |
… | … | … | … | … | … | … |
2016-11-21 | 3174.93 | 3216.79 | 3171.03 | 3213.87 | 6415016 | Monday |
2016-11-14 | 3143.75 | 3179.78 | 3131.09 | 3175.89 | 6753447 | Monday |
2016-11-07 | 3134.99 | 3139.86 | 3054.15 | 3066.80 | 8468300 | Monday |
2016-10-31 | 3218.75 | 3276.21 | 3209.99 | 3273.29 | 6273830 | Monday |
2016-10-24 | 3247.96 | 3249.91 | 3221.66 | 3231.43 | 5278558 | Monday |
224 rows × 6 columns
◇抽出条件を追加
1 |
df[df['weekday'].isin(['Monday', 'Wednesday'])] |
Out[42]:
Open | High | Low | Close | Volume | weekday | |
---|---|---|---|---|---|---|
Date | ||||||
2021-10-13 | 12295.00 | 12370.00 | 12215.00 | 12360.00 | 2869600 | Wednesday |
2021-10-11 | 12095.00 | 12390.00 | 11990.00 | 12385.00 | 3303000 | Monday |
2021-10-06 | 11785.00 | 12020.00 | 11515.00 | 11625.00 | 3662700 | Wednesday |
2021-10-04 | 12210.00 | 12290.00 | 11910.00 | 11970.00 | 3185000 | Monday |
2021-09-29 | 12635.00 | 12660.00 | 12285.00 | 12440.00 | 4999200 | Wednesday |
… | … | … | … | … | … | … |
2016-11-02 | 3194.41 | 3210.95 | 3166.16 | 3179.78 | 9330295 | Wednesday |
2016-10-31 | 3218.75 | 3276.21 | 3209.99 | 3273.29 | 6273830 | Monday |
2016-10-26 | 3225.56 | 3241.16 | 3198.29 | 3238.22 | 4288828 | Wednesday |
2016-10-24 | 3247.96 | 3249.91 | 3221.66 | 3231.43 | 5278558 | Monday |
2016-10-19 | 3378.47 | 3384.32 | 3313.22 | 3313.22 | 5844732 | Wednesday |
475 rows × 6 columns
算術演算子を使った抽出
曜日を数値で表します。
index.weekdayを使用すると、インデックスの曜日が数値に変換されます。
月曜日(Monday)が0、日曜日が6となる整数で曜日の情報を取得できる。
1 2 3 4 5 |
import datetime df['weekday_number'] =df.index.weekday df.head(10) |
Out[43]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-10-14 | 12445.0 | 12555.0 | 12400.0 | 12555.0 | 2730400 | Thursday | 3 |
2021-10-13 | 12295.0 | 12370.0 | 12215.0 | 12360.0 | 2869600 | Wednesday | 2 |
2021-10-12 | 12530.0 | 12585.0 | 12285.0 | 12330.0 | 2942600 | Tuesday | 1 |
2021-10-11 | 12095.0 | 12390.0 | 11990.0 | 12385.0 | 3303000 | Monday | 0 |
2021-10-08 | 11865.0 | 11990.0 | 11790.0 | 11860.0 | 2988600 | Friday | 4 |
2021-10-07 | 11650.0 | 11790.0 | 11600.0 | 11695.0 | 2352300 | Thursday | 3 |
2021-10-06 | 11785.0 | 12020.0 | 11515.0 | 11625.0 | 3662700 | Wednesday | 2 |
2021-10-05 | 11775.0 | 11895.0 | 11670.0 | 11785.0 | 3414800 | Tuesday | 1 |
2021-10-04 | 12210.0 | 12290.0 | 11910.0 | 11970.0 | 3185000 | Monday | 0 |
2021-10-01 | 12265.0 | 12350.0 | 12040.0 | 12085.0 | 3836100 | Friday | 4 |
weekday_numberが偶数の日を抽出
割り算のあまり(剰余)は%で求められます。
‘weekday_number’を2で割ったあまりが0ならば偶数と判断します。
余談ですが、0は偶数です。
1 |
df[df['weekday_number'] % 2 == 0] |
Out[44]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-10-13 | 12295.00 | 12370.00 | 12215.00 | 12360.00 | 2869600 | Wednesday | 2 |
2021-10-11 | 12095.00 | 12390.00 | 11990.00 | 12385.00 | 3303000 | Monday | 0 |
2021-10-08 | 11865.00 | 11990.00 | 11790.00 | 11860.00 | 2988600 | Friday | 4 |
2021-10-06 | 11785.00 | 12020.00 | 11515.00 | 11625.00 | 3662700 | Wednesday | 2 |
2021-10-04 | 12210.00 | 12290.00 | 11910.00 | 11970.00 | 3185000 | Monday | 0 |
… | … | … | … | … | … | … | … |
2016-10-28 | 3229.45 | 3233.34 | 3194.41 | 3213.87 | 5857566 | Friday | 4 |
2016-10-26 | 3225.56 | 3241.16 | 3198.29 | 3238.22 | 4288828 | Wednesday | 2 |
2016-10-24 | 3247.96 | 3249.91 | 3221.66 | 3231.43 | 5278558 | Monday | 0 |
2016-10-21 | 3298.59 | 3303.46 | 3219.73 | 3234.33 | 9926762 | Friday | 4 |
2016-10-19 | 3378.47 | 3384.32 | 3313.22 | 3313.22 | 5844732 | Wednesday | 2 |
723 rows × 7 columns
条件に一致しないデーターを抽出(NOT演算子)
条件に一致しないデーターを抽出するには、NOT演算子である、「~」を使用します。
「~」はチルダと読みます。
1 2 |
#NOT演算子を使って偶数ではない(奇数)データーを抽出 df[~df['weekday_number'] % 2 == 0] |
Out[45]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-10-14 | 12445.00 | 12555.00 | 12400.00 | 12555.00 | 2730400 | Thursday | 3 |
2021-10-12 | 12530.00 | 12585.00 | 12285.00 | 12330.00 | 2942600 | Tuesday | 1 |
2021-10-07 | 11650.00 | 11790.00 | 11600.00 | 11695.00 | 2352300 | Thursday | 3 |
2021-10-05 | 11775.00 | 11895.00 | 11670.00 | 11785.00 | 3414800 | Tuesday | 1 |
2021-09-30 | 12425.00 | 12530.00 | 12275.00 | 12455.00 | 3819100 | Thursday | 3 |
… | … | … | … | … | … | … | … |
2016-11-01 | 3205.12 | 3251.86 | 3196.36 | 3249.91 | 7717609 | Tuesday | 1 |
2016-10-27 | 3211.93 | 3239.21 | 3205.12 | 3215.83 | 4181631 | Thursday | 3 |
2016-10-25 | 3245.04 | 3247.96 | 3218.75 | 3243.09 | 5198364 | Tuesday | 1 |
2016-10-20 | 3301.55 | 3332.68 | 3286.92 | 3314.20 | 6265820 | Thursday | 3 |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 | Tuesday | 1 |
495 rows × 7 columns
条件に一致しないデーターを抽出(不等価演算子)
1 2 |
#不等価演算子を使って偶数ではない(奇数)データーを抽出 df[df['weekday_number'] % 2 != 0] |
Out[46]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-10-14 | 12445.00 | 12555.00 | 12400.00 | 12555.00 | 2730400 | Thursday | 3 |
2021-10-12 | 12530.00 | 12585.00 | 12285.00 | 12330.00 | 2942600 | Tuesday | 1 |
2021-10-07 | 11650.00 | 11790.00 | 11600.00 | 11695.00 | 2352300 | Thursday | 3 |
2021-10-05 | 11775.00 | 11895.00 | 11670.00 | 11785.00 | 3414800 | Tuesday | 1 |
2021-09-30 | 12425.00 | 12530.00 | 12275.00 | 12455.00 | 3819100 | Thursday | 3 |
… | … | … | … | … | … | … | … |
2016-11-01 | 3205.12 | 3251.86 | 3196.36 | 3249.91 | 7717609 | Tuesday | 1 |
2016-10-27 | 3211.93 | 3239.21 | 3205.12 | 3215.83 | 4181631 | Thursday | 3 |
2016-10-25 | 3245.04 | 3247.96 | 3218.75 | 3243.09 | 5198364 | Tuesday | 1 |
2016-10-20 | 3301.55 | 3332.68 | 3286.92 | 3314.20 | 6265820 | Thursday | 3 |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 | Tuesday | 1 |
495 rows × 7 columns
and条件/or条件で抽出
and条件で抽出
1 |
df[(df['Close'] >12000) & (df['weekday'] == 'Monday')] |
Out[47]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-10-11 | 12095.00 | 12390.00 | 11990.00 | 12385.00 | 3303000 | Monday | 0 |
2021-09-27 | 13159.37 | 13169.35 | 12929.91 | 12934.90 | 3832900 | Monday | 0 |
2021-09-13 | 11977.12 | 12201.60 | 11972.14 | 12201.60 | 2806717 | Monday | 0 |
2021-04-12 | 12171.67 | 12181.65 | 11992.09 | 12146.73 | 2883094 | Monday | 0 |
2021-04-05 | 12301.37 | 12386.17 | 12201.60 | 12301.37 | 3780879 | Monday | 0 |
2021-02-08 | 12155.21 | 12423.89 | 12015.90 | 12035.80 | 8827907 | Monday | 0 |
or条件で抽出
1 |
df[(df['Open'] > 12600) | (df['Close'] > 12900)] |
Out[48]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-09-29 | 12635.00 | 12660.00 | 12285.00 | 12440.00 | 4999200 | Wednesday | 2 |
2021-09-28 | 12870.05 | 12959.84 | 12670.51 | 12890.00 | 4143220 | Tuesday | 1 |
2021-09-27 | 13159.37 | 13169.35 | 12929.91 | 12934.90 | 3832900 | Monday | 0 |
2021-09-24 | 12630.60 | 12969.81 | 12555.78 | 12969.81 | 6898017 | Friday | 4 |
queryメソッドで抽出
queryメソッドはSQLのwhereと似ています。
1 |
df.query('Open == 12635.00') |
Out[49]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-09-29 | 12635.0 | 12660.0 | 12285.0 | 12440.0 | 4999200 | Wednesday | 2 |
1 |
df.query('Open > 12635.00') |
Out[50]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-09-28 | 12870.05 | 12959.84 | 12670.51 | 12890.0 | 4143220 | Tuesday | 1 |
2021-09-27 | 13159.37 | 13169.35 | 12929.91 | 12934.9 | 3832900 | Monday | 0 |
1 2 |
#抽出条件が文字列の場合だけ””で囲います df.query('weekday == "Tuesday"') |
Out[51]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-10-12 | 12530.00 | 12585.00 | 12285.00 | 12330.00 | 2942600 | Tuesday | 1 |
2021-10-05 | 11775.00 | 11895.00 | 11670.00 | 11785.00 | 3414800 | Tuesday | 1 |
2021-09-28 | 12870.05 | 12959.84 | 12670.51 | 12890.00 | 4143220 | Tuesday | 1 |
2021-09-21 | 12061.93 | 12381.18 | 12002.07 | 12311.35 | 4876623 | Tuesday | 1 |
2021-09-14 | 12271.44 | 12326.31 | 12191.63 | 12321.32 | 3166352 | Tuesday | 1 |
… | … | … | … | … | … | … | … |
2016-11-15 | 3140.83 | 3142.80 | 3089.22 | 3119.42 | 7401663 | Tuesday | 1 |
2016-11-08 | 3080.46 | 3108.70 | 3077.54 | 3101.86 | 4786721 | Tuesday | 1 |
2016-11-01 | 3205.12 | 3251.86 | 3196.36 | 3249.91 | 7717609 | Tuesday | 1 |
2016-10-25 | 3245.04 | 3247.96 | 3218.75 | 3243.09 | 5198364 | Tuesday | 1 |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 | Tuesday | 1 |
249 rows × 7 columns
1 2 3 |
#and条件 df.query('weekday == "Tuesday" and Open > 12635.00') |
Out[52]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-09-28 | 12870.05 | 12959.84 | 12670.51 | 12890.0 | 4143220 | Tuesday | 1 |
1 2 3 |
#or条件 df.query('weekday == "Tuesday" or weekday == "Friday"') |
Out[53]:
Open | High | Low | Close | Volume | weekday | weekday_number | |
---|---|---|---|---|---|---|---|
Date | |||||||
2021-10-12 | 12530.00 | 12585.00 | 12285.00 | 12330.00 | 2942600 | Tuesday | 1 |
2021-10-08 | 11865.00 | 11990.00 | 11790.00 | 11860.00 | 2988600 | Friday | 4 |
2021-10-05 | 11775.00 | 11895.00 | 11670.00 | 11785.00 | 3414800 | Tuesday | 1 |
2021-10-01 | 12265.00 | 12350.00 | 12040.00 | 12085.00 | 3836100 | Friday | 4 |
2021-09-28 | 12870.05 | 12959.84 | 12670.51 | 12890.00 | 4143220 | Tuesday | 1 |
… | … | … | … | … | … | … | … |
2016-11-01 | 3205.12 | 3251.86 | 3196.36 | 3249.91 | 7717609 | Tuesday | 1 |
2016-10-28 | 3229.45 | 3233.34 | 3194.41 | 3213.87 | 5857566 | Friday | 4 |
2016-10-25 | 3245.04 | 3247.96 | 3218.75 | 3243.09 | 5198364 | Tuesday | 1 |
2016-10-21 | 3298.59 | 3303.46 | 3219.73 | 3234.33 | 9926762 | Friday | 4 |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 | Tuesday | 1 |
497 rows × 7 columns
データーの概要を調べる
データーの概要を簡単に調べることができます。
先ほどstooqのAPIから取得したソニーの株価をCSVファイルに保存しました。
そのCSVファイルをデーターフレームとして取得します。
1 2 3 4 5 6 7 8 9 10 11 |
#pandasをインポート import pandas as pd #ソニーの株価をデーターフレームとして取得 #header=0csv 先頭行をヘッダーとして読み込むオプション(省略可能) #index_col='Date' インデックスの列を指定 #parse_dates=True datetime型を指定 df = pd.read_csv('stooq6758.csv', header=0,index_col='Date', parse_dates=True) df |
Out[54]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-14 | 12445.00 | 12555.00 | 12400.00 | 12555.00 | 2730400 |
2021-10-13 | 12295.00 | 12370.00 | 12215.00 | 12360.00 | 2869600 |
2021-10-12 | 12530.00 | 12585.00 | 12285.00 | 12330.00 | 2942600 |
2021-10-11 | 12095.00 | 12390.00 | 11990.00 | 12385.00 | 3303000 |
2021-10-08 | 11865.00 | 11990.00 | 11790.00 | 11860.00 | 2988600 |
… | … | … | … | … | … |
2016-10-24 | 3247.96 | 3249.91 | 3221.66 | 3231.43 | 5278558 |
2016-10-21 | 3298.59 | 3303.46 | 3219.73 | 3234.33 | 9926762 |
2016-10-20 | 3301.55 | 3332.68 | 3286.92 | 3314.20 | 6265820 |
2016-10-19 | 3378.47 | 3384.32 | 3313.22 | 3313.22 | 5844732 |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 |
1218 rows × 5 columns
データー型を調べる
1 2 |
#データー型を調べる df.dtypes |
Out[55]:
1 2 3 4 5 6 |
Open float64 High float64 Low float64 Close float64 Volume int64 dtype: object |
要約統計量を調べる
1 |
df.describe() |
Out[56]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
count | 1218.000000 | 1218.000000 | 1218.000000 | 1218.000000 | 1.218000e+03 |
mean | 6561.305944 | 6624.866437 | 6495.876084 | 6560.909901 | 6.504166e+06 |
std | 2521.853738 | 2549.519323 | 2491.243957 | 2520.278511 | 3.525582e+06 |
min | 3080.460000 | 3107.730000 | 2853.530000 | 2944.110000 | 1.716486e+06 |
25% | 5009.337500 | 5058.415000 | 4965.857500 | 5015.850000 | 4.324184e+06 |
50% | 5842.440000 | 5892.230000 | 5773.190000 | 5831.170000 | 5.700354e+06 |
75% | 7821.282500 | 7882.475000 | 7758.637500 | 7808.402500 | 7.492584e+06 |
max | 13159.370000 | 13169.350000 | 12929.910000 | 12969.810000 | 4.152668e+07 |
小数点以下の数字が並んでいて、見にくいですね。
小数点以下を四捨五入します。
1 |
df.describe().round(0) |
Out[57]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
count | 1218.0 | 1218.0 | 1218.0 | 1218.0 | 1218.0 |
mean | 6561.0 | 6625.0 | 6496.0 | 6561.0 | 6504166.0 |
std | 2522.0 | 2550.0 | 2491.0 | 2520.0 | 3525582.0 |
min | 3080.0 | 3108.0 | 2854.0 | 2944.0 | 1716486.0 |
25% | 5009.0 | 5058.0 | 4966.0 | 5016.0 | 4324184.0 |
50% | 5842.0 | 5892.0 | 5773.0 | 5831.0 | 5700354.0 |
75% | 7821.0 | 7882.0 | 7759.0 | 7808.0 | 7492584.0 |
max | 13159.0 | 13169.0 | 12930.0 | 12970.0 | 41526685.0 |
◇要約統計量の項目
count: 要素の個数
mean: 算術平均
std: 標準偏差
min: 最小値
max: 最大値
50%: 中央値(median)
25%, 75%: 1/4分位数、3/4分位数
unique: ユニークな(一意な)値の要素の個数
top: 最頻値(mode)
freq: 最頻値の頻度(出現回数)
◇インデックスを取得します
1 2 |
#インデックスを取得 df.index |
Out[58]:
1 2 3 4 5 6 7 8 |
DatetimeIndex(['2021-10-14', '2021-10-13', '2021-10-12', '2021-10-11', '2021-10-08', '2021-10-07', '2021-10-06', '2021-10-05', '2021-10-04', '2021-10-01', ... '2016-10-31', '2016-10-28', '2016-10-27', '2016-10-26', '2016-10-25', '2016-10-24', '2016-10-21', '2016-10-20', '2016-10-19', '2016-10-18'], dtype='datetime64[ns]', name='Date', length=1218, freq=None) |
◇列名を取得
1 2 |
#列名を取得 df.columns |
1 |
Index(['Open', 'High', 'Low', 'Close', 'Volume'], dtype='object') |
◇データーの中身を取得
1 2 3 4 5 6 |
#データーの中身を取得 pd.options.display.float_format ='{:.2f}'.format df.values |
Out[60]:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
array([[1.244500e+04, 1.255500e+04, 1.240000e+04, 1.255500e+04, 2.730400e+06], [1.229500e+04, 1.237000e+04, 1.221500e+04, 1.236000e+04, 2.869600e+06], [1.253000e+04, 1.258500e+04, 1.228500e+04, 1.233000e+04, 2.942600e+06], ..., [3.301550e+03, 3.332680e+03, 3.286920e+03, 3.314200e+03, 6.265820e+06], [3.378470e+03, 3.384320e+03, 3.313220e+03, 3.313220e+03, 5.844732e+06], [3.343410e+03, 3.381380e+03, 3.331730e+03, 3.381380e+03, 6.755501e+06]]) |
pandasのオプション設定を確認・変更する
取得したデータの表記が、’e’(= exponential)を使った表現になる事があります。
(例)1.165000e+04
慣れている人には分かりやすい表記なのかも知れませんが、私は普通の小数点表記の方が好きです。
◇pandasの設定を変更するにはこちらのコードを実行します。 pd.options.display.float_format = ‘{:.2f}’.format
◇withステートメントで都度指定 with pd.option_context(‘display.float_format’, ‘{:.2f}’.format): display(df.values)
これ以外にも、pandasには様々なオプションがあります。
詳細の解説は省略しますがオプション設定の確認方法と一部の設定変更を行います。
最大表示行数/列数の変更
1 2 3 4 |
#最大表示行数のリセット pd.reset_option('display.max_rows') #まずリセット方法を覚えれば、気軽に設定変更ができます。 |
In [62]:
1 2 3 4 |
# 最大表示行数を変更する pd.set_option('display.max_rows', 4) df |
Out[62]:
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2021-10-14 | 12445.00 | 12555.00 | 12400.00 | 12555.00 | 2730400 |
2021-10-13 | 12295.00 | 12370.00 | 12215.00 | 12360.00 | 2869600 |
… | … | … | … | … | … |
2016-10-19 | 3378.47 | 3384.32 | 3313.22 | 3313.22 | 5844732 |
2016-10-18 | 3343.41 | 3381.38 | 3331.73 | 3381.38 | 6755501 |
1218 rows × 5 columns
1 2 |
#最大表示列数のリセット pd.reset_option('isplay.max_columns') |
In [64]:
1 2 3 4 |
#最大表示列数を変更する pd.set_option('display.max_columns', 3) df |
Out[64]:
Open | … | Volume | |
---|---|---|---|
Date | |||
2021-10-14 | 12445.00 | … | 2730400 |
2021-10-13 | 12295.00 | … | 2869600 |
… | … | … | … |
2016-10-19 | 3378.47 | … | 5844732 |
2016-10-18 | 3343.41 | … | 6755501 |
1218 rows × 5 columns
設定されている値の確認
1 2 |
#最大表示行数 pd.options.display.max_rows |
Out[65]:
1 |
4 |
1 2 |
#最大表示列数 pd.options.display.max_columns |
Out[66]:
1 |
3 |
1 2 |
<span class="c1">#すべてのオプションを表示</span> <span class="n">pd</span><span class="o">.</span><span class="n">describe_option</span><span class="p">()</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
compute.use_bottleneck : bool Use the bottleneck library to accelerate if it is installed, the default is True Valid values: False,True [default: True] [currently: True] compute.use_numba : bool Use the numba engine option for select operations if it is installed, the default is False Valid values: False,True [default: False] [currently: False] compute.use_numexpr : bool Use the numexpr library to accelerate computation if it is installed, the default is True Valid values: False,True [default: True] [currently: True] display.chop_threshold : float or None if set to a float value, all float values smaller then the given threshold will be displayed as exactly 0 by repr and friends. [default: None] [currently: None] #######この下は省略######### |
デフォルトの値と変更された値が表示されています。
(例)display.max_rows [default: 60] [currently: 4]
小数点以下の表示桁数の変更
1 2 3 4 |
#df.values pd.options.display.float_format = '{:.2f}'.format df |
Out[68]:
Open | … | Volume | |
---|---|---|---|
Date | |||
2021-10-14 | 12445.00 | … | 2730400 |
2021-10-13 | 12295.00 | … | 2869600 |
… | … | … | … |
2016-10-19 | 3378.47 | … | 5844732 |
2016-10-18 | 3343.41 | … | 6755501 |
1218 rows × 5 columns
データーフレームの並べ替え
1 2 |
#データーフレームを表示 df |
Open | … | Volume | |
---|---|---|---|
Date | |||
2021-10-14 | 12445.00 | … | 2730400 |
2021-10-13 | 12295.00 | … | 2869600 |
… | … | … | … |
2016-10-19 | 3378.47 | … | 5844732 |
2016-10-18 | 3343.41 | … | 6755501 |
1218 rows × 5 columns
列の値で並び替え
Open(始値)で並び替えましょう。
1 2 3 |
#df.sort_values(by='Open') df.sort_values('Open') |
Out[70]:
Open | … | Volume | |
---|---|---|---|
Date | |||
2016-11-08 | 3080.46 | … | 4786721 |
2016-12-05 | 3084.35 | … | 6917838 |
… | … | … | … |
2021-09-28 | 12870.05 | … | 4143220 |
2021-09-27 | 13159.37 | … | 3832900 |
1218 rows × 5 columns
降順に並び替え
1 2 3 4 |
#デフォルトは昇順。降順にしたい場合は引数ascendingをFalseにする df = df.sort_values('Open', ascending=False) df |
Out[71]:
Open | … | Volume | |
---|---|---|---|
Date | |||
2021-09-27 | 13159.37 | … | 3832900 |
2021-09-28 | 12870.05 | … | 4143220 |
… | … | … | … |
2016-12-05 | 3084.35 | … | 6917838 |
2016-11-08 | 3080.46 | … | 4786721 |
1218 rows × 5 columns
インデックスで並び替え
1 2 |
#sort_index デフォルトは昇順で並び替え df.sort_index() |
Out[72]:
Open | … | Volume | |
---|---|---|---|
Date | |||
2016-10-18 | 3343.41 | … | 6755501 |
2016-10-19 | 3378.47 | … | 5844732 |
… | … | … | … |
2021-10-13 | 12295.00 | … | 2869600 |
2021-10-14 | 12445.00 | … | 2730400 |
1218 rows × 5 columns
1 2 |
#降順に並び替えるなら、オプション ascending=False df.sort_index(ascending=False) |
Out[73]:
Open | … | Volume | |
---|---|---|---|
Date | |||
2021-10-14 | 12445.00 | … | 2730400 |
2021-10-13 | 12295.00 | … | 2869600 |
… | … | … | … |
2016-10-19 | 3378.47 | … | 5844732 |
2016-10-18 | 3343.41 | … | 6755501 |
1218 rows × 5 columns
行と列の入れ替え
1 2 |
#データーフレームの「行」「列」を入れ替える df.T |
Out[74]:
Date | 2021-09-27 | … | 2016-11-08 |
---|---|---|---|
Open | 13159.37 | … | 3080.46 |
High | 13169.35 | … | 3108.70 |
… | … | … | … |
Close | 12934.90 | … | 3101.86 |
Volume | 3832900.00 | … | 4786721.00 |
5 rows × 1218 columns
データ集計(groupby)
いよいよ、実用的な内容に入ります。
サンプルデーターとして、新たに日経平均株価を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#APIを使って株価データーを取得するためのライブラリー #pandas_datareader を web という名前でインポートします。 import pandas_datareader.data as web #ポーランドのstooqというAPIから日経平均株価(^NKX)を取得します。 df = web.DataReader('^NKX', 'stooq') ########################################################## #APIサーバー負荷軽減のため,2回目以降は保存したCSVファイルを読み込む。 # read_csvで,ファイル名"N225_fred.csv"のCSVデーターを読み込む #header=0csv 先頭行をヘッダーとして読み込むオプション(省略可能) #index_col='Date' インデックスの列を指定 #parse_dates=True datetime型を指定 #df = pd.read_csv('stooqNK225.csv', header=0,index_col='Date', parse_dates=True) ########################################################### #繰り返しデーターを取得してサーバーに負担を掛けては申し訳ないので、CSV形式で保存しておきます。 # to_csvで取得したデーターを"N225_fred.csv"という名前を付けて保存 df.to_csv("stooqNK225.csv") #データーフレームを表示させる df |
Out[75]:
Open | … | Volume | |
---|---|---|---|
Date | |||
2021-10-15 | 28787.26 | … | nan |
2021-10-14 | 28264.41 | … | 647531500.00 |
… | … | … | … |
2016-10-19 | 16952.91 | … | 1016683712.00 |
2016-10-18 | 16862.31 | … | 986431680.00 |
1220 rows × 5 columns
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#日付データーを扱うのでdatetimeをインポート import datetime #曜日を英語表記で表す df['weekday'] =df.index.strftime('%A') #曜日を英語表記(省略表記)で表す #df['weekday'] =df.index.strftime('%a') #曜日を数値で表す #df['weekday'] =df.index.weekday #データーフレームを表示 df |
Out[76]:
Open | … | weekday | |
---|---|---|---|
Date | |||
2021-10-15 | 28787.26 | … | Friday |
2021-10-14 | 28264.41 | … | Thursday |
… | … | … | … |
2016-10-19 | 16952.91 | … | Wednesday |
2016-10-18 | 16862.31 | … | Tuesday |
1220 rows × 6 columns
1 2 3 4 5 |
#終値から始値を引いて、その日の値幅を算出して、新しく作ったカラム(列)に登録します。 df['body'] = df['Close'] - df['Open'] #データーフレームを表示させます df |
Out[77]:
Open | … | body | |
---|---|---|---|
Date | |||
2021-10-15 | 28787.26 | … | 281.37 |
2021-10-14 | 28264.41 | … | 286.52 |
… | … | … | … |
2016-10-19 | 16952.91 | … | 46.00 |
2016-10-18 | 16862.31 | … | 101.30 |
1220 rows × 7 columns
曜日毎に集計する
日経平均株価の値動きに、曜日毎の差があるのでしょうか?
曜日毎の平均を集計
1 2 3 4 |
import pandas as pd #weekday(曜日)毎の平均 df[['weekday','body']].groupby('weekday').mean() |
Out[78]:
body | |
---|---|
weekday | |
Friday | -8.87 |
Monday | 4.74 |
Thursday | -11.27 |
Tuesday | 21.87 |
Wednesday | -2.66 |
5 rows × 1 columns
集計結果を見て見ましょう。
Thursday(木曜日):-11.27
Tuesday(火曜日): 21.87
木曜日の平均が大きくマイナス、火曜日の平均が大きくプラスです。
bodyは終値から始値を引いた値ですから、次の投資戦略を試してみたくなります。
木曜日は寄り付きで売って、引けで買い戻し。
火曜日は寄り付きで買って、引けで売る。
投資戦略のシミュレーション等はYoutubuの動画で詳しく解説するつもりです。
ご興味がある方は、チャンネル登録もご検討ください。
曜日毎の合計を算出
1 2 3 4 |
import pandas as pd #weekday(曜日)毎の合計 df[['weekday','body']].groupby('weekday').sum() |
body | |
---|---|
weekday | |
Friday | -2031.42 |
Monday | 1553.48 |
… | … |
Tuesday | 5129.52 |
Wednesday | -602.27 |
5 rows × 1 columns
データーの個数を数える
1 2 3 4 |
import pandas as pd #weekday(曜日)毎の個数 df[['weekday','body']].groupby('weekday').count() |
Out[80]:
body | |
---|---|
weekday | |
Friday | 249 |
Monday | 224 |
… | … |
Tuesday | 249 |
Wednesday | 251 |
5 rows × 1 columns
1 2 3 4 |
import pandas as pd #weekday(曜日)毎の個数(欠損値も含む) df[['weekday','body']].groupby('weekday').size() |
Out[81]:
1 2 3 4 5 6 7 |
weekday Friday 249 Monday 224 ... Tuesday 249 Wednesday 251 Length: 5, dtype: int64 |
最大値/最小値
1 2 3 4 |
import pandas as pd #weekday(曜日)毎の最大値 df[['weekday','body']].groupby('weekday').max() |
Out[82]:
body | |
---|---|
weekday | |
Friday | 621.87 |
Monday | 718.31 |
… | … |
Tuesday | 885.47 |
Wednesday | 1099.83 |
5 rows × 1 columns
1 2 3 4 |
import pandas as pd #weekday(曜日)毎の最小値 df[['weekday','body']].groupby('weekday').min() |
Out[83]:
body | |
---|---|
weekday | |
Friday | -787.72 |
Monday | -644.55 |
… | … |
Tuesday | -909.75 |
Wednesday | -1030.41 |
5 rows × 1 columns
複数の要素で集計する
データフレームの列を追加します。
1 2 |
#bodyの値がゼロ以上ならば、新しい列'UP_DOWN'に'UP'を入力 df.loc[df['body'] > 0, 'UP_DOWN'] = 'UP' |
1 |
df |
Out[85]:
Open | High | Low | Close | Volume | weekday | body | UP_DOWN | |
---|---|---|---|---|---|---|---|---|
Date | ||||||||
2021-10-08 | 28031.37 | 28319.42 | 28020.44 | 28048.94 | nan | Friday | 17.57 | UP |
2021-10-07 | 27911.36 | 28015.11 | 27641.13 | 27678.21 | 795512000.00 | Thursday | -233.15 | NaN |
2021-10-06 | 28033.91 | 28209.82 | 27293.62 | 27528.87 | 1001882800.00 | Wednesday | -505.04 | NaN |
2021-10-05 | 28050.39 | 28058.67 | 27460.66 | 27822.12 | 881941200.00 | Tuesday | -228.27 | NaN |
2021-10-04 | 29044.47 | 29044.47 | 28344.77 | 28444.89 | 764007300.00 | Monday | -599.58 | NaN |
… | … | … | … | … | … | … | … | … |
2016-10-17 | 16871.84 | 16954.44 | 16821.49 | 16900.12 | 951278912.00 | Monday | 28.28 | UP |
2016-10-14 | 16751.04 | 16866.56 | 16727.78 | 16856.37 | 1094052608.00 | Friday | 105.33 | UP |
2016-10-13 | 16923.82 | 16974.25 | 16739.73 | 16774.24 | 1110596352.00 | Thursday | -149.58 | NaN |
2016-10-12 | 16850.73 | 16951.54 | 16839.41 | 16840.00 | 1162963840.00 | Wednesday | -10.73 | NaN |
2016-10-11 | 16936.31 | 17074.46 | 16931.12 | 17024.76 | 1115804160.00 | Tuesday | 88.45 | UP |
1220 rows × 8 columns
1 2 |
#bodyの値がゼロ以下ならば、新しい列'UP_DOWN'に'DOWN'を入力 df.loc[df['body'] < 0, 'UP_DOWN'] = 'DOWN' |
1 |
df |
Open | High | Low | Close | Volume | weekday | body | UP_DOWN | |
---|---|---|---|---|---|---|---|---|
Date | ||||||||
2021-10-08 | 28031.37 | 28319.42 | 28020.44 | 28048.94 | nan | Friday | 17.57 | UP |
2021-10-07 | 27911.36 | 28015.11 | 27641.13 | 27678.21 | 795512000.00 | Thursday | -233.15 | DOWN |
2021-10-06 | 28033.91 | 28209.82 | 27293.62 | 27528.87 | 1001882800.00 | Wednesday | -505.04 | DOWN |
2021-10-05 | 28050.39 | 28058.67 | 27460.66 | 27822.12 | 881941200.00 | Tuesday | -228.27 | DOWN |
2021-10-04 | 29044.47 | 29044.47 | 28344.77 | 28444.89 | 764007300.00 | Monday | -599.58 | DOWN |
… | … | … | … | … | … | … | … | … |
2016-10-17 | 16871.84 | 16954.44 | 16821.49 | 16900.12 | 951278912.00 | Monday | 28.28 | UP |
2016-10-14 | 16751.04 | 16866.56 | 16727.78 | 16856.37 | 1094052608.00 | Friday | 105.33 | UP |
2016-10-13 | 16923.82 | 16974.25 | 16739.73 | 16774.24 | 1110596352.00 | Thursday | -149.58 | DOWN |
2016-10-12 | 16850.73 | 16951.54 | 16839.41 | 16840.00 | 1162963840.00 | Wednesday | -10.73 | DOWN |
2016-10-11 | 16936.31 | 17074.46 | 16931.12 | 17024.76 | 1115804160.00 | Tuesday | 88.45 | UP |
1220 rows × 8 columns
1 2 3 4 |
<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="c1">#weekday(曜日)毎の平均</span> <span class="n">df</span><span class="p">[[</span><span class="s1">'weekday'</span><span class="p">,</span> <span class="s1">'UP_DOWN'</span><span class="p">,</span> <span class="s1">'body'</span><span class="p">]]</span><span class="o">.</span><span class="n">groupby</span><span class="p">([</span><span class="s1">'weekday'</span><span class="p">,</span> <span class="s1">'UP_DOWN'</span><span class="p">])</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> |
body | ||
---|---|---|
weekday | UP_DOWN | |
Friday | DOWN | -132.65 |
UP | 117.94 | |
Monday | DOWN | -113.81 |
UP | 129.81 | |
Thursday | DOWN | -119.11 |
UP | 118.71 | |
Tuesday | DOWN | -143.43 |
UP | 140.43 | |
Wednesday | DOWN | -107.68 |
UP | 108.39 |
集計した要素がインデックスになっています。
インデックスにしたくない場合は、groupbyのas_indexという引数にFalseを渡します。
1 2 3 4 |
import pandas as pd #weekday(曜日)毎の平均 df[['weekday', 'UP_DOWN', 'body']].groupby(['weekday', 'UP_DOWN'],as_index=False).mean() |
weekday | UP_DOWN | body | |
---|---|---|---|
0 | Friday | DOWN | -132.65 |
1 | Friday | UP | 117.94 |
2 | Monday | DOWN | -113.81 |
3 | Monday | UP | 129.81 |
4 | Thursday | DOWN | -119.11 |
5 | Thursday | UP | 118.71 |
6 | Tuesday | DOWN | -143.43 |
7 | Tuesday | UP | 140.43 |
8 | Wednesday | DOWN | -107.68 |
9 | Wednesday | UP | 108.39 |
参考にさせていただいた、書籍や動画
◇参考文献
Pythonによるファイナンス(オライリージャパン)
Python3ではじめるシステムトレード(パンローリング)
◎公式ホームページのリンク
◇pandas公式ホームページ
https://pandas.pydata.org/docs/
◎参考にさせていただいたHP
◇matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
https://www.yutaka-note.com/entry/matplotlib_inline
◇【Python】曜日を取得する(英語&日本語)
https://qiita.com/_masa_u/items/e104d42bd6f200d3b959
◇pandasで時系列データの曜日や月、四半期、年ごとの合計や平均を算出
https://note.nkmk.me/python-pandas-time-series-multiindex/
◇【Python Coding】pandasの「isin」の使い方を解説【条件抽出が可能になる】
https://vector-ium.com/pandas-isin/
◇pandasのdescribeで各列の要約統計量(平均、標準偏差など)を取得
https://note.nkmk.me/python-pandas-describe/
◇pandasのオプション設定を確認・変更する方法
https://note.nkmk.me/python-pandas-option-setting/
◇pandasでブロック内だけで小数点以下の表示数を変更するの巻
https://vucavucalife.com/pandas-temporary-display-float-format-setting/
◇pandas入門 DataFrame excelファイルで入出力
https://www.python.ambitious-engineer.com/archives/1170
◇pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出
◇YouTube動画
Pythonの便利ライブラリ「Pandas入門講座」合併版|Pandasの基本的なこと3時間で学べます
◇udemy動画(有料)
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
この記事を書いた人
あしおゆたか
投資歴21年の個人投資家
机上の理論ではなく、実体験に基づいた記事作りをモットーにしています。
スポーツクラブに毎週2日~3日通い、サウナ後の暴飲暴食が趣味。(現在自粛中)
◇主な投資対象
日本株式
株式ETF(上場投資信託)
日経225先物
日経225先物オプション
◇運営者情報はこちら