はじめに
データサイエンスで誰もがまず間違いなく扱うであろうテーブルデータ。pandasや最近ではpolarsを使って解析・可視化する人も多いでしょう。一方で、データサイズがそれほど大きくないときは、インタラクティブに編集・プロットしたり、セルの中でちゃちゃっと平均とかを計算できるExcelの方が便利な場合が多いです。
pandasGUIというものもあるのですが、かなり操作性が悪いし、開発もそんなホットではないですね...
テーブルデータをExcelみたくいじりながら、いつでもDataFrame
でデータを回収してPythonで解析できるソフトがあったらいいなあと思ったので、tabulous
というのを作りました。この記事ではこれを簡単に紹介したいと思います。
名前はtabularとfabulousを掛けたものです。GUIはQtで作っています。
なお、詳しいドキュメント(英語)はこちらにあります。
tabulous
の特徴
- Excelで編集 → 保存 →
pd.read_csv
やその逆はもう絶対にやりたくない。スプレッドシートとJupyter QtConsoleを同時に開いて、シートの編集とPythonでの解析を素早く行き来できるようにした。 - Excelのxlsx重視とか勝手に日付に直してくるとかそういう変な機能全部なくした。
- VSCodeのコマンドパレット便利すぎる。実装した。
- Undo/redo (
Ctrl+Z
/Ctrl+Y
) はすごく大変だけど、大事なので頑張って実装した。 - プロットは
matplotlib
と同じくできる一方で、インタラクティブにも動かせるようにした。 - カラムごとのデータ型があり、編集時に型チェックが入る
Table
型と、いわゆるスプレッドシートみたく自由に編集できるSpreadSheet
型を用意した。 - 拡張・流用が簡単にできるようにした。自作Qtウィジェットをビューアーに追加することも、ビューアーやテーブルを自作Qtウィジェットに追加することも可能。
インストール
pipでインストールできます。
$ pip install tabulous[all]
seaborn
やscikit-learn
とか、少し重めなのが必要なかったら、PyQt
のバージョンだけ指定してインストールしてください。最低限のものだけインストールされます。
$ pip install tabulous[pyqt5] # こっちの方が多分安定
$ pip install tabulous[pyqt6]
tabulous
コマンドでビューアーを起動します。
$ tabulous
もしくはPythonを起動して、TableViewer
オブジェクトを作成すると起動します。
$ python
Python 3.9.7 (...いろんな情報)
>>> from tabulous import TableViewer
>>> viewer = TableViewer()
Ctrl+Nを押すと新しいスプレッドシートが追加されます。
このスプレッドシートはExcelみたく編集できます。
基本操作
以下、MacではCtrlを⌘など、適宜読み替えてください。
1. QtConsoleの起動
Ctrl+Shift+Cを押すか、上のツールバーの"Home"ツールの">_"みたいなボタンを押すと、下部にQtConsoleウィジェットが追加されます。もう一度押すと隠れます。基本的にここでPythonを対話形式で動かします。
なお、ビューアー自体はviewer
という変数名で名前空間に追加されています。このviewer
を使ってプログラム的にビューアー自体を操作していくことになります。
2. テーブルの追加/取得
ファイルを開く場合は、Ctrl+O
でTable
として、Ctrl+K
→Ctrl+O
でSpreadSheet
として開きます。
一方、プログラム的には、pd.DataFrame
に渡せるものであればadd_spreadsheet
関数で追加できます。
viewer.add_spreadsheet({"a": [1, 2, 3]})
テーブルは全てviewer.tables
というlist
みたいなものに格納されています。テーブルやその内部のpd.DataFrame
は次のように取得できます。
table = viewer.tables[i] # i番目のテーブルを取得
df = table.data # テーブルデータをpd.DataFrameで取得
なお、現在アクティブなテーブルはviewer.current_table
で取得可能です。
3. 並び替え・フィルター
テーブルデータの基本ですね。並び替え/フィルターはカラムを右クリックして"Sort"や"Filter"をクリックすればできます。
並び替え
GUIではカラムを右クリックして"Sort"をクリックすればできます。
プログラム的には例えば次のようにやります。
table.proxy.sort("A")
table.proxy.sort("A", ascending=False)
フィルター
GUIではカラムを右クリックして"Filter"をクリックすればできます。
プログラム的には例えば次のようにやります。
table.proxy.filter("C == 'x'")
table.proxy.filter("A % 2 == 0")
並び替え・フィルター中のセルの編集
できますよ~。
4. コマンドパレット
「この操作がしたいけどどこにあるの...?」みたいな問題も、コマンドパレットがあればほとんど起きないですよね。コマンドパレットはCtrl+Shift+P
もしくはF1
で起動します。
下の例は、散布図 → 集計 → 列の挿入 をコマンドパレットで実行したものです。
5. カラーマップ
GUIでは、カラムを右クリックしてテキスト・背景にカラーマップを設定できます。
プログラム的には、様々な方法があるので、ドキュメントを参考にしてください。
6. セル内での計算
Excelでの=SUM(A1:A5)
みたいのものも(かなり頑張って)実装しました。np
とpd
が名前空間に存在し、さらにテーブルデータがdf
に渡されます。Excelみたく、選択領域に基づいて式が更新されます。
Excelと異なる点として、"="でスタートする場合は参照を残さず(参照元のセルの値が変わっても更新されない)、"&="でスタートする場合に参照を残すようにしています。これは、セルの値から何度も計算する操作はプログラム的に行う場合が多いので、GUI上では想定外の値の更新を防ごうと考えたためです。
(ただ、正直一般的な需要としてどうなのか分からないので、今後Excelみたいに"="で統一する可能性もありますね...)
7. プロットの編集
インタラクティブに拡大縮小・平行移動できる以外に、ダブルクリックでプロットした要素を編集できます。
個人的な好みで実装した機能
1. セルのラベル
セルの上に「平均」とかラベルするのマジで嫌い。"F2"でセル編集モードに入るみたく、"F3"でラベルを編集できるようにしました。ラベルはデータには含まれません。
2. 様々なコピー・ペースト
Markdown、sphinx、Notion、HTML、あとはnumpy
のprintの結果などを直接やりとりできたら何かと便利だと思い、実装しました。
ドキュメントを作成するのに早速使えました。
最後に
一応scipy
やscikit-learn
を活用した機能も実装したのですが、長くなるのでとりあえずここまで。
tabulous
をよろしくお願いいたします~!