こんにちは、JS2IIUです。Panelでどんなことが出来るのか、事例を交えて紹介しています。今回は応用編第5回です。よろしくお願いします。
はじめに
リアルタイムで更新されるデータを可視化するダッシュボードは、株価モニタリング、IoTデバイスの監視、天気データのトラッキングなど、多くの用途に使われます。Panelを使うと、APIやWebSocket、データベースなどからのライブデータを簡単に統合し、リアルタイムダッシュボードを構築することができます。本記事では、APIから取得したデータやWebSocketを利用したライブデータのダッシュボードを構築する方法を解説します。
ライブデータの基本: APIを利用したデータの取得
まずは、シンプルなAPIからデータを定期的に取得し、そのデータをPanelで可視化する例を見ていきましょう。今回は、例として架空の株価APIからデータを取得し、リアルタイムに更新されるグラフを表示します。サービスが異なっても基本的にこのようなスタイルで対応できるはずです。
import panel as pn
import holoviews as hv
import requests
import time
import pandas as pd
pn.extension('holoviews')
# データ取得用の関数
def get_stock_data():
# 例: 架空のAPIからデータを取得
response = requests.get("https://api.example.com/stock_prices")
data = response.json()
df = pd.DataFrame(data)
return df
# 初期データ
df = get_stock_data()
# 初期プロット
curve = hv.Curve((df['time'], df['price']), 'Time', 'Price')
# Panelのコンポーネントとして設定
pane = pn.pane.HoloViews(curve, sizing_mode='stretch_width')
# 定期的にデータを更新する関数
def update_data():
global df, curve
df = get_stock_data()
curve = hv.Curve((df['time'], df['price']), 'Time', 'Price')
pane.object = curve
# 1分ごとにデータを更新
pn.state.add_periodic_callback(update_data, 60000)
# Panelレイアウトの表示
pn.Column(pane).show()
requests.get()でAPIからデータを取得し、pandas.DataFrameに変換しています。この例では、timeとpriceの2つのカラムを持つ株価データを仮定しています。hv.Curve()を使って、時間と価格をプロットし、初期グラフを作成します。pn.pane.HoloViews()は、HoloViewsのプロットをPanelのUIに埋め込むために使います。pn.state.add_periodic_callback()で、1分ごとにデータを取得してグラフを更新しています。
これにより、APIから1分ごとに最新のデータを取得し、それをリアルタイムで表示するダッシュボードが完成します。
pandas-datareaderを使った例
以下は、pandas-datareaderを使用してYahoo Financeからリアルタイムの株価データを取得し、Panelを使って定期的に更新されるグラフを表示するコードに修正した例です。pandas-datareaderはインストールが必要です。
pip install pandas-datareader
import panel as pn
import holoviews as hv
import pandas_datareader.data as web
import pandas as pd
import datetime
pn.extension('holoviews')
# データ取得用の関数
def get_stock_data():
end = datetime.datetime.now()
start = end - datetime.timedelta(days=30) # 過去30日間のデータを取得
df = web.DataReader('AAPL', 'yahoo', start, end) # Appleの株価データを取得
df.reset_index(inplace=True)
return df
# 初期データ
df = get_stock_data()
# 初期プロット
curve = hv.Curve((df['Date'], df['Close']), 'Date', 'Close Price')
# Panelのコンポーネントとして設定
pane = pn.pane.HoloViews(curve, sizing_mode='stretch_width')
# 定期的にデータを更新する関数
def update_data():
global df, curve
df = get_stock_data()
curve = hv.Curve((df['Date'], df['Close']), 'Date', 'Close Price')
pane.object = curve
# 1分ごとにデータを更新
pn.state.add_periodic_callback(update_data, 60000)
# Panelレイアウトの表示
pn.Column(pane).show()
説明
- pandas-datareader: Yahoo Financeから株価データを取得するために
pandas_datareader.dataモジュールを使用します。この例では、Apple(AAPL)の株価データを取得します。 - get_stock_data関数: 過去30日間のデータを取得し、データフレームに変換して返します。
- update_data関数: 1分ごとに新しいデータを取得し、グラフを更新します。
- リアルタイム更新:
pn.state.add_periodic_callbackを使い、1分ごとにデータが更新されるように設定しています。
このコードを実行すると、Appleの株価がリアルタイムで更新されて表示されます。
WebSocketを利用したリアルタイムデータの可視化
次に、WebSocketを利用してリアルタイムにデータを受信し、ダッシュボードに反映する方法を紹介します。WebSocketを使うことで、データの即時更新が可能になります。
以下は、WebSocketから株価データを受信し、リアルタイムでグラフを更新する例です。
import panel as pn
import holoviews as hv
import asyncio
import websockets
import json
import pandas as pd
pn.extension('holoviews')
# 初期データの準備
df = pd.DataFrame(columns=['time', 'price'])
curve = hv.Curve((df['time'], df['price']), 'Time', 'Price')
pane = pn.pane.HoloViews(curve, sizing_mode='stretch_width')
# WebSocketからデータを受信する非同期関数
async def update_from_websocket():
global df, curve
async with websockets.connect("wss://example.com/live-stock") as websocket:
while True:
data = await websocket.recv()
json_data = json.loads(data)
new_data = {'time': json_data['time'], 'price': json_data['price']}
df = df.append(new_data, ignore_index=True)
curve = hv.Curve((df['time'], df['price']), 'Time', 'Price')
pane.object = curve
# 非同期処理を実行するためのスレッドの起動
loop = asyncio.get_event_loop()
loop.create_task(update_from_websocket())
# Panelレイアウトの表示
pn.Column(pane).show()
websockets.connect()を使ってWebSocketに接続し、リアルタイムでデータを受信します。この例では、WebSocketからtimeとpriceのデータを受信して、データフレームに追加しています。asyncioを使って非同期でデータを受信し続け、受信したデータを元にグラフを更新します。- WebSocketはリアルタイム性が高く、データが更新されるたびにすぐにダッシュボードに反映されます。
リアルタイムデータの管理: キャッシュとパフォーマンス
ライブデータを扱うダッシュボードでは、データの量が増えるにつれてパフォーマンスの問題が発生する可能性があります。Panelは、@pn.cacheや@pn.stateを使ってデータのキャッシュや効率的な更新をサポートしています。
次に、リアルタイムデータを一定量に制限して、パフォーマンスを最適化する例を紹介します。
import panel as pn
import holoviews as hv
import pandas as pd
pn.extension('holoviews')
# 最大データ数を設定
MAX_DATA_POINTS = 100
# 初期データ
df = pd.DataFrame(columns=['time', 'price'])
curve = hv.Curve((df['time'], df['price']), 'Time', 'Price')
pane = pn.pane.HoloViews(curve, sizing_mode='stretch_width')
# 新しいデータを追加しつつ、古いデータを削除
def update_data(new_time, new_price):
global df, curve
new_data = {'time': new_time, 'price': new_price}
df = df.append(new_data, ignore_index=True)
# データ数が多すぎる場合、古いデータを削除
if len(df) > MAX_DATA_POINTS:
df = df.iloc[-MAX_DATA_POINTS:]
curve = hv.Curve((df['time'], df['price']), 'Time', 'Price')
pane.object = curve
# データの更新を模倣
def simulate_data():
import random
from datetime import datetime
while True:
new_time = datetime.now()
new_price = random.uniform(100, 200)
update_data(new_time, new_price)
# Panelレイアウトの表示
pn.state.add_periodic_callback(simulate_data, 1000)
pn.Column(pane).show()
MAX_DATA_POINTSを設定して、データフレームの最大行数を制限しています。これにより、古いデータを削除してメモリの使用量を抑えることができます。simulate_data()で1秒ごとにランダムなデータを生成し、実際のライブデータをシミュレーションしています。これは、リアルタイムでデータが更新され続けるシステムを模倣するための関数です。
これにより、ライブデータが増加しても、古いデータが適切に削除され、ダッシュボードのパフォーマンスを維持できます。
まとめ
ライブデータを使ったダッシュボードの構築は、PanelとHoloViewsを使えば非常に簡単に実現できます。APIやWebSocketからデータを取得し、リアルタイムで更新するインターフェースを構築することで、データ監視や解析に役立つダッシュボードを作成できます。また、パフォーマンスを考慮したデータ管理も重要です。
次回は、Panelにおける認証とセキュリティの実装について解説します。お楽しみに!
補足:株価情報APIサービス
以下は、株価情報を提供する主なAPIサービスの特徴を、まとめたものです。具体的なAPIの使い方、詳細についてはそれぞれのサービスのリンク先を参照して下さい。
1. IEX Cloud
- リンク: IEX Cloud
- 特徴: IEX Cloudは、米国上場企業のリアルタイム株価、ファンダメンタルデータ、ニュースなどを提供する非常に高品質なデータソースです。市場データに加え、ライブデータや詳細な金融分析のための高度な統合機能をサポートしており、特に株式市場アプリケーションに最適です。
- レート制限: 無料プランでは1日あたりのリクエスト数が制限されていますが、有料プランではリクエストの上限が引き上げられます。
- 一番目に紹介したのですが、2024年8月31日でサービス終了していました。残念。
2. Tiingo
- リンク: Tiingo
- 特徴: Tiingoはリアルタイムおよび過去の株価データを提供し、さらに金融ニュースや仮想通貨データも取得できます。データの視覚化や市場分析のためのツールが充実しており、特にアルゴリズム取引に役立つ設計になっています。
- レート制限: 無料プランではリクエスト数に制限がありますが、有料プランではより多くのデータにアクセス可能です。
3. Yfinance (Yahoo Finance)
- リンク: Yfinance GitHub
- 特徴: Yfinanceは、コミュニティによって維持されているPythonパッケージで、Yahoo Financeのデータを簡単に取得できるようにします。リアルタイムの株価、過去のデータ、配当金、株式分割情報を提供し、APIキーが不要な点が魅力です。特に株式データに特化していますが、仮想通貨や外国為替のデータは提供されていません。
- レート制限: 公式なレート制限はありませんが、過度な使用はIP禁止につながる可能性があります。
- リンク先のドキュメントをしっかり読んで正しく使いましょう。
4. pandas-datareader
- リンク: pandas-datareader
- 特徴:
pandas-datareaderは、Yahoo FinanceやAlpha Vantageなど、さまざまなデータソースからデータを取得するためのPythonライブラリです。シンプルな関数で株価、外国為替、マクロ経済データにアクセスでき、pandasと統合されているため、データ分析に便利です。こちらのページにアクセス可能なデータソースの一覧があります。 - レート制限: データソースに依存(例: Alpha VantageやYahoo Financeの制限)。
- これは素晴らしいと思います。Pandas好きの方にはたまらないのではないでしょうか!いつか
pandas-datareaderを特集した記事を書いてみたいと思います!
5. Alpha Vantage
- リンク: Alpha Vantage
- 特徴: Alpha Vantageは、リアルタイム株価、外国為替、仮想通貨データなどを提供する、非常に包括的なAPIです。50以上のテクニカル指標(SMAやMACDなど)や、セクターごとのパフォーマンスデータも提供されており、特に金融分析に向いています。
- レート制限: 無料プランでは1分間に5リクエスト、1日500リクエストまで。プレミアムプランでより高いレートリミットが利用可能。
- Alpha Vantage、個人用途で使うにはオーバースペックかもしれませんが、無料プランを試してみたいと思います。
6. Nasdaq Data Link (旧Quandl)
- リンク: Nasdaq Data Link
- 特徴: Nasdaq Data LinkはQuandlから進化したもので、主に金融および経済データを提供しています。株価データだけでなく、特定の市場や商品に関する詳細な情報を提供し、また機械学習や高度なデータ分析に適したデータセットが揃っています。
- レート制限: 無料プランではリクエスト数に制限があり、有料プランでより多くのデータにアクセス可能です。

各APIは異なる強みを持っており、必要なデータの種類やレート制限を考慮しながら最適なものを選ぶことが重要です。


コメント