Python講習会(応用編続き)

本日の予定

  1. 自己紹介
  2. Pythonでの開発環境
  3. IPython magicの紹介
  4. 高速化Tips
  5. ライブラリ紹介

本日の予定

  1. 自己紹介
  2. Pythonでの開発環境
  3. IPython magicの紹介
  4. 高速化Tips
  5. ライブラリ紹介

3.IPython magicの紹介

IPython magicとは?

標準のPythonコンソールから拡張されたコマンド

  • 「%」から始まる
  • 複数行に渡る場合は「%%」にする

%ls

シェルの「ls」を呼び出す。
Windowsの場合「dir」と同じ

%cd

シェルと同じく、カレントワーキングディレクトリを変更する。

%pwd

カレントワーキングディレクトリを表示する。

%run [filename]

ファイルをIPython内で実行する。変数はIPythonに残る。

In [2]:
!cat ./run_test.py
import numpy as np

arr = np.array([1, 3, 4])

mylist = []
for i in range(100):
	mylist.append(i)
	np.random.randn(100, 100)
In [3]:
%run ./run_test.py
In [4]:
arr
Out[4]:
array([1, 3, 4])

%run -t [filename]

ファイルをIPython内で実行し、実行時間を測る。

In [5]:
%run -t ./run_test.py
IPython CPU timings (estimated):
  User   :       0.04 s.
  System :       0.00 s.
Wall time:       0.04 s.

%run -p [filename]

ファイル実行の際、プロファイリングを行う。
各関数について呼ばれた回数と計算時間を計測する。(%prunも似たような機能)

In [6]:
%run -p -s "cumulative" ./run_test.py 
 

「-s "cumulative"」は、累積時間の長い順にソートするオプション

         264 function calls (263 primitive calls) in 0.040 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      2/1    0.000    0.000    0.040    0.040 {built-in method builtins.exec}
        1    0.000    0.000    0.040    0.040 <string>:1(<module>)
        1    0.000    0.000    0.040    0.040 interactiveshell.py:2431(safe_execfile)
        1    0.000    0.000    0.039    0.039 py3compat.py:182(execfile)
        1    0.001    0.001    0.038    0.038 run_test.py:1(<module>)
      100    0.037    0.000    0.037    0.000 {method 'randn' of 'mtrand.RandomState' objects}
        2    0.001    0.001    0.001    0.001 {built-in method io.open}
        1    0.000    0.000    0.000    0.000 {built-in method builtins.compile}
      100    0.000    0.000    0.000    0.000 {method 'append' of 'list' objects}

%time

ある文を実行する時間を計測する。

%timeit  ← オススメ!

ある文を繰り返し実行し、計算時間の平均を調べる 

In [30]:
%timeit 1 + 1
100000000 loops, best of 3: 14.7 ns per loop
In [8]:
%timeit np.random.randn(1000,1000)
10 loops, best of 3: 30.5 ms per loop
In [60]:
import numpy as np
A = np.random.randn(1000, 1000)
In [10]:
# 逆行列
%timeit np.linalg.inv(A)
10 loops, best of 3: 56.3 ms per loop
In [11]:
# ムーア・ペンローズ逆行列
%timeit np.linalg.pinv(A)
1 loop, best of 3: 446 ms per loop
In [61]:
# 行列積
%timeit A @ A
10 loops, best of 3: 23 ms per loop

%matplotlib inline

IPythonに埋め込むプロットをしたいとき

%matplotlib qt

ポップアップウィンドウにプロットしたいとき

本日の予定

  1. 自己紹介
  2. Pythonでの開発環境
  3. IPython magicの紹介
  4. 高速化Tips </font>
  5. ライブラリ紹介

高速化Tips

Pythonを科学技術計算に使う人に向けてのヒント

プログラムが遅いと感じたらどうする?

「よし、とりあえずforループを全部FortranやCに書き換えて・・・」

↑は間違いです!

まずはボトルネックを調べるべき

もし全てのコードを高速化しようとしたら

Pythonの利点であるコーディング時間の短さを失う!

コーディング時間+計算時間=研究時間

ボトルネックを見つける方法

  • %timeit
  • %run -p
  • line_profiler (行ごとの計算時間を計測)

ボトルネックを見つけたら?

ボトルネックの種類を見極める

1.Python”だから”遅い

2.Python”でなくても”遅い

1.Python”だから”遅い

(例)成分ごとにforループを回している

高速化のためのライブラリが存在する

  • Numba
  • Cython
  • ctypes

↑に共通するのはコンパイルするということ!

2.Python”でなくても”遅い

例えば

  • 巨大な行列演算
  • 遅いアルゴリズムを使っている

Numpyは並のC言語のコードよりも速い

この場合、CやFortranに書き換えたとしても劇的に早くなることはない

「Python”だから”遅い」ときの対処法

どのくらい遅いか(sumの場合)

In [13]:
# 1000×1000の二次元配列
A = np.random.randn(1000, 1000)

Numpyの関数を使った場合

In [14]:
%timeit A.sum()
100 loops, best of 3: 1.04 ms per loop

生のPythonで書いた場合

In [15]:
def my_sum(arr2d):
    I = arr2d.shape[0]
    J = arr2d.shape[1]
    res = 0.
    for i in range(I):
        for j in range(J):
            res += arr2d[i, j]
    return res

%timeit my_sum(A)
1 loop, best of 3: 293 ms per loop

200倍以上遅い!

Numbaを使ってみる

Numbaは、JIT(Just In Time)コンパイラ
初めての実行時にコンパイルを行い、それ以降はコンパイルされたものを使う。
(Just In Time = ギリギリの時間で)

In [16]:
from numba import jit
import numba as nb

方法:関数の前に一行足すだけ!

In [34]:
@jit
def my_sum_Numba(arr2d):
    I = arr2d.shape[0]
    J = arr2d.shape[1]
    res = 0.
    for i in range(I):
        for j in range(J):
            res += arr2d[i, j]
    return res
# ここでコンパイル
my_sum_Numba(np.random.randn(*A.shape))

%timeit my_sum_Numba(A)
1000 loops, best of 3: 1.85 ms per loop

Numpyのsum関数より少し遅いが、生Pythonよりは100倍以上速い

行列積の場合

In [35]:
A = np.random.randn(100, 30)
B = np.random.randn(30, 1000)
C = np.empty((1000, 1000))

%timeit np.dot(A, B)
The slowest run took 6.82 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 128 µs per loop

生Pythonで行列積

In [19]:
def my_mul(A, B):
    M_A, N = A.shape
    N_B = B.shape[1]
    C = np.zeros((M_A, N_B))
    for i in range(M_A):
        for j in range(N_B):
            for k in range(N):
                C[i, j] += A[i, k] * B[k, j]
    return C
%timeit my_mul(A, B)
1 loop, best of 3: 2.18 s per loop

甘めに見積もっても400倍遅い

Numbaで行列積

In [20]:
# @jit(nb.float64[:,:](nb.float64[:,:], nb.float64[:,:]), nopython=True)
@jit
def my_mul_numba(A, B):
    M_A, N = A.shape
    _, N_B = B.shape
    C = np.zeros((M_A, N_B))
    for i in range(M_A):
        for j in range(N_B):
            for k in range(N):
                C[i, j] += A[i, k] * B[k, j]
    return C
my_mul_numba(A, B)
%timeit my_mul_numba(A, B)
100 loops, best of 3: 2.96 ms per loop
In [21]:
%load_ext Cython
In [22]:
%%cython
cimport numpy as np
import numpy as np
def my_mul_cython(double[:, :] a, double[:, :] b):
    cdef int I, J, K, i, j, k
    I = a.shape[0]
    K = a.shape[1]
    J = b.shape[1]
    cdef double[:,:] res = np.zeros((I, J), dtype=np.float64)
    for i in range(I):
        for j in range(J):
            for k in range(K):
                res[i, j] += a[i, k] * b[k, j]
    return res
In [23]:
%timeit my_mul_cython(A, B)
10 loops, best of 3: 16 ms per loop

高速化まとめ

  1. まずは、Numpyの関数で書く!
  2. どうしても生PythonループがボトルネックになっていたらNumba等を検討!

本日の予定

  1. 自己紹介
  2. Pythonでの開発環境
  3. IPython magicの紹介
  4. 高速化Tips
  5. ライブラリ紹介 </font>

pandas

Pythonでのデータ分析の決定版

conda install pandas

詳しくはHPを参照。

In [24]:
import pandas as pd
In [25]:
%matplotlib inline
df = pd.DataFrame({
        "key1": np.random.choice(list("abcd"), 100),
        "value1": np.random.randn(100).cumsum(),
        "value2": np.random.randn(100).cumsum(),
    }, index=pd.date_range(start="2017/1/1", periods=100))
In [54]:
df.sort_values(by="value1")
Out[54]:
key1 value1 value2 value_vew
2017-02-20 d -4.908070 -1.670529 -118.231227
2017-02-19 d -4.365192 0.011510 -83.178288
2017-02-15 a -4.271795 1.018788 -77.952695
2017-02-23 a -3.912950 -1.816230 -59.911884
2017-02-16 a -3.790461 1.688558 -54.459811
2017-02-14 a -3.572720 1.371371 -45.603385
2017-02-18 b -3.397780 -0.818021 -39.227073
2017-02-22 c -3.158363 -2.303778 -31.505492
2017-02-21 c -3.090104 -1.839053 -29.506608
2017-01-27 c -3.080283 4.941603 -29.226175
2017-02-13 d -2.973293 2.346874 -26.285299
2017-02-24 d -2.780958 -3.478457 -21.507160
2017-02-12 c -2.759765 1.966700 -21.019201
2017-02-27 c -2.737506 -2.587332 -20.514693
2017-02-26 c -2.726013 -3.059300 -20.257414
2017-02-17 c -2.673516 0.571651 -19.109462
2017-02-02 b -2.423397 4.089299 -14.232251
2017-01-31 d -1.953145 4.120380 -7.450806
2017-02-25 b -1.862905 -3.094549 -6.465055
2017-01-28 b -1.676900 5.987021 -4.715434
2017-01-30 c -1.553757 4.060893 -3.751022
2017-01-29 d -1.523081 4.547681 -3.533206
2017-02-11 d -1.522616 1.498346 -3.529974
2017-02-10 c -1.509487 0.327255 -3.439446
2017-02-05 c -1.489176 1.172053 -3.302464
2017-02-04 d -1.455297 2.402920 -3.082155
2017-02-08 d -1.285586 -0.017715 -2.124728
2017-02-07 c -1.139390 1.179415 -1.479167
2017-01-26 b -1.132612 3.980100 -1.452924
2017-02-03 d -1.058684 4.570746 -1.186586
... ... ... ... ...
2017-03-19 a 5.374494 -1.491984 155.243224
2017-03-15 c 5.416435 0.682049 158.906091
2017-03-16 c 5.970573 0.647793 212.837444
2017-03-17 a 6.310396 -0.197718 251.286889
2017-03-11 c 6.345015 1.692446 255.445277
2017-03-14 d 6.401170 0.697449 262.287838
2017-03-22 a 6.501519 -1.813726 274.817628
2017-03-20 b 6.636097 0.020594 292.239064
2017-03-12 d 6.742945 1.312220 306.583566
2017-03-21 b 7.103938 -0.372933 358.506813
2017-03-13 a 7.237566 0.633622 379.120742
2017-04-01 b 7.258420 -1.861485 382.407399
2017-03-27 c 7.601698 -1.758172 439.270264
2017-03-29 a 7.715715 -2.054431 459.333914
2017-04-02 d 7.948185 -2.110594 502.115745
2017-03-31 d 7.992995 -1.190135 510.656272
2017-03-25 a 7.994062 -2.702783 510.860719
2017-03-23 a 7.994126 -2.023838 510.873052
2017-03-28 b 8.156463 -2.022518 542.632216
2017-03-24 d 8.628753 -0.717631 642.457018
2017-03-26 d 8.965640 -2.800344 720.682404
2017-03-30 a 9.089655 -1.787408 751.003974
2017-04-03 b 9.344795 -0.345774 816.036002
2017-04-08 a 9.344851 -2.375512 816.050816
2017-04-06 a 9.770426 -1.375781 932.696842
2017-04-04 c 9.925779 -0.248158 977.898422
2017-04-09 d 10.072163 -2.967651 1021.805374
2017-04-07 c 10.077440 -2.293754 1023.412524
2017-04-05 a 10.138698 -0.854287 1042.189051
2017-04-10 b 10.768021 -1.919146 1248.555180

100 rows × 4 columns

urllib

Web関連の標準ライブラリ。
ブラウザを介さず、Webページのデータにアクセスする。

In [57]:
import urllib
url = "https://www.google.co.jp/"
html = urllib.request.urlopen(url=url).read().decode("shift-jis")
html
Out[57]:
'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。" name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script>(function(){window.google={kEI:\'sZrcWJjHLoSX8QXIuZ-gDw\',kEXPI:\'18168,750722,1351891,1352993,1353038,1353106,1353148,3700336,3700347,3700405,4026240,4029815,4031109,4032677,4036527,4038012,4039268,4043492,4045841,4048347,4065786,4071842,4072364,4072774,4076095,4076999,4078430,4081038,4081165,4082441,4083458,4088341,4090462,4090550,4090553,4090806,4092245,4092934,4093224,4093313,4093791,4093951,4094251,4094544,4094832,4094878,4095787,4095910,4095999,4096323,4096743,4096747,4097129,4097150,4097203,4097470,4097866,4098048,4098051,4098721,4098728,4098752,4099309,4100121,4100128,4100169,4100226,4100379,4101301,4101376,4101651,4101681,4102030,4102109,4102233,4102238,4102302,4102410,4102658,4102987,4103060,4103183,4103475,4103987,4103999,4104290,4104737,4105239,8500572,8503585,8507381,8508229,8508707,8508931,8509037,8509373,8509823,10200083,16200027,19001922,19001928,41027342\',authuser:0,kscs:\'c9c918f0_24\'};google.kHL=\'ja\';})();(function(){google.lc=[];google.li=0;google.getEI=function(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||google.kEI};google.getLEI=function(a){for(var b=null;a&&(!a.getAttribute||!(b=a.getAttribute("leid")));)a=a.parentNode;return b};google.https=function(){return"https:"==window.location.protocol};google.ml=function(){return null};google.wl=function(a,b){try{google.ml(Error(a),!1,b)}catch(c){}};google.time=function(){return(new Date).getTime()};google.log=function(a,b,c,d,g){a=google.logUrl(a,b,c,d,g);if(""!=a){b=new Image;var e=google.lc,f=google.li;e[f]=b;b.onerror=b.onload=b.onabort=function(){delete e[f]};window.google&&window.google.vel&&window.google.vel.lu&&window.google.vel.lu(a);b.src=a;google.li=f+1}};google.logUrl=function(a,b,c,d,g){var e="",f=google.ls||"";c||-1!=b.search("&ei=")||(e="&ei="+google.getEI(d),-1==b.search("&lei=")&&(d=google.getLEI(d))&&(e+="&lei="+d));a=c||"/"+(g||"gen_204")+"?atyp=i&ct="+a+"&cad="+b+e+f+"&zx="+google.time();/^http:/i.test(a)&&google.https()&&(google.ml(Error("a"),!1,{src:a,glmm:1}),a="");return a};google.y={};google.x=function(a,b){google.y[a.id]=[a,b];return!1};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};}).call(this);var a=window.location,b=a.href.indexOf("#");if(0<=b){var c=a.href.substring(b+1);/(^|&)q=/.test(c)&&-1==c.indexOf("#")&&a.replace("/search?"+c.replace(/(^|&)fp=[^&]*/g,"")+"&cad=h")};</script><style>#gbar,#guser{font-size:13px;padding-top:1px !important;}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}\n</style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#36c}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}a.gb1,a.gb2,a.gb3,a.gb4{color:#11c !important}body{background:#fff;color:black}a{color:#11c;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#36c}a:visited{color:#551a8b}a.gb1,a.gb4{text-decoration:underline}a.gb3:hover{text-decoration:none}#ghead a.gb2:hover{color:#fff !important}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#eee;border:solid 1px;border-color:#ccc #999 #999 #ccc;height:30px}.lsbb{display:block}.ftl,#fll a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;font:15px arial,sans-serif;vertical-align:top}.lsb:active{background:#ccc}.lst:focus{outline:none}</style><script></script><link href="/images/branding/product/ico/googleg_lodp.ico" rel="shortcut icon"></head><body bgcolor="#fff"><script>(function(){var src=\'/images/nav_logo229.png\';var iesg=false;document.body.onload = function(){window.n && window.n();if (document.images){new Image().src=src;}\nif (!iesg){document.f&&document.f.q.focus();document.gbqf&&document.gbqf.q.focus();}\n}\n})();</script><div id="mngb"> <div id=gbar><nobr><b class=gb1>検索</b> <a class=gb1 href="https://www.google.co.jp/imghp?hl=ja&tab=wi">画像</a> <a class=gb1 href="https://maps.google.co.jp/maps?hl=ja&tab=wl">マップ</a> <a class=gb1 href="https://play.google.com/?hl=ja&tab=w8">Play</a> <a class=gb1 href="https://www.youtube.com/?gl=JP&tab=w1">YouTube</a> <a class=gb1 href="https://news.google.co.jp/nwshp?hl=ja&tab=wn">ニュース</a> <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a> <a class=gb1 href="https://drive.google.com/?tab=wo">ドライブ</a> <a class=gb1 style="text-decoration:none" href="https://www.google.co.jp/intl/ja/options/"><u>もっと見る</u> &raquo;</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe></span><a href="http://www.google.co.jp/history/optout?hl=ja" class=gb4>ウェブ履歴</a> | <a  href="/preferences?hl=ja" class=gb4>設定</a> | <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=ja&passive=true&continue=https://www.google.co.jp/" class=gb4>ログイン</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div> </div><center><br clear="all" id="lgpd"><div id="lga"><div style="padding:28px 0 3px"><div style="height:110px;width:276px;background:url(/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png) no-repeat" title="Google" align="left" id="hplogo" onload="window.lol&&lol()"><div style="color:#777;font-size:16px;font-weight:bold;position:relative;top:70px;left:218px" nowrap="">日本</div></div></div><br></div><form action="/search" name="f"><table cellpadding="0" cellspacing="0"><tr valign="top"><td width="25%">&nbsp;</td><td align="center" nowrap=""><input name="ie" value="Shift_JIS" type="hidden"><input value="ja" name="hl" type="hidden"><input name="source" type="hidden" value="hp"><input name="biw" type="hidden"><input name="bih" type="hidden"><div class="ds" style="height:32px;margin:4px 0"><input style="color:#000;margin:0;padding:5px 8px 0 6px;vertical-align:top" autocomplete="off" class="lst" value="" title="Google 検索" maxlength="2048" name="q" size="57"></div><br style="line-height:0"><span class="ds"><span class="lsbb"><input class="lsb" value="Google 検索" name="btnG" type="submit"></span></span><span class="ds"><span class="lsbb"><input class="lsb" value="I\'m Feeling Lucky" name="btnI" onclick="if(this.form.q.value)this.checked=1; else top.location=\'/doodles/\'" type="submit"></span></span></td><td class="fl sblc" align="left" nowrap="" width="25%"><a href="/advanced_search?hl=ja&amp;authuser=0">検索オプション</a><a href="/language_tools?hl=ja&amp;authuser=0">言語ツール</a></td></tr></table><input id="gbv" name="gbv" type="hidden" value="1"></form><div id="gac_scont"></div><div style="font-size:83%;min-height:3.5em"><br><div id="prm"><style>.szppmdbYutt__middle-slot-promo{font-size:small;margin-bottom:32px}.szppmdbYutt__middle-slot-promo a._uFi{display:inline-block;text-decoration:none}.szppmdbYutt__middle-slot-promo img{border:none;margin-right:5px;vertical-align:middle}.szppmdbYutt__middle-slot-promo ._vFi{color:red}</style><div class="szppmdbYutt__middle-slot-promo r-ihtjlwwx32_s" jsl="$t t-Gza07Ho9En4;$x 0;" data-ved="0ahUKEwjY48u7wv3SAhWES7wKHcjcB_QQnIcBCAQ">世界の果て、<a class="_XIi" href="https://www.google.com/url?q=https://www.google.com/maps/%4061.017504,-45.299466,3a,75y,248.21h,81.91t/data%3D!3m6!1e1!3m4!1sxRh_03mgvd7k4DYZhLy_fA!2e0!7i13312!8i6672&amp;source=hpp&amp;id=19001922&amp;ct=3&amp;usg=AFQjCNH148vqet6kG0_TQxHlPrh5dOClxg&amp;sa=X&amp;ved=0ahUKEwjY48u7wv3SAhWES7wKHcjcB_QQ8IcBCAU" rel="nofollow">グリーンランド</a>を Google Maps で旅してみよう</div></div></div><span id="footer"><div style="font-size:10pt"><div style="margin:19px auto;text-align:center" id="fll"><a href="/intl/ja/ads/">広告掲載</a><a href="http://www.google.co.jp/intl/ja/services/">ビジネス ソリューション</a><a href="https://plus.google.com/115899767381375908215" rel="publisher">+Google</a><a href="/intl/ja/about.html">Google について</a><a href="https://www.google.co.jp/setprefdomain?prefdom=US&amp;sig=__OG4tUXmrI6xtdwLygE0gKh0oEF4%3D" id="fehl">Google.com</a></div></div><p style="color:#767676;font-size:8pt">&copy; 2017 - <a href="/intl/ja/policies/privacy/">プライバシー</a> - <a href="/intl/ja/policies/terms/">規約</a></p></span></center><script>(function(){window.google.cdo={height:0,width:0};(function(){var a=window.innerWidth,b=window.innerHeight;if(!a||!b)var c=window.document,d="CSS1Compat"==c.compatMode?c.documentElement:c.body,a=d.clientWidth,b=d.clientHeight;a&&b&&(a!=google.cdo.width||b!=google.cdo.height)&&google.log("","","/client_204?&atyp=i&biw="+a+"&bih="+b+"&ei="+google.kEI);}).call(this);})();</script><div id="xjsd"></div><div id="xjsi"><script>(function(){function c(b){window.setTimeout(function(){var a=document.createElement("script");a.src=b;document.getElementById("xjsd").appendChild(a)},0)}google.dljp=function(b,a){google.xjsu=b;c(a)};google.dlj=c;}).call(this);(function(){window.google.xjsrm=[\'mids\'];})();if(google.y)google.y.first=[];if(!google.xjs){window._=window._||{};window._DumpException=window._._DumpException=function(e){throw e};if(google.timers&&google.timers.load.t){google.timers.load.t.xjsls=new Date().getTime();}google.dljp(\'/xjs/_/js/k\\x3dxjs.hp.en_US.q7EuCVIfdZw.O/m\\x3dsb_he,d/am\\x3dAAg/rt\\x3dj/d\\x3d1/t\\x3dzcms/rs\\x3dACT90oHF3pWF1nFj9p3M-bzcFbKqP3_GDw\',\'/xjs/_/js/k\\x3dxjs.hp.en_US.q7EuCVIfdZw.O/m\\x3dsb_he,d/am\\x3dAAg/rt\\x3dj/d\\x3d1/t\\x3dzcms/rs\\x3dACT90oHF3pWF1nFj9p3M-bzcFbKqP3_GDw\');google.xjs=1;}google.pmc={"sb_he":{"agen":true,"cgen":true,"client":"heirloom-hp","dh":true,"dhqt":true,"ds":"","fl":true,"host":"google.co.jp","isbh":28,"jam":0,"jsonp":true,"msgs":{"cibl":"検索をクリア","dym":"もしかして:","lcky":"I\\u0026#39;m Feeling Lucky","lml":"詳細","oskt":"入力ツール","psrc":"この検索キーワードは\\u003Ca href=\\"/history\\"\\u003Eウェブ履歴\\u003C/a\\u003Eから削除されました","psrl":"削除","sbit":"画像で検索","srch":"Google 検索"},"nds":true,"ovr":{},"pq":"","refpd":true,"refspre":true,"rfs":[],"sbpl":24,"sbpr":24,"scd":10,"sce":5,"stok":"QvGsUPVi6o8TMYk4ZCqzdiv9v2U"},"d":{},"YFCs/g":{}};google.y.first.push(function(){if(google.med){google.med(\'init\');google.initHistory();google.med(\'history\');}});if(google.j&&google.j.en&&google.j.xi){window.setTimeout(google.j.xi,0);}\n</script></div></body></html>'

plotly

ブラウザで表示する可視化ツール

インタラクティブな可視化がしたい人にオススメ!

In [58]:
import plotly.offline as py
import plotly.graph_objs as go
py.init_notebook_mode()