PythonによるBIツールの提案
ある一定の間隔で蓄積された時系列データ(CSV)を読み込み、
なんやかんやして動的グラフ(積み上げ棒グラフ)を作成します。
また、学習コストの低さから後述するライブラリを試用してみました。
環境
- Windows10:WSL2:Linux(Ubuntu-24.04)
- Python:3.12
- ライブラリ
- Pandas
- Plotly
- Streamlit
手順
- CSVデータの読み込み
- データの読み込み
- 1か月分ごとの合計を算出
- データを年と月に分割
- プルダウンメニューで表示する列を選択
- データを整形
- Plotly Expressでアニメーショングラフを作成
- Streamlitでグラフを表示
ソースコード
import streamlit as st
import pandas as pd
import plotly.express as px
# CSVファイルのパスを指定
csv_path = "file.csv"
# 1. CSVデータの読み込み
@st.cache_data
def load_data():
try:
df = pd.read_csv(
csv_path,
header=None,
skiprows=4
)
df['datetime'] = pd.to_datetime(df.iloc[:, 0])
df.set_index('datetime', inplace=True)
return df
except FileNotFoundError:
st.error(f"CSVファイルが見つかりません: {csv_path}")
return None
# 2. データの読み込み
df = load_data()
st.title('Python BI Tool')
st.write('データファイル名')
st.write('バージョン情報')
if df is not None:
# 3. 1か月分ごとの合計を算出
monthly_sum = df.resample('ME').sum()
# 4. データを年と月に分割
monthly_sum.reset_index(inplace=True)
monthly_sum['Year'] = monthly_sum['datetime'].dt.year
monthly_sum['Month'] = monthly_sum['datetime'].dt.strftime('%B')
# 5. プルダウンメニューで表示する列を選択
columns = monthly_sum.columns[2:-2].tolist() # datetime, Year, Month列を除外
selected_columns = st.multiselect(
'表示する分類を選択してください',
columns,
default=columns[1:10] # デフォルト選択(適宜調整)
)
# 6. データを整形
melted_df = monthly_sum.melt(
id_vars=['Year', 'Month'],
value_vars=selected_columns,
var_name='Category',
value_name='Value')
# 7. Plotly Expressでアニメーショングラフを作成
fig = px.bar(melted_df,
x='Month',
y='Value',
color='Category',
animation_frame='Year',
labels={'Value': '合計', 'Month': '月'},
title='年別・月別合計')
# 月の順序を設定
month_order = [
'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'
]
fig.update_xaxes(categoryorder='array', categoryarray=month_order)
# 8.Streamlitでグラフを表示
st.plotly_chart(fig)
else:
st.warning("データが読み込めませんでした。CSVファイルの場所を確認してください。")
おわりに
自身が持っていたCSVデータは綺麗に構造化されたデータだったので扱うのが簡単でした。
Plotlyではもっと有効な動的グラフを作成できるはずなので機能拡張したものも考えています。
今後の展望
- Streamlit
- 複数のグラフを同時に表示し、スライダーによって全てのグラフ操作
- 何かしらのUIで表示カラムの変更
- 表示書式(グラフの種類)の変更機能
- Plotly
- 円グラフ
- 散布図
- その他諸々のグラフ実装
などなど出来るかどうかも分からないものを含めて色んな機能を実装してみたいと思っています。
実用性は考えていません