乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

pandas

今回はPandas_Datareaderを使って
日本の株価を取得して分析する方法についてです。

解説動画はこちら


 
始めに


最近、日本の株価がバブル期並みの
高音を付けている様です。

この際
Pythonで株価のデータ分析が行える様に
なってみるのも面白いかと思います。

日本の株価を取得するには
pandas_datareaderというものを使います。

Google Colabであれば
最初から使えるので、こちらを使っていきましょう。


pandas_datareader


様々な金融商品のデータを取得する事ができます
その中でも、日本の株価は「stooq」というもので
ポーランドかどこかの会社のデータの様です。

こちらを取得して分析を始めていきましょう。


基本的な使い方はこのようになっています。
import pandas_datareader.data as web

web.DataReader(銘柄コード, data_source='stooq', start=開始日,end=終了日)
株価は銘柄ごとのデータになっているので
銘柄コードを指定して取得します。

データを取得するコードはこちら
# ライブラリのインポート
import os
import datetime as dt
import pandas_datareader.data as web
import plotly.graph_objects as go
import pandas as pd

# 銘柄コード入力(7203はトヨタ自動車)
code = "7203"
symbol = code + ".JP"

# 2023-01-01以降の株価取得
start , end = '2023-01-01', dt.date.today()

#データ取得
df = web.DataReader(symbol, data_source='stooq', start=start,end=end)
df.insert(0, "code", code, allow_duplicates=False)
df = df.sort_index()
df.tail(3)
スクリーンショット 2024-02-17 17.28.58

銘柄を変えたい場合は
codeの数字を変えて下さい。



株価から指標を計算してみる


ここからは取得したデータを使って
株価の分析に必要な指標を計算していきます。


移動平均
過去X日間の価格の平均値です
通常は終値を使います。


ボリンジャーバンド

移動平均を表す線と
その上下に値動きの幅を示す線を加えた指標で
「価格の大半がこの帯(バンド)の中に収まる」という
統計学を応用したテクニカル指標のひとつです。

+-1-3@までが一般的に良く用いられます。
@は標準偏差の様な意味合いです。

移動平均などの指標の計算
# 移動平均を計算する期間
period = 20

# 移動平均を計算
df[f'MA{period}'] = df['Close'].rolling(window=period).mean()

# ボリンジャーバンドを計算
std = df['Close'].rolling(window=period).std()
df['Upper Band1'] = df[f'MA{period}'] + 1 * std
df['Upper Band2'] = df[f'MA{period}'] + 2 * std
df['Upper Band3'] = df[f'MA{period}'] + 3 * std
df['Lower Band1'] = df[f'MA{period}'] - 1 * std
df['Lower Band2'] = df[f'MA{period}'] - 2 * std
df['Lower Band3'] = df[f'MA{period}'] - 3 * std

指標が計算できたら描画してみましょう。
描画には「Plotly」を用います。

これはライブで操作が出来る描画ライブラリで
静止画ではないので、色々な操作が行え捗ります。

# プロット用のデータを作成
data = [
    go.Candlestick(
        x=df.index,
        open=df['Open'],
        high=df['High'],
        low=df['Low'],
        close=df['Close'],
        name='株価',
    ),
    go.Scatter(x=df.index,y=df['Upper Band2'],mode='lines',name='+2@',),
    go.Scatter(x=df.index,y=df['Upper Band1'],mode='lines',name='+1@',),
    go.Scatter(x=df.index,y=df[f'MA{period}'],mode='lines',name='移動平均',),
    go.Scatter(x=df.index,y=df['Lower Band2'],mode='lines',name='-2@',),
    go.Scatter(x=df.index,y=df['Lower Band1'],mode='lines',name='-1@',),
]

# レイアウト設定
layout = go.Layout(
    title='株価の移動平均とボリンジャーバンド',
    xaxis=dict(
        title='日付',
        tickformat='%Y-%m-%d'
    ),
    yaxis=dict(title='株価'),
)

# グラフを描画
fig = go.Figure(data=data, layout=layout)
fig.show()
スクリーンショット 2024-02-17 17.29.13



ここからはテクニカル指標を
計算して描画していきましょう。
# RSIを計算する関数
def calculate_rsi(data, window=14):
    delta = data.diff()
    up = delta.copy()
    down = delta.copy()
    up[up < 0] = 0
    down[down > 0] = 0
    avg_gain = up.rolling(window).mean()
    avg_loss = abs(down.rolling(window).mean())
    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

# ストキャスティクスを計算する関数
def calculate_stochastic_oscillator(data, window=14):
    lowest_low = data.rolling(window).min()
    highest_high = data.rolling(window).max()
    stochastic_oscillator = (data - lowest_low) / (highest_high - lowest_low) * 100
    return stochastic_oscillator

# MACDを計算する関数
def calculate_macd(data, short_window=12, long_window=26, signal_window=9):
    short_ema = data.ewm(span=short_window, adjust=False).mean()
    long_ema = data.ewm(span=long_window, adjust=False).mean()
    macd = short_ema - long_ema
    signal_line = macd.ewm(span=signal_window, adjust=False).mean()
    histogram = macd - signal_line
    return macd, signal_line, histogram

# RSIを計算
df['RSI'] = calculate_rsi(df['Close'])

# ストキャスティクスを計算
df['%K'] = calculate_stochastic_oscillator(df['Close'])
df['%D'] = df['%K'].rolling(3).mean()

# MACDを計算
macd, signal_line, histogram = calculate_macd(df['Close'])
df['MACD'] = macd
df['Signal'] = signal_line
df['Histogram'] = histogram



MACD(移動平均収束拡散手法)
短期の移動平均線と中長期の移動平均線を使用することで
買いと売りを判断する手法です。

MACDは基本となる線(MACD線)
MACDの移動平均線である
シグナル線の推移でマーケットを判断

MACD線がシグナル線を上抜けると
ゴールデンクロス(買いタイミング)

MACD線がシグナル線を下抜けると
デッドクロス(売りタイミング)


# MACD
fig = go.Figure(
        data=[
                go.Candlestick(
                    x=df.index,
                    open=df['Open'],
                    high=df['High'],
                    low=df['Low'],
                    close=df['Close'],
                    name='株価',
                    yaxis='y1'
                ),
                go.Scatter(x=df.index, y=df['MACD'], line=dict(color='red', width=1), name="macd", yaxis='y2'),
                go.Scatter(x=df.index, y=df['Signal'], line=dict(color='blue', width=1), name="signal", yaxis='y2')
            ],
        layout = go.Layout(
                xaxis=dict(
                    title='日付',
                    tickformat='%Y-%m-%d'
                ),
                yaxis = dict(title='株価', side='left', showgrid=False, range=[df.Low.min(), df.High.max()]),
                yaxis2 = dict(title='指標', side='right', overlaying='y',
                              range=[min(df.Signal.min(), df.MACD.min()),
                              max(df.MACD.max(), df.Signal.max())]
                              )
        )
)
fig.show()
スクリーンショット 2024-02-17 17.29.28


RSI
「Relative Strength Index」の略で
日本語に訳すと「相対力指数」
買われすぎか、売られすぎかを判断するための指標です。

過去一定期間の上げ幅(前日比)の合計を
同じ期間の上げ幅の合計と下げ幅の合計を足した数字で割って
100を掛けたもの

一般的に70~80%以上で買われすぎ
20~30%以下で売られすぎと判断します。

# RSI
fig = go.Figure(
        data=[
                go.Candlestick(
                    x=df.index,
                    open=df['Open'],
                    high=df['High'],
                    low=df['Low'],
                    close=df['Close'],
                    name='株価',
                    yaxis='y1'
                ),
                go.Scatter(x=df.index, y=df['RSI'], line=dict(color='blue', width=1), name="RSI", yaxis='y2'),
            ],
        layout = go.Layout(
                xaxis=dict(
                    title='日付',
                    tickformat='%Y-%m-%d'
                ),
                yaxis = dict(title='株価', side='left', showgrid=False, range=[df.Low.min(), df.High.max()]),
                yaxis2 = dict(title='指標', side='right', overlaying='y',
                              range=[df.RSI.min(), df.RSI.max()]
                              )
        )
)
fig.show()
スクリーンショット 2024-02-17 17.29.38

ストキャスティクス

チャートは%K(Fast)と%D(Slow)の2本の線で表され
数値は0%から100%の範囲で推移します。

%Kラインは相場に対して敏感に動き
Dラインは%Kラインよりも遅く動きますが
より重要とされているのは%Dラインです。

一般的には20~30%以下で売られすぎ
70~80%以上で買われすぎと判断しますが
相場の勢いが強い場合には
20%や80%を突破することもあります。


# ストキャスティクス
fig = go.Figure(
        data=[
                go.Candlestick(
                    x=df.index,
                    open=df['Open'],
                    high=df['High'],
                    low=df['Low'],
                    close=df['Close'],
                    name='株価',
                    yaxis='y1'
                ),
                go.Scatter(x=df.index, y=df['%K'], line=dict(color='blue', width=1), name="%K", yaxis='y2'),
                go.Scatter(x=df.index, y=df['%D'], line=dict(color='red', width=1), name="%D", yaxis='y2')
            ],
        layout = go.Layout(
                xaxis=dict(
                    title='日付',
                    tickformat='%Y-%m-%d'
                ),
                yaxis = dict(title='株価', side='left', showgrid=False, range=[df.Low.min(), df.High.max()]),
                yaxis2 = dict(title='指標', side='right', overlaying='y',
                              range=[min(df['%K'].min(), df['%D'].min()),
                              max(df['%K'].max(), df['%D'].max())]
                              )
        )
)
fig.show()
スクリーンショット 2024-02-17 17.29.49


トレードシミュレーション

ここからは株価と指標を用いて
売買のシミュレーションを行ってみましょう。

MACDでエントリーポイントを決めて売買する
簡単なシミュレーションを行ってみます。

# トレードのシミュレーションを行う関数
def simulate_trades(df):
    positions = []  # トレードのポジション(買い or 売り)
    entry_prices = []  # エントリー価格
    exit_prices = []  # エグジット価格
    pnl = []  # 損益

    for i in range(len(df)):
        if i == 0:
            positions.append(None)
            entry_prices.append(None)
            exit_prices.append(None)
            pnl.append(None)
        else:
            if df['MACD'][i] > df['Signal'][i] and df['MACD'][i-1] <= df['Signal'][i-1]:
                # MACDがシグナルを上回った時に買いポジション
                positions.append('Buy')
                entry_prices.append(df['Close'][i])
                exit_prices.append(None)
                pnl.append(None)
            elif df['MACD'][i] < df['Signal'][i] and df['MACD'][i-1] >= df['Signal'][i-1]:
                # MACDがシグナルを下回った時に売りポジション
                positions.append('Sell')
                entry_prices.append(df['Close'][i])
                exit_prices.append(None)
                pnl.append(None)
            elif positions[-1] == 'Buy':
                # 買いポジションを保持している場合
                positions.append('Buy')
                entry_prices.append(entry_prices[-1])
                exit_prices.append(df['Close'][i])
                pnl.append(df['Close'][i] - entry_prices[-1])
            elif positions[-1] == 'Sell':
                # 売りポジションを保持している場合
                positions.append('Sell')
                entry_prices.append(entry_prices[-1])
                exit_prices.append(df['Close'][i])
                pnl.append(entry_prices[-1] - df['Close'][i])
            else:
                positions.append(None)
                entry_prices.append(None)
                exit_prices.append(None)
                pnl.append(None)

    df['Position'] = positions
    df['Entry Price'] = entry_prices
    df['Exit Price'] = exit_prices
    df['P&L'] = pnl
    return df

# トレードのシミュレーションを実行
df = simulate_trades(df)

結果を描画してみると

# プロット用のデータを作成
buy_indices = df[df['Position'] == 'Buy'].index
sell_indices = df[df['Position'] == 'Sell'].index

fig = go.Figure()

# Closeをプロット
fig.add_trace(go.Scatter(x=df.index, y=df['Close'], name='Close', mode='lines'))

# Entry Priceをプロット
fig.add_trace(go.Scatter(x=df.loc[buy_indices].index, y=df.loc[buy_indices]['Entry Price'],
                         name='Entry Price (BUY)', mode='markers', marker=dict(color='blue', size=8)))
fig.add_trace(go.Scatter(x=df.loc[sell_indices].index, y=df.loc[sell_indices]['Entry Price'],
                         name='Entry Price (SELL)', mode='markers', marker=dict(color='red', size=8)))

# Exit Priceをプロット
fig.add_trace(go.Scatter(x=df.loc[buy_indices].index, y=df.loc[buy_indices]['Exit Price'],
                         name='Exit Price (BUY)', mode='markers', marker=dict(color='blue', size=8, symbol='triangle-up')))
fig.add_trace(go.Scatter(x=df.loc[sell_indices].index, y=df.loc[sell_indices]['Exit Price'],
                         name='Exit Price (SELL)', mode='markers', marker=dict(color='red', size=8, symbol='triangle-down')))

# P&Lをプロット(二番目の軸)
fig.add_trace(go.Scatter(x=df.index, y=df['P&L'], name='P&L', mode='lines', yaxis='y2'))

# レイアウト設定
fig.update_layout(title='Trading Simulation',
                  xaxis_title='Date',
                  yaxis=dict(title='Price', side='left'),
                  yaxis2=dict(title='P&L', side='right', overlaying='y', showgrid=False),
                  legend=dict(x=0, y=1),
                  hovermode='x unified')

# グラフの表示
fig.show()
スクリーンショット 2024-02-17 17.28.45

こんな感じで、売買ポイントの可視化が出来ました。

今回は簡易なデータ取得と
分析手法になっているので
気軽に始められるかと思います。

色々試してみて下さいね
それでは。


今回はデータでレースを行う
データレースを作る方法についてです。


解説動画はこちら



このデータレースというのは
良くYoutubeでも見かける
データを使ったレース動画のことで

時系列データを用いて
棒グラフの増減をレースの様に
見せる形式の動画のことです。

flourish

などで作成するのが有名かと思います。

今回はこれを
Python言語でやってみましょう。


Python言語では
bar_chart_race
というライブラリでこれを実現できます。



bar_chart_raceのインストール

Google Colab上では
こちらのコマンドでインストールが実行できます。
!pip install bar_chart_race
!pip install japanize-matplotlib

日本語を用いたデータレースを行いたい場合は
japanize-matplotlibも合わせて
インストールする必要があります。


ライブラリの読み込み

こちらのコードで
ライブラリ読み込みができます。
import pandas as pd
import bar_chart_race as bcr
import japanize_matplotlib

サンプルデータで試してみる

 
ライブラリには最初から
サンプルデータが付属しているようなので
これを読み込んでみます。
# サンプルデータ読み込み
df = bcr.load_dataset('covid19')

# データのサイズ
print(df.shape)
(52 , 20)


データ構造について

bar_chart_race
で使えるデータ構造は決まっていて
次の3つのデータが必要です。

・日付(インデックス)
・カテゴリ値(カラム名)
・値(数値)



動画の作成

次のコードで動画を作成できます。
# 動画の生成
bcr.bar_chart_race(
    df=df,
    filename='ファイル名.mp4',
)
作成した動画は
Colabのファイル置き場に保存されます。

再生するとこんな感じの
動画が出来るかと思います。

スクリーンショット 2024-01-13 17.11.49


設定できるパラメータ


bcr.bar_chart_raceの引数には
色々なパラメータを付与できます。
period_length : 動画の長さ
fixed_max : 最大値を固定するかどうか
fixed_order : 順位を固定するかどうか
n_bars : 表示する順位の個数
steps_per_period : 1stepあたりの数

この辺りを付ければ
自分の理想のレース動画が
出来ると思います。

詳しいパラメータ設定は
公式ドキュメントをご確認くださいね。


今回は少し古いネタですが
データレースの作り方をお伝えしました
それでは。


たまには真面目に
仕事で使えそうなプログラミングをしてみましょう


解説動画はこちら


 

1.WEB上にあるCSVファイルを開く

今回はWEB上にあるファイルを
ダウンロードせず、直接開いてみましょう。


読み込みするファイルは、総務省かどっかが出している
E-statのデータです。

男女別人口-全国,都道府県(大正9年~平成27年)
file_url ='https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031524010&fileKind=1'

これを読み込みするには
Pandasライブラリを使います。
import pandas as pd
import warnings
warnings.simplefilter('ignore')

df = pd.read_csv(file_url , encoding='cp932')

df
スクリーンショット 2022-08-06 17.20.11

読み込みは出来ましたが
最後の方にゴミが載っています。


政府が用意しているデータは
リテラシーが低く、ゴミなので
そのままだと使えないことが多いです。

いらない部分を読み飛ばしてみましょう

skipfooter = 最後尾の行数
を加えるといらない部分を飛ばして読み込み出来ます。

df = pd.read_csv(file_url , encoding='cp932', engine="python" , skipfooter=2)

df
スクリーンショット 2022-08-06 17.20.42




Pandasライブラリを用いないで読み込みする場合は
urllibが使えます。

urllib.request.urlopenで開いたファイルは
http.client.HTTPResponseオブジェクトになります

オブジェクト.decode()で
strオブジェクトに変換できます。

import urllib

# そのままurlopenで開いた場合
with urllib.request.urlopen(file_url) as _f:
    for row in _f:
        print(row)
        break
b'"\x93s\x93\xb9\x95{\x8c\xa7\x83R\x81[\x83h","\x93s\x93\xb9\x95{\x8c\xa7\x96\xbc","\x8c\xb3\x8d\x86","\x98a\x97\xef\x81i\x94N\x81j","\x90\xbc\x97\xef\x81i\x94N\x81j","\x92\x8d","\x90l\x8c\xfb\x81i\x91\x8d\x90\x94\x81j","\x90l\x8c\xfb\x81i\x92j\x81j","\x90l\x8c\xfb\x81i\x8f\x97\x81j"\r\n'
# urlopenで開いてdecodeした場合
with urllib.request.urlopen(file_url) as _f:
    for row in _f:
        print(row.decode('cp932'))
        break
"都道府県コード","都道府県名","元号","和暦(年)","西暦(年)","注","人口(総数)","人口(男)","人口(女)"


リストでまとめて読み込んでしまう場合は
次のように書けばいけます。
# urlopenで開いてlist化する
with urllib.request.urlopen(file_url) as _f:
    # 改行コードで分割する
    lines = _f.read().decode('cp932').split('\r\n')
    
lines
['"都道府県コード","都道府県名","元号","和暦(年)","西暦(年)","注","人口(総数)","人口(男)","人口(女)"', '"00","全国","大正",9,1920,"",55963053,28044185,27918868',・・・

ゴミデータが最後の3個に入ってしまっているので
リストのスライス参照で取り除くと良いでしょう。
lines[970:-3]

これでpandasでは難しい1行単位での
データ操作を行えます。



2.データを見る

さて、ファイルが読み込めたので
次は中身を細かくみてみましょう。

ファイルはこんな感じになっています。
スクリーンショット 2022-08-06 17.29.16




全国の人口だけを見る
df[df['都道府県名']=='全国'][['西暦(年)','人口(総数)']]
スクリーンショット 2022-08-06 17.29.33

Pandasのデータフレームでは
条件抽出が行えるので
該当する部分だけを抜き出すことができます。



最近のものだけを見る(2010 , 2015)
df[df['西暦(年)'].isin([2010,2015])][['西暦(年)','都道府県名','人口(総数)']]
スクリーンショット 2022-08-06 17.29.52

isin で値を複数指定して
条件抽出ができます。



2010 , 2015の差分を見る
# 該当年のデータを抽出
df_2010 = df[df['西暦(年)']==2010][['西暦(年)','都道府県名','人口(総数)']]
df_2015 = df[df['西暦(年)']==2015][['西暦(年)','都道府県名','人口(総数)']]

# インデックスのリセット
df_2010.reset_index( inplace=True , drop=True)
df_2015.reset_index( inplace=True , drop=True)

# データフレームの結合
df_concat = pd.concat([df_2010 , df_2015[['人口(総数)']]],axis=1)
df_concat.columns = ['西暦(年)', '都道府県名', '2010_人口(総数)', '2015_人口(総数)']

# 差分の計算
df_concat['差分'] = df_concat['2015_人口(総数)'].astype(int) - df_concat['2010_人口(総数)'].astype(int)
df_concat['増減'] = df_concat['差分'].apply(lambda x: '減少' if x <=0 else '増加')

# 人口が増加した都道府県は?
df_concat[df_concat['増減']=='増加']
スクリーンショット 2022-08-06 17.32.34

差分を見るには
まずはデータフレームとして該当するデータを
年ごとに作成しておき
それを列方向に結合させます。

のちに数値化して差分を計算することができます。

2010 - 2015で
人口が増えた都道府県は8個しか無いようですね
2020年度のデータがなかったようですが
人口は減る傾向にあります



東京都の人口推移
df_plot = df[df['都道府県名']=='東京都'][['西暦(年)','人口(総数)']]
df_plot.reset_index( inplace=True , drop=True)

df_plot['人口(総数)'] = df_plot['人口(総数)'].astype(int)
df_plot['西暦(年)'] = df_plot['西暦(年)'].astype(str)

df_plot.plot(kind='line',x='西暦(年)')
スクリーンショット 2022-08-06 17.32.44
最後に東京都だけを抜き出して
人口推移を見ます

データフレームをそのまま
折れ線グラフに描画することが出来ます

東京都の人口は100年前は400万人弱
1945年に大きく減り
そこから猛烈な勢いで1970年頃までは急成長

1995年以降また増え続けています
こういうのをささっと作ることができるのが
Pythonの強みですね




まとめ

Google Colabなどを使えば
Pythonをインストールしなくても
PC上からファイル操作を行えます

エクセルなどで開けない
ファイルが有るときは
是非Pythonを活用してみましょう。

それでは

最近感染が拡大しているということで
最新のコロナ関連のデータを見てみましょう。

解説動画はこちら



今回参考にさせていただくデータは
東洋経済さんのサイトのデータです。

それも厚生労働省のオープンデータが元になっていますが
サイトからダウンロードすることができます。

東洋経済さんのサイト

こちらのデータを元にして
現状を見てみることにしましょう。

まずはデータの読み込みです。
こちらのコードで直接データフレームに
データを読み込むことができます。

import pandas as pd

url = 'https://toyokeizai.net/sp/visual/tko/covid19/csv/prefectures.csv'
df = pd.read_csv(url)
df.head()
スクリーンショット 2021-07-31 17.21.16


集計したりするには
少しデータの形がアレなので
データをきれいに整形します。

def to_date(d):
    return pd.to_datetime('{0:02}/{1:02}/{2:02}'.format(d['year'],d['month'],d['date']),format='%Y/%m/%d')

# 日付に直す
df['days'] = df.apply(to_date, axis=1)

# 値の補完
df['deaths'] =  df['deaths'].str.replace('-','0')
df['serious'] =  df['serious'].str.replace('-','0')

# Null値の補完
df = df.fillna(0)

# 型変換
df['deaths'] =  df['deaths'].astype(int)
df['serious'] =  df['serious'].astype(int)
df['peopleTested'] =  df['peopleTested'].astype(int)
df['hospitalized'] =  df['hospitalized'].astype(int)
df['discharged'] =  df['discharged'].astype(int)

# 必要なカラムのみに絞る
df = df[['days','prefectureNameJ', 'peopleTested', 'testedPositive','discharged', 'hospitalized', 'serious', 'deaths' ]]

df.head()
スクリーンショット 2021-07-31 17.23.00

だいぶ綺麗になりましたね。

これを使って色々集計してみることにしましょう。
こちらのデータは累計データのようです。

まずは都道府県別の累計感染者数を
見てみることにしましょう。

df.groupby('prefectureNameJ').max().sort_values('testedPositive',ascending=False)
スクリーンショット 2021-07-31 17.25.09

2021年7月29までのデータで
感染者数の多い順で都道府県別の累計数を見ています。

東京や大阪、神奈川が多いのは
人口比どうりかと思いますが
沖縄とかも増えてきていますね。


次は色々な率を見てみます。
まずは全国の率を見てみます。

df['陽性率'] =  df['testedPositive'] / df['peopleTested'] * 100
df['復帰率'] = df['discharged'] / df['testedPositive'] * 100
df['療養率'] = df['hospitalized'] / df['testedPositive'] * 100
df['重症化率'] = df['serious'] / df['testedPositive'] * 100
df['死亡率'] = df['deaths'] / df['testedPositive'] * 100
days = '2021-07-29'
df2 = df[['prefectureNameJ','peopleTested','testedPositive','discharged','hospitalized','serious','deaths','陽性率','復帰率','療養率','重症化率','死亡率']][df['days']==days]

df3 = pd.DataFrame(data=df2[['peopleTested','testedPositive','discharged','hospitalized','serious','deaths']].sum())
df3 = df3.T
df3['陽性率'] =  df3['testedPositive'] / df3['peopleTested'] * 100
df3['復帰率'] = df3['discharged'] / df3['testedPositive'] * 100
df3['療養率'] = df3['hospitalized'] / df3['testedPositive'] * 100
df3['重症化率'] = df3['serious'] / df3['testedPositive'] * 100
df3['死亡率'] = df3['deaths'] / df3['testedPositive'] * 100

df3
スクリーンショット 2021-07-31 17.28.51

累計感染者数は90万人弱
累計死亡者数は15166人で
死亡率だと1.68%ほどになります。

参考として2018年の
インフルエンザの感染者が1200万人
死亡者は3325人ということでしたので
そこから計算すると死亡率は0.027%
コロナの方が60倍も高いことになってしまいます。

次のコードで率の高いところを出すことができます。

PCR検査の陽性率は??
df2[['prefectureNameJ','peopleTested','testedPositive','陽性率']].sort_values('陽性率',ascending=False)
死亡者の割合が高いところは?
df2[['prefectureNameJ','testedPositive','deaths','死亡率']].sort_values('死亡率',ascending=False)

最後に最近では感染者が拡大傾向にあるということで
直近の60日間の動向から年末まで
このままいくとどうなるかを予測してみました。

こちらはfbprophetを使うので
インストールしていない人は
インストールなどが必要です。
(要pip install)


ライブラリの読み込みと学習データに整形します。
from fbprophet import Prophet
import warnings
warnings.simplefilter('ignore')

tmp_df = df[['days','testedPositive','discharged','hospitalized','serious','deaths']].groupby('days').sum()
tmp_df = tmp_df.reset_index()
tmp_df.head()

まずは感染者数の推移を予測します。
model = Prophet()
model_df = tmp_df.rename(columns={'days':'ds','testedPositive':'y'})
model.fit(model_df.tail(60))

future_df = model.make_future_dataframe(150)
forecast = model.predict(future_df)
model.plot(forecast)
download
7月に入ってからの感染者数が増えてきています。
年末までこのままのペースだと160万人
最悪180万人ほどにもなる見込みです。


次に死亡者の推移を予測してみます。
model = Prophet()
model_df = tmp_df.rename(columns={'days':'ds','deaths':'y'})
model.fit(model_df.tail(60))

future_df = model.make_future_dataframe(150)
forecast = model.predict(future_df)
model.plot(forecast)
downloadのコピー

死亡者は最近おちついてきている傾向です。
感染拡大が続いても今のペースが続くなら
そこまでの死亡者が出ない予測になっていますが
油断は禁物です。



まとめです。

2021年7月29日までの感染者数は90万人ほどで
うち死亡者は15166人で死亡率1.68%

感染拡大が広がっているが、現状のまま進むと
2021年内には累計160万人が感染し
死亡者累計1万7千人ほどになる見込みです。

ワクチンを打ってもかかる人はいます。
過去に感染しても再感染する人もいます。

正直な所
強めの風邪なんじゃないかと思います。

何も打つ手が無さそうなので
人の多いところに行かないで
静かに生活するしかなさそうですね。

データは日々更新されていきますが
このコードを使えば簡単に見れますので
興味のある方は見てみて下さい。

それでは。



今回はドラマ
孤独のグルメで紹介された
お店のデータを集めてみました。

解説動画はこちら

 


今回使用したデータはこちらです。

なお当方で集めたデータであるため
誤りがある可能性もありますのでご注意下さい。

お店に行かれる際は事前に調べてくださいね。

シーズンタイトル都道府県店名ジャンル
1【第1話】 江東区門前仲町のやきとりと焼めし東京都『庄助』焼鳥
1【第2話】 豊島区駒込の煮魚定食東京都『和食亭』小料理、魚介料理、居酒屋
1【第3話】 豊島区池袋の汁なし担々麺東京都『中国家庭料理 楊 2号店』四川料理、担々麺、餃子
1【第4話】 千葉県浦安市の静岡おでん千葉県『LocoDish』(閉店)カフェ、おでん、お酒
1【第5話】 杉並区永福の親子丼と焼うどん東京都『つり堀 武蔵野園』定食・食堂
1【第6話】 中野区鷺ノ宮のロースにんにく焼き東京都『みやこや』とんかつ、定食、食堂
1【第7話】 武蔵野市吉祥寺喫茶店のナポリタン東京都『カヤシマ』喫茶店、居酒屋、洋食
1【第8話】 神奈川県川崎市八丁畷の一人焼肉神奈川県『つるや』焼肉、ジンギスカン
1【第9話】 世田谷区下北沢の広島風お好み焼東京都『ヒロキ』お好み焼き、鉄板焼き
1【第10話】 豊島区東長崎のしょうが焼目玉丼東京都『せきざわ食堂』(閉店)定食・食堂
1【第11話】 文京区根津飲み屋さんの特辛カレー東京都『すみれ』居酒屋
1【第12話】 目黒区中目黒ソーキそばとアグー豚の天然塩焼き東京都『草花木果(そーかぼっか)』居酒屋、鍋、沖縄料理
2【第1話】 神奈川県川崎市新丸子のネギ肉イタメ神奈川県『三ちゃん食堂』定食、中華料理、居酒屋
2【第2話】 中央区日本橋人形町の黒天丼東京都『天ぷら 中山』天ぷら、天丼・天重
2【第3話】 中野区沼袋のわさびカルビと卵かけご飯東京都『平和苑』焼肉
2【第4話】 群馬県邑楽郡大泉町のブラジル料理群馬県『レストラン ブラジル』ブラジル料理、ステーキ
2【第5話】 横浜市白楽の豚肉と玉ねぎのにんにく焼き神奈川県『キッチン友』洋食、定食・食堂
2【第6話】 江戸川区京成小岩の激辛四川料理東京都『四川家庭料理 珍々』四川料理、中華料理、火鍋
2【第7話】千葉県旭市飯岡のサンマのなめろうと蛤の酒蒸し千葉県『つちや食堂』(閉店)定食・食堂、魚介料理
2【第8話】 墨田区両国の一人ちゃんこ鍋東京都『割烹ちゃんこ 大内』割烹、ちゃんこ鍋
2【第9話】 江東区砂町銀座を経て事務所飯東京都『砂町銀座商店街』NaN
2【第10話】 北区十条の鯖のくんせいと甘い玉子焼東京都『田や』居酒屋
2【第11話】 足立区北千住のタイカレーと鶏の汁なし麺東京都『ライカノ』タイ料理、タイカレー
2【第12話】 東京都三鷹市のお母さんのコロッケとぶり大根東京都『お食事 樹』親子丼、定食・食堂
3【第1話】 北区赤羽のほろほろ鳥とうな丼東京都『川栄』うなぎ、鳥料理
3【第2話】 神奈川県横浜市日ノ出町のチートのしょうが炒めとパタン神奈川県『第一亭』台湾料理、ホルモン、中華麺
3【第3話】 静岡県賀茂郡河津町の生ワサビ付わさび丼静岡県『わさび園かどや』和食
3【第4話】 文京区江戸川橋の魚屋さんの銀だら西京焼き東京都『魚谷』居酒屋、魚介料理
3【第5話】 中野区東中野の羊の鉄鍋とラグマン東京都『キャラヴァンサライパオ』西アジア料理、お酒
3【第6話】 板橋区板橋のホルモン焼き東京都『山源』ホルモン、焼肉
3【第7話】 目黒区駒場東大前のマッシュルームガーリックとカキグラタン東京都『ボラーチョ(BORRACHO)』洋食、地中海料理
3【第8話】 台東区鶯谷のアボカド鶏メンチと鳥鍋めし東京都『鳥椿 鶯谷朝顔通り店』居酒屋、焼鳥
3【第9話】 練馬区小竹向原のローストポークサンドイッチとサルシッチャ東京都『まちのパーラー』パン、カフェ
3【第10話】 荒川区西尾久の炎の酒鍋と麦とろ飯東京都『どん平』とんかつ、居酒屋
3【第11話】 新潟県十日町市ドライブインの牛肉の煮込みと五目釜めし新潟県『峠の茶屋 蔵』釜飯、天丼・天重
3【第12話】 品川区大井町いわしのユッケとにぎり寿司東京都『だるまや』魚介料理、居酒屋
4【第1話】 東京都清瀬市のもやしと肉のピリ辛イタメ東京都『みゆき食堂』定食・食堂
4【第2話】 中央区銀座の韓国風天ぷらと参鶏湯ラーメン東京都『なじみ亭』韓国料理
4【第3話】 神奈川県足柄下郡箱根町のステーキ丼神奈川県『いろり家』居酒屋
4【第4話】 東京都八王子市小宮町のヒレカルビとロースすき焼き風東京都『大幸園』焼肉、ホルモン
4【第5話】 愛知県知多郡日間賀島のしらすの天ぷらとたこめし愛知県『乙姫』魚介料理・海鮮料理
4【第6話】 東京都江東区木場のチーズクルチャとラムミントカレー東京都『カマルプール』インド料理、インドカレー
4【第7話】 台東区鳥越の明太クリームパスタとかつサンド東京都『まめぞ』居酒屋、和食
4【第8話】 杉並区阿佐ヶ谷のオックステールスープとアサイーボウル東京都『YO-HO’s cafe Lanai』ハワイ料理、カフェ
4【第9話】 渋谷区神宮前の毛沢東スペアリブと黒チャーハン東京都『シャンウェイ』四川料理
4【第10話】 江東区枝川のハムエッグ定食とカツ皿東京都『レストラン アトム』(閉店)定食・食堂、喫茶店
4【第11話】 大田区蒲田の海老の生春巻きととりおこわ東京都『THITHI(ティティ)』ベトナム料理、カレー
4【第12話】 渋谷区恵比寿の海老しんじょうと焼おにぎり東京都『さいき』居酒屋
5【第1話】 神奈川県川崎市稲田堤のガーリックハラミとサムギョプサル神奈川県『寿苑』焼肉
5【第2話】 江東区清澄白河のポパイベーコンとサンマクンセイ刺東京都『だるま』居酒屋、串焼き、魚介料理
5【第3話】 杉並区西荻窪のラム肉のハンバーグと野菜のクスクス東京都『tamtamu(タムタム)』アフリカ料理、鍋
5【第4話】 台湾宜蘭県羅東の三星葱の肉炒めと豚肉の紅麹揚げ台湾『全台小吃部』(閉店)NaN
5【第5話】 台湾台北市永楽市場の鶏肉飯と乾麺台湾『永樂小吃(永樂担仔麺)』NaN
5【第6話】 東京都目黒区大岡山の魚定食となめろう冷茶漬東京都『九絵』魚介料理、日本酒バー
5【第7話】 東京都世田谷区千歳船橋のラム肩ロースとラムチョップ東京都『まーさん』ジンギスカン、居酒屋
5【第8話】東京都渋谷区代々木上原のエマダツィとパクシャパ東京都『ガテモタブン』南アジア料理、エスニック料理
5【第9話】 千葉県いすみ市大原のブタ肉塩焼きライスとミックスフライ千葉県『源氏食堂』(閉店)定食・食堂
5【第10話】 東京都江東区亀戸の純レバ丼東京都『菜苑(さいえん)』中華料理、定食・食堂
5【第11話】 埼玉県越谷市せんげん台のアメリカンソースのオムライスとカキのムニエル埼玉県『厨 Sawa』シチュー、オムライス
5【第12話】 東京都豊島区西巣鴨の一人すき焼き東京都『じゃぶ辰』しゃぶしゃぶ、すき焼き
6【第1話】 大阪府美章園のお好み焼き定食と平野の串かつ大阪府『甘辛や』お好み焼き、鉄板焼き
6【第2話】 東京都新宿区淀橋市場の豚バラ生姜焼定食東京都『伊勢屋食堂』定食・食堂
6【第3話】東京都目黒区三田のチキンと野菜の薬膳スープカレー東京都『薬膳スープカレー シャナイア』スープカレー、エスニック料理
6【第4話】東京都東大和市の上タンシオとカイノミ東京都『翠苑』(閉店)焼肉
6【第5話】東京都世田谷区太子堂の回転寿司東京都『すし台所屋 三軒茶屋店』回転寿司
6【第6話】東京都新宿区高田馬場のシャン風豚高菜漬炒めと牛スープそば東京都『ノング・インレイ』ジャンル :東南アジア料理、お酒
6【第7話】東京都渋谷区道玄坂の皿うどんと春巻き東京都『長崎飯店 渋谷店』中華料理、ちゃんぽん
6【第8話】東京都台東区御徒町のラム肉長葱炒めとスペアリブ東京都『洋香味坊(やんしゃんあじぼう)』中華料理
6【第9話】東京都品川区旗の台のサルスエラとイカ墨のパエリア東京都『スペイン食堂 石井』スペイン料理、ワインバー
6【第10話】千葉県富津市金谷のアジフライ定食千葉県『漁師めし はまべ』魚介料理、定食・食堂
6【第11話】東京都文京区茗荷谷の冷やしタンタン麺と回鍋肉東京都『豊栄(ほうえい)』中華料理、四川料理
6【第12話】東京都品川区五反田の揚げトウモロコシと牛ご飯東京都『食堂とだか』郷土料理、居酒屋、割烹
7【第1話】埼玉県上尾市本町の肩ロースかつ定食埼玉県『キセキ食堂』ステーキ、とんかつ
7【第2話】東京都世田谷区経堂の一人バイキング東京都『マッシーナ メッシーナ』定食・食堂
7【第3話】東京都港区南麻布のチョリソのケソフンディードと鶏肉のピピアンベルデ東京都『サルシータ』メキシコ料理
7【第4話】群馬県甘楽群下仁田町のタンメンと豚すき焼き群馬県『一番』定食・食堂、ラーメン
7【第4話】群馬県甘楽群下仁田町のタンメンと豚すき焼き群馬県『コロムビア』すき焼き
7【第5話】東京都荒川区三河島の緑と赤の麻婆豆腐東京都『眞実一路(シンジツイチロ)』中華料理
7【第6話】千葉県浦安市の真っ黒な銀だらの煮付定食千葉県『羅甸(らてん)』割烹、小料理
7【第7話】東京都墨田区東向島の納豆のピザと辛いパスタ東京都『カトリカ』ピザ、パスタ
7【第8話】東京都中野区百軒横丁のチキン南蛮と地鶏もも串東京都『泪橋(なみだばし)』焼鳥、焼きとん、居酒屋
7【第9話】韓国チョンジュ市の納豆チゲとセルフビビンバ韓国『토방(トバン)』韓国料理、定食
7【第10話】韓国ソウル特別市の骨付き豚カルビとおかずの群れ韓国『종점숯불갈비(チョンチョムスップルカルビ)』韓国料理、焼肉
7【第11話】千葉県千葉市の特性ニンニクスープと生鮭のバター焼き千葉県『味のレストラン えびすや 幸町店』洋食、西洋各国料理
7【第12話】東京都中央区八丁堀のニラ玉ライスとエビチリ東京都『中華シブヤ』(閉店)中華料理
8【第1話】神奈川県横濱中華街の中華釜飯と海老雲呑麺神奈川県『南粤美食(ナンエツビショク)』中華料理
8【第2話】東京都杉並区高井戸のタンステーキとミートパトラ東京都『EAT』(休業)洋食、ステーキ
8【第3話】東京都中央区日比谷銀座のBarのロールキャベツ定食東京都『四馬路』定食、洋食
8【第4話】埼玉県新座市の肉汁うどんと西東京市ひばりが丘のカステラパンケーキ埼玉県『うどんや藤』うどん、串揚げ
8【第4話】埼玉県新座市の肉汁うどんと西東京市ひばりが丘のカステラパンケーキ東京都『コンマ コーヒー』(閉店)カフェ
8【第5話】群馬県藤岡市の一人ロースター焼肉群馬県『宝来軒』焼肉、ホルモン
8【第6話】東京都台東区浅草のローストポークのサラダとチムチュム東京都『イサーン』タイ料理、居酒屋
8【第7話】神奈川県鎌倉市由比ヶ浜のドイツ風サバの燻製とスペアリブ神奈川県『シーキャッスル』ドイツ料理、ケーキ
8【第8話】鳥取県鳥取市のオーカクとホルモンそば鳥取県『まつやホルモン店』ホルモン、焼きそば
8【第9話】東京都千代田区御茶ノ水の南インドカレー定食とガーリックチーズドーサ東京都『三燈舎』インド料理、カレー
8【第10話】東京都世田谷区豪徳寺のぶりの照焼き定食とクリームコロッケ東京都『旬彩魚 いなだ』魚介料理、海鮮料理
8【第11話】神奈川県川崎市武蔵小杉の一人ジンギスカン神奈川県『ジンギスカン どぅー』ジンギスカン
8【第12話】東京都台東区三ノ輪のカツ丼と冷やし麻婆麺東京都『やよい』洋食、中華


場所は東京がすごく多く3回に2回は東京
たまーに地方遠征が有りますねえ。

千葉や神奈川もたまにありますね。

ジャンルは結構色々なジャンルを攻めていますが
居酒屋がかなり多いですね。

焼肉を食べているイメージが
すごく強いものの、全体的には
1割ほどの登場でした。

データから見ると
ゴローさんは
国際色豊かな食通
そんな感じでしょうかね

データを集めてたら
お腹空いてきましたんで
今日はこれにて終了です!!!

それでは。


このページのトップヘ