JupyterをインストールしてPython 3で使ってみた

Created 2018年6月22日16:15
Updated 2018年6月28日20:19
Categories Python

Jupyter便利そうだなーということで、ちょうどPythonのデータでグラフ化したい物があったのでインストールしてみました。

本家ではanacondaを推奨していますが、今回はpipを使ってインストールしています。

環境

  • Windows 10 Pro 1803 64bit
  • Python 3.6.5

作業にはPowershellを使っています。

セットアップ

Jupyterはpipでインストールしますが、依存関係が多くパッケージが大量に入ります。

システムの環境を汚したくないので、まずはvenvを作ります。

> python -m venv vnev
> .\venv\Scripts\activate.ps1
(venv) >

また、pipをアップデートしておきます。

(venv) > pip install -U pip
(venv) > pip list
Package    Version
---------- -------
pip        10.0.1
setuptools 28.8.0

pipは10.0.1が入りました。

インストール

いよいよJupyterをインストールします。とは言っても手順は非常に簡単で、

(venv) > pip install jupyter
...

するだけです。

公式はanacondaを使う事を強く推奨していますが、pipからのインストールもしっかりメンテナンスされているのはありがたいですね。

インストールが終わったら起動するだけですが、後でnumpyとmatplotlibを使いたかったのでpip install numpy matplotlibを実行して追加しました。

Jupyterの起動は

jupyter notebook

を実行するだけで行えます。localhost:8888にサーバーが立ち上がり、自動的にブラウザが開かれます。

使ってみる

今回はAmazonのトップページにアクセスする際に取得するリソースについて、

  • ファイルタイプごとの読み込み時間の合計
  • TTFBの平均時間

をグラフ化する事を目的とします。データはChromeのデベロッパーツールからHARファイルを取得していますが、本稿では解説を省略します。

まずはFilesタブからNew -> Python 3を選び、新しいノートブックを作成します。

ノートブックの編集画面に遷移するので、ここにプログラムを書いていきます。

Jupyterはソースコードをセルに分割して入力することで、部分的な実行を行うことが可能です。

可読性も良くなるので、なるべく処理ごとに分割すると良いと思います。

編集画面でとりあえず覚えておきたいのは、

  • 「+」アイコンでセルの追加
  • はさみアイコンでセルの除去
  • Runボタンで選択中のセルのみ実行
  • メニューのCell -> Run Allで全てのセルを実行

あたりでしょうか。

また、言語選択をCodeからMarkdownに変更する事でMarkdown形式のメモを残すことが可能です(Markdownは実行するとHTMLに変換されます)。

実際に使った様子はこんな感じになりました。

グラフに加えてメモやprintの内容がいい感じに表示されるので、ノートブックとして申し分ない使い方ができて便利です。

人に見せる時にも流れが簡単に説明できて良さそうです。

一応コードを文字列で載せておきますね。

import json
import numpy as np
import matplotlib.pyplot as plt


def get_details():
    with open("C:/path/to/www.amazon.co.jp.har", "r", encoding="utf-8") as f:
        har = json.loads(f.read())

    details = []
    entries = har["log"]["entries"]
    for entry in entries:
        detail = {
            "content_type": entry["response"]["content"]["mimeType"].split("/")[1],
            "time": entry["time"],
            "wait": entry["timings"]["wait"],
            "receive": entry["timings"]["receive"]
        }
        details.append(detail)
    return details


def calc_typed_sum(details):
    typed_sum = {}
    for detail in details:
        content_type = detail["content_type"]
        load_time = detail["time"]
        if content_type not in typed_sum:
            typed_sum[content_type] = load_time
        else:
            typed_sum[content_type] += load_time
    return typed_sum


def calc_wait_average(details):
    wait_average = {}
    for detail in details:
        content_type = detail["content_type"]
        wait = detail["wait"]
        if content_type not in wait_average:
            wait_average[content_type] = [wait]
        else:
            wait_average[content_type].append(wait)
    for key, value in wait_average.items():
        average = sum(value) / len(value)
        wait_average[key] = average
    return wait_average


details = get_details()
typed_sum = calc_typed_sum(details)
wait_average = calc_wait_average(details)
print(typed_sum)
print(wait_average)

labels = list(typed_sum.keys())
left = np.array(range(0, len(typed_sum)))
height = np.array(list(typed_sum.values()))
print(labels, left, height)
plt.figure(figsize=(10,5))
plt.bar(left, height, tick_label=labels, align="center")

labels = list(wait_average.keys())
left = np.array(range(0, len(wait_average)))
height = np.array(list(wait_average.values()))
print(labels, left, height)
plt.figure(figsize=(10,5))
plt.bar(left, height, tick_label=labels, align="center")

セルに分割していたので気付きませんでしたが、1つにまとめるときったないですね・・・

所感

思ったより使いどころが多そうなので、がっつり使っていきたいです。

次回はサーバーにインストールする時の知見をまとめようと思います。

コメントを投稿

コメント