Jupyter/Pythonでデータ分析する人にお勧めしたい！便利なライブラリー「PixieDust」をザクッと紹介します

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0520ed76-2b0f-9d0c-66da-91063a5d688a.png)

# はじめに

こんにちわ！石田です。皆様、「**PixieDust**[^1] 」ってPythonライブラリー、ご存知ですか？昨年出て超便利なのに、なぜか日本ではぜんぜん知られてませんッ[^2]。日本語の記事はQiitaの「[これ](https://qiita.com/M_Iijima/items/6777d2aad697c682c241)」くらい:pensive:。。 **Plotly**や**ipywidget**でシコシコ書くよりぜんぜん楽だし守備範囲も広いので、「このまま埋もれさせるのは**モッタイナイ！**」と思ってご紹介の記事を書きました。一番ウケそうな「**インタラクティブなチャート・ウィジェット**」については別記事「[Jupyter/Python上でたった3行でインタラクティブなチャート・ウィジェットを作れる！PixieDustを触ってみた](https://qiita.com/ishida330/items/36f31f224b230cb8f655)」にHow-To含め書きましたので、そちらをご参照ください。当記事では、より広く浅く/全体的に「何、それ？」「何ができるの?」＝Whatだけザクッとご紹介します。(個人的には、探索的データ分析(EDA)の際のツールの一つとして、[pandas_profiling](https://qiita.com/h_kobayashi1125/items/02039e57a656abe8c48f)とかと一緒に使うと便利かなと思います。)

[^1]: 英語でPixieDustとは「妖精が振りかける魔法の粉」のことだそうです。ビーターパンで妖精のティンカーベルが振りかけてる、あの粉のことです。落合陽一氏の会社とは関係ありません。
[^2]: って胸を張ってどうする。。オープンソースですがIBM発ってことで色が着いてるのか、商用ライブラリーと思われているのか、Spark専用と誤解されているのか、そもそも宣伝が足りないのか。。 

# PixieDustって何?（サマリー)
[PixieDust](https://www.ibm.com/cloud/pixiedust)はJupyter Notebook/Python環境で、最小限のコーディングで誰でも簡単に[^3]データを分析して結果をWebに公開/シェアできる「簡単ライブラリー」群です。大きくは以下の4つの機能があります。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8782191f-e8bb-2dc8-57e4-ee669b7f7808.png)

- 2017年にIBMがオープンソースとして公開しました
    - プロジェクトは[Github上で公開](https://github.com/pixiedust/pixiedust)しています
    - [Apache 2.0ライセンス](https://github.com/pixiedust/pixiedust/blob/master/LICENSE)なので商用利用も可能です
    - [Release Note](https://pixiedust.github.io/pixiedust/releasenotes.html)にありますが、継続的に改善・機能アップしてます
    - ローカルのJupyter/Python環境にpip installでインストールして動かせます
    - クラウド環境ではIBMのWatson Studio上のJupyter Notebookで、すぐに使える形でご提供中です    
- 「**データ分析を誰でも簡単に[^3]できるようにする**」のが目標です
    - 超シンプルなAPI(基本は2つ)
    - たった3行でインタラクティブなチャート・ウィジェットを作成
    - グラフやチャートの描画エンジン(レンダラー)は動的に切り替え可能
    - 以下のライブラリーをサポートするが、ライブラリーの知識は不要
        - DataFrame - **Pandas and/or Spark**
        - Visualization Engine - **matplotlib/Bokeh/Seaborn/Brunel**
        - Map - **mapbox/Google Maps**
- 「インタラクティブなチャート・ウィジェット」以外にも様々な機能があります
    - データの加工・整形(Data Wrangling)
    - Jupyter Notebook上のセルで動くPythonデバッガー
    - Jupyter上の分析セルをWebアプリとして**そのまま**公開、または簡単な独自アプリ(PixieApps) 
    - 主にSpark周りの便利ユーティリティ

[^3]: IT専門家やデベロッパーはもとより、ITに詳しくないエンドユーザー様でも、多少の知識があればそれなりに分析ができるようにすることを目指してます 

# まずは3行=APIを2つ知ってれば十分！

この３行書けば対話式ウィジェットが作れます。(URLはファイルの場所)
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/90f4fb6b-8147-0c59-e9d1-529b87ff41f3.png)

あとはメニュー操作でチャートやマップが簡単に作れます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/db521873-00e0-755c-1fdf-99c9f3ceab53.png)

主に知っている必要がある**APIは基本、2つだけ**です.

1. データをインポートするための**sampleData(URL)**  - 利用は任意
2. データを可視化するための**display(df)**  -  必須

しかありません。ややこしいパラメータもありません。簡単すぎ。。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f6074468-8e13-c137-90a6-fda6161cf973.png)


# 全体図/イメージ
以下が機能とライブラリーをマッピングした全体図です
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/28d0b61a-5fa1-af15-195c-240ed00e6ccd.png)

1. PixieDustは主にデータ入力や対話式ウィジェットの機能を提供します
1. PixieDust-Rosieはデータラングリングの機能を提供します(別導入)
1. PixieAppはPixieDustの分析セルをダッシュボードとして簡単に公開できる仕組みです
1. Pixie Gateway(別導入)はPixieAppを動かすランタイムエンジンです
1. 水色で囲まれたJupyterやPython, Pandas等は「前提環境」です[^4]

- **上記のライブラリや機能は選択可能であり、全部を入れる/使う必要はありません。**最小限では`pip install pixiedust`でPixieDustさえいれれば対話式ウィジェットは使えます。それ以外はオプション=使いたければ使うものであり、インストールや環境設定は必須ではありません。
- :triangular_flag_on_post: **Sparkは必須ではありません。Pandasだけでも動きます。** 従来からIBMはSpark推しですし、Watson Studioでの利用を想定してか、ドキュメント上ではSparkを想定した記述が多いですが、実はSparkなし＝Pandasだけの環境でもフツーに使えます。「え～Spark前提か～。pandasは知ってるけどSparkは知らないよ～:worried:」と思われる方もおられるかと思い、念のため記載しました。要はPandasのDataFrameがあればいいんです。

[^4]: 前提は「全部を導入せねばならない」わけではありません。扱うデータがPandasだけで足りるならSparkは不要ですし、グラフ・チャートのレンダラーもmatplotlibさえあれば残りはオプション(無ければメニューで選べないだけ）です。


# 機能ざっくり紹介
以上で大枠のご説明が終わったので、ここからは「こんなことできるよ」というのを順番にご紹介していきます。以下のようにPixieDustは着々と機能を広げてきています。[Release Note](https://pixiedust.github.io/pixiedust/releasenotes.html)によると、執筆時点(2018/9)では1.1.8が最新です。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/1e9aa71b-b3ab-7a19-2016-fadc3a5a033e.png)

## データのインポート

Pandas環境でもSpark環境でも区別無く`sampleData(URL)`でURLにあるファイルを読み込めば環境にあったDataFrameを返してくれます。

- インターネット上(http://～)でもローカル(file://～)でも
- 拡張子zipやgzの場合、ダウンロードして展開してくれます
- 当APIの利用は必須ではなくオプション。自分でpandasのDataFrameを作ってもいいのです。


## インタラクティブなチャート・ウィジェット

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/82d288d0-95a4-9503-f714-47da041a7bfe.png)

ウイジェットが表示されたら左上のメニュー類でチャートを選択します。
右上のRendererを切り替えるとレンダリングエンジンを切り替えられます。
X軸、Y軸は「Options」で指定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d80e8169-e1df-d188-f0c5-85519db5073c.png)

上記のように各ライブラリーの特色を生かしたビジュアライゼーションが簡単に表示できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e937f2ee-0965-f9f0-4f16-7096098b305b.png)
(データ中に緯度と経度があれば）グラフだけでなくマップも簡単に表示できます。

上記すべての操作でコーディングは一切不要で、メニューから対話式に行えます。

- :triangular_flag_on_post: 詳しくは記事「[Jupyter/Python上でたった3行でインタラクティブなチャート・ウィジェットを作れる！PixieDustを触ってみた](https://qiita.com/ishida330/items/36f31f224b230cb8f655)」をご参照ください。

## データ・ラングリング(PixieDist-Rosie)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/be09ec87-2bb3-ccf9-6e6f-f1ecf18227ce.png)

データの整形・加工を行う機能です。以下の2行で上記のパネルが表示されます。

```py
import pixiedust_rosie
pixiedust_rosie.wrangle_data(URL)
```

対話式に以下の操作を行えます。

- カラムの削除
- カラムのリネーム
- カラムの変換(Transform)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a436158d-2f22-87bf-90e6-8ff5772e40fa.png)

[Rosie](https://developer.ibm.com/code/open/projects/rosie-pattern-language/)は、こちらもIBMがオープンソースで公開している正規表現のパターン言語です。Rosieを使ってカラム変換のルールを表現します。たとえば上記ではIndicatorIDというカラムを「コード」部と「数値」部に分離するような変換を行います。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/76eb7477-77cc-3837-27ca-593ecb90f429.png)
実行すると上記のようにDataFrameに新しいカラムが追加されます。

# PixieApps

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8e2c048a-f648-513e-d2b1-8a57202106a3.png)

Jupyter Notebook上でデータサイエンティストの人が行った分析結果を現場の人と共有するにはどうすればいいでしょうか。その場限りなら画面コピーをメールで送るのでもよいかもしれませんが、変更など含めて継続的・計画的に行うならWebアプリケーションの形が望ましいでしょう。かといって毎回JupyterのセルをWebアプリに焼き直していたらたまりません。この課題を解くためにできたのがPixieAppsです。

>PixieAppsを使えば、最小限のコーディングでJupyter Notebook上にツールやダッシュボードを作れ、分析業務を運用に乗せられます( PixieApps are Python classes that allow users to operationalize analytics by creating tooling or dashboards in a notebook with minimal coding)


![pixieapp-05.gif](https://qiita-image-store.s3.amazonaws.com/0/108535/5bd7e133-f062-f611-19e5-c7bfd738aef1.gif)

How-Toは別の記事に譲りますが、上記のように分析した結果のセルを簡単にWebアプリとしてデプロイできますし、既存のWebアプリに組み込むのも容易です。

さらに進んだ方法としては独自のクラスでHTML/CSSを使ったアプリを作ることもできます。以下はHello Worldです。

```py:HelloWorld.py
#import the pixieapp decorators
from pixiedust.display.app import *

@PixieApp   #decorator for making the class a PixieApp
class HelloWorldApp():
    @route()  #decorator for making a method a route (no arguments means default route)
    def main_screen(self):
        return """<div>Hello World</div>"""

#Instantiate the application and run it
app = HelloWorldApp()
app.run()
```
上記をNotebook上で実行すると以下のようにレンダリングされます。右上のボタンでPixieGatewayにデプロイすることもできます。UIのテンプレートエンジンとしてはFlaskで有名なJinja2が使えます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/46a9cb54-a56c-c142-e960-2ef76d74a2e2.png)

上記だけだと「だから何？」って感じですが、HTML/CSSを駆使すれば以下のような本格的なダッシュボードを作ることもできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d4fb9d07-e809-e2a5-7972-a63a86d0b8f6.png)

## PixieDebugger

Jupyter Notebookのセルで使えるビジュアルな対話式デバッガーです。**PixieApp専用というわけではなくて、汎用的なPythonデバッガー**です。セルマジックを一行追加するだけで使えるので、pdbより手軽で超便利！

![pixiedebugger-03.gif](https://qiita-image-store.s3.amazonaws.com/0/108535/c3279add-f546-18c1-9ad6-b0ca253f5e9b.gif)


:newspaper: 文献: [The Visual Python Debugger for Jupyter Notebooks You’ve Always Wanted](https://medium.com/ibm-watson-data-lab/the-visual-python-debugger-for-jupyter-notebooks-youve-always-wanted-761713babc62)

## その他
細かい機能ですが

- Scala Bridge - セルマジック `%%scala`を書くと以降のセルでScalaが使えるようになります
- Spark Package Manager - クラウドホスティング環境＝特権IDが無い環境でJupyterの構成ファイルを編集せずにmavenパッケージをインストールできるようにするもの。ローカル環境では不要か。
- Spark Progress Monitor -  Jupyter上でSparkの処理の進行状況を表示するバー

などもあります。

## 最後に

いかがでしたでしょうか。Pixiedustは「インタラクティブなチャート・ウィジェット」から始まりましたが、守備範囲や機能がどんどん広がっています。簡単なので、まずは手軽に`pip install pixiedust`してウィジェットを使ってみてください。あれこれ触ってるうちに操作はわかってきます。データ分析で皆様が楽をできることを願っています。この先、DataWranglingやPixieAppの記事も書きたいと思っておりますが、まずはここまで！


# 各種リソースのご紹介(全部英語 :us:です)

### :blue_book: ドキュメント
- [IBMのPixieDust紹介ページ](https://www.ibm.com/cloud/pixiedust)
- [Githubのドキュメント](https://pixiedust.github.io/pixiedust/use.html)
- Watson Studioのドキュメント [Welcome to PixieDust ](https://dataplatform.cloud.ibm.com/docs/content/pixiedust/index.html?audience=wdp&context=analytics) - クラウド上のサービスなのでローカル環境へのインストールの項がありませんが、あとは上記GitHub上のドキュメントと同じです

### :blue_book: (有料ですが) ネタ本あります
PixieDust開発チーム@IBMの David Taiebさんが書いた本があります。
[Thoughtful Data Science](https://www.amazon.com/Thoughtful-Data-Science-intuitive-Pixiedust/dp/178883996X)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/59db72c2-2a15-daad-a266-348b6b98b6fb.png)

- 2018/6/31に出たばかりです
- PixieDustの全体説明もありますが、特にPixieAppsの情報が充実していました
- Amazon書籍は$40しますが、[出版元でのeBook](https://www.packtpub.com/big-data-and-business-intelligence/thoughtful-data-science)買えば$10でした。私はオライリー社の読み放題サービス「[Safari Books Online](https://www.safaribooksonline.com/home/)」を使って読みました。Safari Books Onlineは無料トライアルがあると思うので、それらを使うのもいいでしょう。

### github
Github [pixiedust/pixiedust](https://github.com/pixiedust/pixiedust/blob/master/README.md)

### :newspaper: ブログ記事
PixieDustの技術情報は主に [MediumのDataLab](https://medium.com/ibm-watson-data-lab)上で発信しています
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f1bf85a5-8262-b653-8aad-23f6704f7475.png)

[DataLab内をキーワード"pixie"で検索する](https://medium.com/ibm-watson-data-lab/search?q=pixie)と、技術記事がたくさんでてきます。

### :tv: 動画やデモ
- [PixieDust Demo Display API](https://www.youtube.com/watch?v=FoOHFlkCaXI) - 5分
- [Blurring the line between Developer and Data scientist with PixieDust by David Taieb](https://www.youtube.com/watch?time_continue=723&v=VaC-NI-Ey5c) - 52分
- [Taking Jupyter Notebooks and Apache Spark to the Next Level PixieDust - David Taieb](https://www.youtube.com/watch?v=tms_KpmTTkQ) -31分
- [Mapping Data in Jupyter Notebooks with PixieDust - Raj Singh (IBM Cloud Data Services)](https://www.youtube.com/watch?v=rEo3klBpOV0) - 38分