ダッシュフレームワーク

この章では、Dashフレームワークについて詳しく説明します。

Dashは、分析Webアプリケーションの構築に使用されるオープンソースのPythonフレームワークです。これは、データ駆動型アプリケーションの開発を簡素化する強力なライブラリです。これは、Web開発にあまり精通していないPythonデータサイエンティストにとって特に便利です。ユーザーは、ダッシュを使用してブラウザーですばらしいダッシュボードを作成できます。

Dashは、Plotly.js、React、Flaskの上に構築されており、ドロップダウン、スライダー、グラフなどの最新のUI要素を分析用のPythonコードに直接結び付けます。

ダッシュアプ​​リは、HTTPリクエストを介してJSONパケットを使用してフロントエンドのReactコンポーネントと通信するFlaskサーバーで構成されています。

ダッシュアプ​​リケーションは純粋にPythonで記述されているため、HTMLやJavaScriptは必要ありません。

ダッシュセットアップ

Dashが端末にまだインストールされていない場合は、以下のDashライブラリをインストールします。これらのライブラリは活発に開発されているため、頻繁にインストールしてアップグレードしてください。Python2および3もサポートされています。

  • pip install dash == 0.23.1#コアダッシュバックエンド
  • pip install dash-renderer == 0.13.0#ダッシュフロントエンド
  • pip install dash-html-components == 0.11.0#HTMLコンポーネント
  • pip install dash-core-components == 0.26.0#過給されたコンポーネント
  • pip install plotly == 3.1.0#プロットグラフライブラリ

すべてが正しく機能していることを確認するために、ここでは、単純なdashApp.pyファイルを作成しました。

ダッシュまたはアプリのレイアウト

ダッシュアプ​​リは2つの部分で構成されています。最初の部分は、アプリの「レイアウト」であり、基本的にアプリケーションがどのように見えるかを説明します。2番目の部分では、アプリケーションの対話性について説明します。

コアコンポーネント

でレイアウトを構築できます dash_html_components そしてその dash_core_components図書館。Dashは、アプリケーションのすべてのビジュアルコンポーネントにPythonクラスを提供します。JavaScriptとReact.jsを使用して独自のコンポーネントをカスタマイズすることもできます。

dash_core_componentsをdccとしてインポートします

dash_html_componentsをhtmlとしてインポートします

dash_html_componentsはすべてのHTMLタグ用であり、dash_core_componentsはReact.jsで構築された対話機能用です。

上記の2つのライブラリを使用して、以下のようなコードを記述しましょう。

app = dash.Dash()
app.layout = html.Div(children=[
   html.H1(children='Hello Dash'),
   html.Div(children='''Dash Framework: A web application framework for Python.''')

そして、同等のHTMLコードは次のようになります-

<div>
   <h1> Hello Dash </h1>
   <div> Dash Framework: A web application framework for Python. </div>
</div>

シンプルなダッシュアプ​​リを書く

上記のライブラリをファイルに使用して、ダッシュで簡単な例を書く方法を学びます。 dashApp.py

# -*- coding: utf-8 -*-
import dash
import dash_core_components as dcc
import dash_html_components as html

app = dash.Dash()
app.layout = html.Div(children=[
   html.H1(children='Hello Dash'),
   html.Div(children='''Dash Framework: A web application framework for Python.'''),
	
   dcc.Graph(
      id='example-graph',
      figure={
         'data': [
            {'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': 'Delhi'},
            {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Mumbai'},
         ],
         'layout': {
            'title': 'Dash Data Visualization'
         }
      }
   )
])

if __name__ == '__main__':
   app.run_server(debug=True)

Dashアプリの実行

Dashアプリの実行中は、次の点に注意してください。

(MyDjangoEnv)C:\ Users \ rajesh \ Desktop \ MyDjango \ dash> python dashApp1.py

  • Flaskアプリ「dashApp1」の提供(遅延読み込み)

  • 環境:生産

    警告:実稼働環境で開発サーバーを使用しないでください。

    代わりに、運用WSGIサーバーを使用してください。

  • デバッグモード:オン

  • 統計で再起動

  • デバッガーがアクティブです!

  • デバッガーPIN:130-303-947

  • 実行中 http://127.0.0.1:8050/ (CTRL + Cを押して終了します)

127.0.0.1 - - [12/Aug/2018 09:32:39] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Aug/2018 09:32:42] "GET /_dash-layout HTTP/1.1" 200 -
127.0.0.1 - - [12/Aug/2018 09:32:42] "GET /_dash-dependencies HTTP/1.1" 200 -
127.0.0.1 - - [12/Aug/2018 09:32:42] "GET /favicon.ico HTTP/1.1" 200 -
127.0.0.1 - - [12/Aug/2018 09:39:52] "GET /favicon.ico HTTP/1.1" 200 -

訪問 http:127.0.0.1:8050/Webブラウザで。このようなアプリが表示されるはずです。

上記のプログラムにおいて、注意すべきいくつかの重要な点は次のとおりです。

  • アプリのレイアウトは、html.Divやdcc.Graphなどの「コンポーネント」のツリーで構成されています。

  • dash_html_componentsライブラリには、すべてのHTMLタグのコンポーネントがあります。html.H1(children = 'Hello Dash')コンポーネントは、アプリケーションで<h1> Hello Dash </ h1> HTML要素を生成します。

  • すべてのコンポーネントが純粋なHTMLであるとは限りません。dash_core_componentsは、インタラクティブで、React.jsライブラリを介してJavaScript、HTML、およびCSSで生成される高レベルのコンポーネントを記述します。

  • 各コンポーネントは、キーワード属性によって完全に記述されます。ダッシュは宣言型です。主に、これらの属性を使用してアプリケーションを説明します。

  • 子供のプロパティは特別です。慣例により、これは常に最初の属性であり、省略できることを意味します。

  • Html.H1(children = 'Hello Dash')は、html.H1( 'Hello Dash')と同じです。

  • アプリケーションのフォントは、ここに表示されているものとは少し異なって見えます。このアプリケーションは、カスタムCSSスタイルシートを使用して、要素のデフォルトスタイルを変更しています。カスタムフォントスタイルは許容されますが、現時点では、以下のURLまたは任意のURLを追加できます-

    app.css.append_css({“ external_url”:https://codepen.io/chriddyp/pen/bwLwgP.css})これらの例と同じルックアンドフィールを取得するためにファイルを取得します。

HTMLの詳細

dash_html_componentsライブラリには、すべてのHTMLタグのコンポーネントクラスと、すべてのHTML引数のキーワード引数が含まれています。

以前のアプリテキストにコンポーネントのインラインスタイルを追加しましょう-

# -*- coding: utf-8 -*-
import dash
import dash_core_components as dcc
import dash_html_components as html

app = dash.Dash()
colors = {
   'background': '#87D653',
   'text': '#ff0033'
}

app.layout = html.Div(style={'backgroundColor': colors['background']}, children=[
   html.H1(
      children='Hello Dash',
      style={
         'textAlign': 'center',
         'color': colors['text']
      }
   ),
	
   html.Div(children='Dash: A web application framework for Python.', style={
      'textAlign': 'center',
      'color': colors['text']
   }),
	
   dcc.Graph(
      id='example-graph-2',

      figure={
         'data': [
            {'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': 'Delhi'},
            {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Mumbai'},
         ],
         'layout': {
            'plot_bgcolor': colors['background'],
            'paper_bgcolor': colors['background'],
            'font': {
               'color': colors['text']
            }
         }
      }
   )
])

if __name__ == '__main__':
   app.run_server(debug=True)

上記の例では、html.Divおよびhtml.H1コンポーネントのインラインスタイルをstyleプロパティで変更しました。

Dashアプリケーションでは次のようにレンダリングされます-

dash_html_componentsとHTML属性の間にはいくつかの重要な違いがあります-

  • ダッシュのスタイルプロパティの場合、辞書を指定するだけですが、HTMLの場合はセミコロンで区切られた文字列です。

  • スタイル辞書のキーは camelCased、したがって、text-alignはに変更されます textalign

  • DashのClassNameは、HTMLクラス属性に似ています。

  • 最初の引数は、childrenキーワード引数で指定されたHTMLタグの子です。

再利用可能なコンポーネント

Pythonでマークアップを作成することにより、コンテキストや言語を切り替えることなく、テーブルなどの複雑で再利用可能なコンポーネントを作成できます。

以下は、パンダのデータフレームから「テーブル」を生成する簡単な例です。

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd

df = pd.read_csv(
   'https://gist.githubusercontent.com/chriddyp/'
   'c78bf172206ce24f77d6363a2d754b59/raw/'
   'c353e8ef842413cae56ae3920b8fd78468aa4cb2/'
   'usa-agricultural-exports-2011.csv')
	
def generate_table(dataframe, max_rows=10):
   return html.Table(
      # Header
      [html.Tr([html.Th(col) for col in dataframe.columns])] +
      # Body
      [html.Tr([
         html.Td(dataframe.iloc[i][col]) for col in dataframe.columns
      ]) for i in range(min(len(dataframe), max_rows))]
   )
	
app = dash.Dash()
app.layout = html.Div(children=[
   html.H4(children='US Agriculture Exports (2011)'),
   generate_table(df)
])

if __name__ == '__main__':
   app.run_server(debug=True)

出力は次のようになります-

視覚化の詳細

dash_core_componentsライブラリには、というコンポーネントが含まれています Graph

Graphは、オープンソースのplotly.jsJavaScriptグラフ作成ライブラリを使用してインタラクティブなデータの視覚化をレンダリングします。Plotly.jsは、約35種類のグラフをサポートし、ベクター品質のSVGと高性能WebGLの両方でグラフをレンダリングします。

以下は、パンダのデータフレームから散布図を作成する例です。

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly.graph_objs as go

app = dash.Dash()

df = pd.read_csv(
   'https://gist.githubusercontent.com/chriddyp/' +
   '5d1ea79569ed194d432e56108a04d188/raw/' +
   'a9f9e8076b837d541398e999dcbac2b2826a81f8/'+
   'gdp-life-exp-2007.csv')
	
app.layout = html.Div([
   dcc.Graph(
      id='life-exp-vs-gdp',
      figure={
         'data': [
            go.Scatter(
               x=df[df['continent'] == i]['gdp per capita'],
               y=df[df['continent'] == i]['life expectancy'],
               text=df[df['continent'] == i]['country'],
               mode='markers',
               opacity=0.7,
               marker={
                  'size': 15,
                  'line': {'width': 0.5, 'color': 'white'}
               },
               name=i
            ) for i in df.continent.unique()
         ],
         'layout': go.Layout(
            xaxis={'type': 'log', 'title': 'GDP Per Capita'},
            yaxis={'title': 'Life Expectancy'},
            margin={'l': 40, 'b': 40, 't': 10, 'r': 10},
            legend={'x': 0, 'y': 1},
            hovermode='closest'
         )
      }
   )
])

if __name__ == '__main__':
   app.run_server()

上記のコードの出力は次のとおりです-

これらのグラフはインタラクティブで応答性があります。ポイントにカーソルを合わせると値が表示され、凡例アイテムをクリックしてトレースを切り替えたり、クリックしてドラッグしてズームしたり、Shiftキーを押しながらクリックしてドラッグしてパンしたりできます。

マークダウン

dashはdash_html_componentsライブラリを介してHTMLフレーバーを公開しますが、コピーをHTMLで作成するのは面倒な場合があります。テキストのブロックを書き込むために、dash_core_componentsライブラリのMarkdownコンポーネントを使用できます。

コアコンポーネント

dash_core_componentsには、ドロップダウン、グラフ、マークダウン、ブロックなどの高レベルのコンポーネントのセットが含まれています。

他のすべてのDashコンポーネントと同様に、それらは完全に宣言的に記述されています。構成可能なすべてのオプションは、コンポーネントのキーワード引数として使用できます。

以下は、利用可能なコンポーネントのいくつかを使用した例です-

# -*- coding: utf-8 -*-
import dash
import dash_core_components as dcc
import dash_html_components as html

app = dash.Dash()

app.layout = html.Div([
   html.Label('Dropdown'),
   dcc.Dropdown(
      options=[
         {'label': 'New York City', 'value': 'NYC'},
         {'label': u'Montréal', 'value': 'MTL'},
         {'label': 'San Francisco', 'value': 'SF'}
      ],
      value='MTL'
   ),
	
   html.Label('Multi-Select Dropdown'),
   dcc.Dropdown(
      options=[
         {'label': 'New York City', 'value': 'NYC'},
         {'label': u'Montréal', 'value': 'MTL'},
         {'label': 'San Francisco', 'value': 'SF'}
      ],
      value=['MTL', 'SF'],
      multi=True
   ),
	
   html.Label('Radio Items'),
   dcc.RadioItems(
      options=[
         {'label': 'New York City', 'value': 'NYC'},
         {'label': u'Montréal', 'value': 'MTL'},
         {'label': 'San Francisco', 'value': 'SF'}
      ],
      value='MTL'
   ),
	
   html.Label('Checkboxes'),
   dcc.Checklist(
      options=[
         {'label': 'New York City', 'value': 'NYC'},
         {'label': u'Montréal', 'value': 'MTL'},
         {'label': 'San Francisco', 'value': 'SF'}
      ],
      values=['MTL', 'SF']
   ),

   html.Label('Text Input'),
   dcc.Input(value='MTL', type='text'),
	
   html.Label('Slider'),
   dcc.Slider(
      min=0,
      max=9,
      marks={i: 'Label {}'.format(i) if i == 1 else str(i) for i in range(1, 6)},
      value=5,
   ),
], style={'columnCount': 2})

if __name__ == '__main__':
   app.run_server(debug=True)

上記のプログラムからの出力は次のとおりです-

ヘルプの呼び出し

ダッシュコンポーネントは宣言型です。これらのコンポーネントの構成可能なすべての側面は、インストール中にキーワード引数として設定されます。コンポーネントとその使用可能な引数の詳細については、任意のコンポーネントのPythonコンソールでヘルプを呼び出すことができます。それらのいくつかを以下に示します-

>>> help(dcc.Dropdown)
Help on class Dropdown in module builtins:
class Dropdown(dash.development.base_component.Component)
| A Dropdown component.
| Dropdown is an interactive dropdown element for selecting one or more

| items.
| The values and labels of the dropdown items are specified in the `options`
| property and the selected item(s) are specified with the `value` property.
|
| Use a dropdown when you have many options (more than 5) or when you are
| constrained for space. Otherwise, you can use RadioItems or a Checklist,
| which have the benefit of showing the users all of the items at once.
|
| Keyword arguments:
| - id (string; optional)
| - options (list; optional): An array of options
| - value (string | list; optional): The value of the input. If `multi` is false (the default)
-- More --

要約すると、Dashアプリのレイアウトは、アプリがどのように見えるかを示しています。レイアウトは、コンポーネントの階層ツリーです。dash_html_componentsライブラリは、すべてのHTMLタグとキーワード引数のクラスを提供し、style、className、idなどのHTML属性を記述します。dash_core_componentsライブラリは、コントロールやグラフなどの高レベルのコンポーネントを生成します。