j1-template 2022.5.0.rc1 → 2022.5.0.rc4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/assets/data/banner.html +24 -1
- data/assets/themes/j1/adapter/js/masterslider.js +22 -5
- data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +56 -0
- data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
- data/lib/j1/version.rb +1 -1
- data/lib/starter_web/Gemfile +270 -270
- data/lib/starter_web/_config.yml +19 -9
- data/lib/starter_web/_data/blocks/banner.yml +17 -0
- data/lib/starter_web/_data/modules/defaults/masterslider.yml +1 -1
- data/lib/starter_web/_data/modules/justifiedGallery.yml +82 -0
- data/lib/starter_web/_data/modules/masterslider.yml +5 -9
- data/lib/starter_web/_data/modules/navigator_menu.yml +208 -168
- data/lib/starter_web/_includes/attributes.asciidoc +18 -14
- data/lib/starter_web/_includes/tables/template_variables.asciidoc +1 -1
- data/lib/starter_web/_plugins/asciidoctor-extensions/lightbox-block.rb +4 -4
- data/lib/starter_web/assets/images/pages/features/blog-post-navigator-1280x1000.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/bootswatch-themes-1280x800.png +0 -0
- data/lib/starter_web/assets/images/pages/features/clipboard-1280x600.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/comments-1280x600.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/cookie-consent-1280x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/desktop-web-navigation-1280x1000.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/example-content-1280x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/example-content-present-videos-1280x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/fab-1280x500.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/full-text-search-1280x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/global-mobile-traffic-1920x1080.png +0 -0
- data/lib/starter_web/assets/images/pages/features/google-lighthouse-1080x300.png +0 -0
- data/lib/starter_web/assets/images/pages/features/intro-panel-1280x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/master-header-1280x600.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/mobile-navigation-600x800.png +0 -0
- data/lib/starter_web/assets/images/pages/features/native-speakers-by-language.png +0 -0
- data/lib/starter_web/assets/images/pages/features/nav-module-1280x300.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/nbi-barchart-1280x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/teaser-banner-1280x600.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/translator-1280x800.jpg +0 -0
- data/lib/starter_web/assets/images/sticker/600x600/sticker-new-version.png +0 -0
- data/lib/starter_web/assets/images/sticker/scalable/readme +0 -0
- data/lib/starter_web/package.json +6 -6
- data/lib/starter_web/pages/public/_jupyter/docs/_includes/attributes.asciidoc +67 -0
- data/lib/starter_web/pages/public/_jupyter/docs/_includes/documents/j1_docs_example_static.asciidoc +232 -0
- data/lib/starter_web/pages/public/_jupyter/docs/binderhub.adoc +631 -0
- data/lib/starter_web/pages/public/_jupyter/docs/j1-nbinteract.adoc +638 -0
- data/lib/starter_web/pages/public/_jupyter/docs/jupyterhub.adoc +248 -0
- data/lib/starter_web/pages/public/_jupyter/docs/nbinteract-widget-manual.adoc +928 -0
- data/lib/starter_web/pages/public/_jupyter/examples/distributed/j1-circular-times-table.adoc +139 -0
- data/lib/starter_web/pages/public/_jupyter/examples/distributed/j1-common-used-widgets.adoc +229 -0
- data/lib/starter_web/pages/public/_jupyter/examples/distributed/j1-odes-in-python.adoc +112 -0
- data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-altair/j1-altair-visualisations.adoc +142 -0
- data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-bokeh/j1-bokeh-visualisations.adoc +171 -0
- data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-bokeh/j1-bqplot-eamples.adoc +111 -0
- data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-plotly/j1-plotly-visualisations.adoc +94 -0
- data/lib/starter_web/pages/public/_jupyter/examples/localized/j1_climate-change-forecast.adoc +106 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_interactive-checkpoint.ipynb +16260 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_bgplot_line_plot-checkpoint.ipynb +247 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-Copy1-checkpoint.ipynb +12382 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-checkpoint.ipynb +12387 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-short-checkpoint.ipynb +12170 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_climate_change_forecast-checkpoint.ipynb +1058 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_docs_example_dynamic-checkpoint.ipynb +14478 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive_widgets-Copy1-checkpoint.ipynb +379 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive_widgets-checkpoint.ipynb +442 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets-checkpoint.ipynb +523 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets.line_charts-checkpoint.ipynb +84 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets.questions-checkpoint.ipynb +194 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_chart-checkpoint.ipynb +89 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_charts-Copy1-checkpoint.ipynb +164 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_charts-checkpoint.ipynb +173 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_charts.1-checkpoint.ipynb +256 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_barcharts-checkpoint.ipynb +126 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_hist_chart-checkpoint.ipynb +87 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_line_chart-checkpoint.ipynb +90 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_line_charts-checkpoint.ipynb +87 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_question_multiple_choice-checkpoint.ipynb +64 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_question_short_answer-checkpoint.ipynb +122 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_questions-checkpoint.ipynb +181 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_scatter_chart-checkpoint.ipynb +89 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_scatter_charts-checkpoint.ipynb +175 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_scatter_drag_chart-checkpoint.ipynb +87 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_ode_selected-checkpoint.ipynb +14478 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_odes_in_python-checkpoint.ipynb +15227 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/factor_by_factor.mp4 +0 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_circular_times_table.ipynb +12382 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_climate_change_forecast.ipynb +1058 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_docs_example_dynamic.ipynb +14478 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_interactive_widgets.ipynb +442 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets.ipynb +523 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_bar_chart.ipynb +89 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_hist_chart.ipynb +87 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_line_chart.ipynb +90 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_question_multiple_choice.ipynb +64 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_question_short_answer.ipynb +122 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_scatter_chart.ipynb +89 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_scatter_drag_chart.ipynb +87 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_odes_in_python.ipynb +15227 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/line_by_line.mp4 +0 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1/point_by_point.mp4 +0 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/.ipynb_checkpoints/j1_altair_interactive-checkpoint.ipynb +16296 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/.ipynb_checkpoints/j1_altair_non_interactive-checkpoint.ipynb +15385 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/j1_altair_interactive.ipynb +16296 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/j1_altair_non_interactive.ipynb +15385 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/00 - Introduction and Setup-checkpoint.ipynb +717 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/01 - Basic Plotting-checkpoint.ipynb +1381 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/02 - Styling and Theming-checkpoint.ipynb +1440 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/03 - Data Sources and Transformations-checkpoint.ipynb +927 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/04 - Adding Annotations-checkpoint.ipynb +1105 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/05 - Presentation Layouts-checkpoint.ipynb +578 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/06 - Linking and Interactions-checkpoint.ipynb +1196 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/07 - Bar and Categorical Data Plots-checkpoint.ipynb +1681 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/08 - Graph and Network Plots-checkpoint.ipynb +680 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/09 - Geographic Plots-checkpoint.ipynb +693 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/10 - Exporting and Embedding-checkpoint.ipynb +751 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/11 - Running Bokeh Applications-checkpoint.ipynb +770 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/bokeh_tut_00_introduction_and_setup-checkpoint.ipynb +666 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_01_basic_plotting-checkpoint.ipynb +1365 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_02_styling_and_theming-checkpoint.ipynb +1405 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_03_data_sources_and_transformations-checkpoint.ipynb +856 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_04_adding_annotations-checkpoint.ipynb +1167 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_05_presentation_layouts-checkpoint.ipynb +601 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_06_linking_and_interactions-checkpoint.ipynb +1356 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_07_bar_and_categorical_data_plots-checkpoint.ipynb +1742 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_08_graph_and_network_plots-checkpoint.ipynb +625 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_09_geographic_plots-checkpoint.ipynb +685 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_10_exporting_and_embedding-checkpoint.ipynb +726 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_10_exporting_and_embedding-checkpoint.org +726 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_10_exporting_and_embedding.new-checkpoint.ipynb +560 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_11_running_bokeh_applications-checkpoint.ipynb +716 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_01_basic_plotting.ipynb +1365 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_02_styling_and_theming.ipynb +1405 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_03_data_sources_and_transformations.ipynb +856 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_04_adding_annotations.ipynb +1167 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_05_presentation_layouts.ipynb +601 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_06_linking_and_interactions.ipynb +1356 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_07_bar_and_categorical_data_plots.ipynb +1742 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_08_graph_and_network_plots.ipynb +625 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_09_geographic_plots.ipynb +685 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/.ipynb_checkpoints/j1_mathplot_vs_bqplot-checkpoint.ipynb +336 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/advanced/Feature_Vector_Distribution-Iris-Digits.ipynb +433 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/j1_bgplot_line_plot.ipynb +244 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/j1_circular_times_table-short.ipynb +12170 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/j1_mathplot_vs_bqplot.ipynb +336 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/.ipynb_checkpoints/Index-checkpoint.ipynb +163 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/.ipynb_checkpoints/Tutorials-checkpoint.ipynb +51 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Advanced Plotting.ipynb +289 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Animations.ipynb +266 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Axis Properties.ipynb +396 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Plotting Dates.ipynb +318 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Equity Index Performance/Time Series.ipynb +158 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Equity Index Performance/spx_prices.csv +6799 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Feature_Vector_Distribution-Iris-Digits.ipynb +470 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Index.ipynb +49 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Logs Analytics/Logs Dashboard.ipynb +378 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Mobile Patent Suits.ipynb +123 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Neural Network.ipynb +177 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Outlier Detection.ipynb +311 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/Bubble Chart.ipynb +255 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/Choropleth.ipynb +275 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/nations.json +1 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/world_map_codes.csv +234 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/.ipynb_checkpoints/Basic Plotting-checkpoint.ipynb +186 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/.ipynb_checkpoints/Pyplot-checkpoint.ipynb +794 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/.ipynb_checkpoints/Untitled-checkpoint.ipynb +323 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/Basic Plotting.ipynb +261 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/Pyplot.ipynb +1489 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Index.ipynb +163 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Interactions/Interaction Layer.ipynb +966 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Interactions/Mark Interactions.ipynb +476 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Interactions/Selectors.ipynb +427 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Introduction.ipynb +528 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Bars.ipynb +480 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Bins.ipynb +217 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Boxplot.ipynb +253 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Candles.ipynb +225 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/FlexLine.ipynb +123 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Graph.ipynb +357 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/GridHeatMap.ipynb +422 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/HeatMap.ipynb +157 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Hist.ipynb +176 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Image.ipynb +195 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Label.ipynb +189 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Lines.ipynb +565 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Map.ipynb +182 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Market Map.ipynb +315 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Pie.ipynb +465 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Scatter.ipynb +835 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Bars.ipynb +362 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Bins.ipynb +252 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Boxplot.ipynb +273 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Candles.ipynb +242 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/GridHeatMap.ipynb +417 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/HeatMap.ipynb +155 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Hist.ipynb +238 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Image.ipynb +152 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Label.ipynb +206 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Lines.ipynb +474 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Map.ipynb +181 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Pie.ipynb +310 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Scatter.ipynb +702 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Scales/Color Scales.ipynb +495 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Feature_Vector_Distribution-Iris-Digits-checkpoint.ipynb +433 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Linking Plots With Widgets-checkpoint.ipynb +326 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Updating Plots-Copy1-checkpoint.ipynb +177 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Updating Plots-checkpoint.ipynb +177 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Brush Interval Selector.ipynb +154 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Fast Interval Selector.ipynb +152 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Gaussian Density Widget.ipynb +128 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Gaussian Density.ipynb +113 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Linking Plots With Widgets.ipynb +326 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Object Model.ipynb +179 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Pyplot.ipynb +174 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Updating Plots.ipynb +177 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials.ipynb +51 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/country_codes.csv +213 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/gdp_per_capita.csv +56 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/state_codes.csv +52 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/trees.jpg +0 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_examples_central_limit_theorem-checkpoint.ipynb +247 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_examples_variability_of_the_sample_mean-checkpoint.ipynb +323 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_graphing-checkpoint.ipynb +387 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_interactive_questions-checkpoint.ipynb +185 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_layout-checkpoint.ipynb +384 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_interact-checkpoint.ipynb +254 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_monty_hall-checkpoint.ipynb +732 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_central_limit_theorem.ipynb +247 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_correlation.ipynb +651 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_empirical_distributions.ipynb +773 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_linear_regression.ipynb +111 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_probability_distribution_plots.ipynb +199 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_sampling_from_a_population.ipynb +421 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_variability_of_the_sample_mean.ipynb +323 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_recipes_graphing.ipynb +387 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_recipes_interactive_questions.ipynb +185 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_recipes_layout.ipynb +384 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_tutorial_interact.ipynb +254 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_tutorial_monty_hall.ipynb +732 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Advanced Plotting.html +373 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Animations.html +361 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Axis Properties.html +569 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Bars.html +487 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Basic Plotting.html +341 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Bins.html +259 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Boxplot.html +277 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Brush Interval Selector.html +182 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Bubble Chart.html +299 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Candles.html +252 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Choropleth.html +318 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Color Scales.html +514 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Fast Interval Selector.html +182 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Feature_Vector_Distribution-Iris-Digits.html +479 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/FlexLine.html +128 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Gaussian Density Widget.html +152 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Gaussian Density.html +137 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Graph.html +484 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/GridHeatMap.html +483 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/HeatMap.html +170 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Hist.html +349 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Image.html +177 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Index.html +29 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Interaction Layer.html +1372 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Introduction.html +749 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Label.html +268 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Lines.html +704 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Linking Plots With Widgets.html +389 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Logs Dashboard.html +455 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Map.html +229 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Mark Interactions.html +613 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Market Map.html +413 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Mobile Patent Suits.html +131 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Neural Network.html +190 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Object Model.html +193 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Outlier Detection.html +363 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Pie.html +367 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Plotting Dates.html +337 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Pyplot.html +196 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Scatter.html +948 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Selectors.html +489 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Time Series.html +173 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Tutorials.html +40 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Updating Plots.html +228 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_altair_interactive.html +2216 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_altair_non_interactive.html +1170 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bgplot_line_plot.html +318 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_01_basic_plotting.html +1479 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_02_styling_and_theming.html +1524 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_03_data_sources_and_transformations.html +983 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_04_adding_annotations.html +1280 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_05_presentation_layouts.html +660 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_06_linking_and_interactions.html +1563 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_07_bar_and_categorical_data_plots.html +1888 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_08_graph_and_network_plots.html +689 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_09_geographic_plots.html +767 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_circular_times_table-short.html +475 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_circular_times_table.html +747 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_climate_change_forecast.html +1250 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_docs_example_dynamic.html +186 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_interactive_widgets.html +512 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_mathplot_vs_bqplot.html +407 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets.html +629 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_bar_chart.html +95 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_hist_chart.html +93 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_line_chart.html +96 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_question_multiple_choice.html +70 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_question_short_answer.html +156 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_chart.html +95 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_drag_chart.html +93 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_odes_in_python.html +955 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_central_limit_theorem.html +290 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_correlation.html +818 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_empirical_distributions.html +351 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_linear_regression.html +106 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_probability_distribution_plots.html +228 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_sampling_from_a_population.html +518 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_variability_of_the_sample_mean.html +372 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_recipes_graphing.html +473 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_recipes_interactive_questions.html +242 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_recipes_layout.html +496 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_tutorial_interact.html +329 -0
- data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_tutorial_monty_hall.html +866 -0
- data/lib/starter_web/pages/public/_jupyter/where_to_go.adoc +270 -0
- data/lib/starter_web/pages/public/features/general.adoc +74 -33
- data/lib/starter_web/pages/public/features/template.adoc +159 -68
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_interactive_widgets.html +512 -512
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets.html +629 -629
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_bar_chart.html +95 -95
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_hist_chart.html +93 -93
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_line_chart.html +96 -96
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_question_multiple_choice.html +70 -70
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_question_short_answer.html +156 -156
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_chart.html +95 -95
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_drag_chart.html +93 -93
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_odes_in_python.html +955 -955
- data/lib/starter_web/pages/public/learn/_roundtrip/100_present_images.adoc +313 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/100_present_videos.adoc +281 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/200_typography.adoc +253 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/300_icon_fonts.adoc +579 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/400_asciidoc_extensions.adoc +718 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/410_bs_modals_extentions.adoc +91 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/420_responsive_tables_extensions.adoc +420 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/500_themes.adoc +250 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/600_quicksearch.adoc +425 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/attributes.asciidoc +118 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/100_gistblock.asciidoc +28 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_bottom_info.asciidoc +14 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_bottom_left_warning.asciidoc +11 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_bottom_right_danger.asciidoc +11 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_central_success.asciidoc +11 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_full_height_left_info.asciidoc +11 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_full_height_right_success.asciidoc +11 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_table_bs_modal_examples.asciidoc +47 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_top_info.asciidoc +11 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_top_left_info.asciidoc +11 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_top_right_success.asciidoc +11 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/419_advanced_modals_demo.asciidoc +337 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/tables/bs_modal_examples.asciidoc +47 -0
- data/lib/starter_web/pages/public/learn/_roundtrip/_includes/google-ad.js +130 -0
- data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +6 -5
- data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +1 -2
- data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +4 -2
- data/lib/starter_web/pages/public/learn/roundtrip/500_themes.adoc +1 -1
- data/lib/starter_web/pages/public/learn/roundtrip/_includes/attributes.asciidoc +1 -1
- data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
- data/lib/starter_web/utilsrv/package.json +1 -1
- metadata +384 -17
- data/lib/starter_web/_includes/_attributes.asciidoc +0 -575
- data/lib/starter_web/assets/images/pages/features/bootswatch-themes-1080x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/comments-1080x600.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/cookie-consent-1080x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/example-content-present-videos-1080x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/fab-1080x500.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/full-text-search-1080x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/global-mobile-traffic-1920x1080.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/google-lighthouse-1080x300.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/intro-panel-1080x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/mobile-navigation-600x800.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/native-speakers-by-language.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/nav-module-1080x300.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/teaser-banner-1080x600.jpg +0 -0
- data/lib/starter_web/assets/images/pages/features/translator-1080x800.jpg +0 -0
@@ -0,0 +1,378 @@
|
|
1
|
+
{
|
2
|
+
"cells": [
|
3
|
+
{
|
4
|
+
"cell_type": "markdown",
|
5
|
+
"metadata": {},
|
6
|
+
"source": [
|
7
|
+
"## Logs Analytics Dashboard\n",
|
8
|
+
"This dashboard can be used for performing visual analytics on the server log files. You can interact with any chart in the dashboard, like so:\n",
|
9
|
+
"\n",
|
10
|
+
"1. Click on a bar in any bar chart to filter the whole dataset by that bar's value\n",
|
11
|
+
"2. Click on a slice of any pie chart to filter the whole dataset by that pie slices value\n",
|
12
|
+
"\n",
|
13
|
+
"Fun things to try:\n",
|
14
|
+
"1. Select any specific day in the `Daily Events` bar chart (for e.g. why do first and last days have fewer events?)\n",
|
15
|
+
"2. Find out which product queries resulted in server error (click on `Server Error` slice of `Events By Status` pie chart)\n"
|
16
|
+
]
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"cell_type": "code",
|
20
|
+
"execution_count": null,
|
21
|
+
"metadata": {},
|
22
|
+
"outputs": [],
|
23
|
+
"source": [
|
24
|
+
"import numpy as np\n",
|
25
|
+
"import pandas as pd\n",
|
26
|
+
"\n",
|
27
|
+
"import ipywidgets as widgets\n",
|
28
|
+
"import bqplot as bq\n",
|
29
|
+
"import bqplot.pyplot as plt"
|
30
|
+
]
|
31
|
+
},
|
32
|
+
{
|
33
|
+
"cell_type": "code",
|
34
|
+
"execution_count": null,
|
35
|
+
"metadata": {},
|
36
|
+
"outputs": [],
|
37
|
+
"source": [
|
38
|
+
"def get_status_code(x):\n",
|
39
|
+
" \"\"\"\n",
|
40
|
+
" map integer http status to string status code\n",
|
41
|
+
" \"\"\"\n",
|
42
|
+
" if x >= 200 and x < 300:\n",
|
43
|
+
" return \"SUCCESS\"\n",
|
44
|
+
" elif x >= 300 and x < 400:\n",
|
45
|
+
" return \"REDIRECT\"\n",
|
46
|
+
" elif x >= 400 and x < 500:\n",
|
47
|
+
" return \"CLIENT ERROR\"\n",
|
48
|
+
" elif x >= 500:\n",
|
49
|
+
" return \"SERVER ERROR\""
|
50
|
+
]
|
51
|
+
},
|
52
|
+
{
|
53
|
+
"cell_type": "code",
|
54
|
+
"execution_count": null,
|
55
|
+
"metadata": {},
|
56
|
+
"outputs": [],
|
57
|
+
"source": [
|
58
|
+
"def get_events_by_hour(log_data_slice):\n",
|
59
|
+
" \"\"\"\n",
|
60
|
+
" get event counts by hour\n",
|
61
|
+
" \"\"\"\n",
|
62
|
+
" return (\n",
|
63
|
+
" log_data_slice[\"status_code\"]\n",
|
64
|
+
" .groupby(lambda x: x.hour)\n",
|
65
|
+
" .count()\n",
|
66
|
+
" .reindex(np.arange(24))\n",
|
67
|
+
" .fillna(0)\n",
|
68
|
+
" )"
|
69
|
+
]
|
70
|
+
},
|
71
|
+
{
|
72
|
+
"cell_type": "code",
|
73
|
+
"execution_count": null,
|
74
|
+
"metadata": {},
|
75
|
+
"outputs": [],
|
76
|
+
"source": [
|
77
|
+
"# load data into pandas and do some munging\n",
|
78
|
+
"log_data = pd.read_csv(\"access.log\", sep=\" \", header=None)\n",
|
79
|
+
"log_data.drop([1, 2], axis=1, inplace=True)\n",
|
80
|
+
"log_data.columns = [\n",
|
81
|
+
" \"ip_address\",\n",
|
82
|
+
" \"timestamp\",\n",
|
83
|
+
" \"request\",\n",
|
84
|
+
" \"status\",\n",
|
85
|
+
" \"col1\",\n",
|
86
|
+
" \"url\",\n",
|
87
|
+
" \"agent\",\n",
|
88
|
+
" \"col2\",\n",
|
89
|
+
"]\n",
|
90
|
+
"\n",
|
91
|
+
"log_data.index = pd.to_datetime(\n",
|
92
|
+
" log_data[\"timestamp\"].str.replace(\"[\\[\\]]\", \"\"), format=\"%d/%b/%Y:%H:%M:%S\"\n",
|
93
|
+
")\n",
|
94
|
+
"log_data.drop(\"timestamp\", axis=1, inplace=True)\n",
|
95
|
+
"\n",
|
96
|
+
"# add extra columns for easy querying\n",
|
97
|
+
"log_data[\"status_code\"] = log_data[\"status\"].map(get_status_code)\n",
|
98
|
+
"log_data[\"category\"] = log_data[\"request\"].str.extract(\"categoryId=(.*)&\", expand=False)\n",
|
99
|
+
"log_data[\"product\"] = log_data[\"request\"].str.extract(\"productId=(.*)&\", expand=False)\n",
|
100
|
+
"log_data[\"hour\"] = log_data.index.map(lambda x: x.hour)\n",
|
101
|
+
"log_data[\"day\"] = log_data.index.strftime(\"%Y-%m-%d\")"
|
102
|
+
]
|
103
|
+
},
|
104
|
+
{
|
105
|
+
"cell_type": "code",
|
106
|
+
"execution_count": null,
|
107
|
+
"metadata": {},
|
108
|
+
"outputs": [],
|
109
|
+
"source": [
|
110
|
+
"all_days = log_data[\"day\"].value_counts().index\n",
|
111
|
+
"all_hours = np.arange(24)\n",
|
112
|
+
"all_categories = list(log_data[\"category\"].value_counts().index)\n",
|
113
|
+
"all_products = list(log_data[\"product\"].value_counts().index)\n",
|
114
|
+
"all_status_codes = list(log_data[\"status_code\"].value_counts().index)\n",
|
115
|
+
"\n",
|
116
|
+
"category_colors = dict(zip(all_categories, bq.CATEGORY10))\n",
|
117
|
+
"status_label_colors = dict(\n",
|
118
|
+
" [(\"SUCCESS\", \"#006d2c\"), (\"CLIENT ERROR\", \"#fc8d59\"), (\"SERVER ERROR\", \"#a63603\")]\n",
|
119
|
+
")"
|
120
|
+
]
|
121
|
+
},
|
122
|
+
{
|
123
|
+
"cell_type": "code",
|
124
|
+
"execution_count": null,
|
125
|
+
"metadata": {
|
126
|
+
"scrolled": true
|
127
|
+
},
|
128
|
+
"outputs": [],
|
129
|
+
"source": [
|
130
|
+
"# daily events bar chart\n",
|
131
|
+
"daily_events_fig = plt.figure(\n",
|
132
|
+
" title=\"Daily Events\",\n",
|
133
|
+
" animation_duration=1000,\n",
|
134
|
+
" layout=widgets.Layout(width=\"900px\", height=\"500px\"),\n",
|
135
|
+
")\n",
|
136
|
+
"\n",
|
137
|
+
"plt.scales(scales={\"x\": bq.DateScale()})\n",
|
138
|
+
"\n",
|
139
|
+
"# intsel = BrushIntervalSelector(scale=, marks=[hist])\n",
|
140
|
+
"bar_axes_options = {\"x\": {\"grid_lines\": \"none\"}, \"y\": {\"tick_format\": \",\"}}\n",
|
141
|
+
"common_bar_options = dict(\n",
|
142
|
+
" interactions={\"click\": \"select\"},\n",
|
143
|
+
" selected_style={\"stroke\": \"Red\", \"stroke-width\": 4},\n",
|
144
|
+
" axes_options=bar_axes_options,\n",
|
145
|
+
")\n",
|
146
|
+
"daily_events_bar = plt.bar(\n",
|
147
|
+
" pd.to_datetime(all_days),\n",
|
148
|
+
" [],\n",
|
149
|
+
" colors=[\"dodgerblue\"],\n",
|
150
|
+
" opacities=[0.8] * len(all_days),\n",
|
151
|
+
" **common_bar_options\n",
|
152
|
+
")\n",
|
153
|
+
"\n",
|
154
|
+
"num_days = len(all_days)\n",
|
155
|
+
"filtered_daily_events_bar = plt.bar(\n",
|
156
|
+
" pd.to_datetime(all_days),\n",
|
157
|
+
" np.zeros(num_days),\n",
|
158
|
+
" colors=[\"lightgreen\"],\n",
|
159
|
+
" opacities=[0.8] * num_days,\n",
|
160
|
+
" axes_options=bar_axes_options,\n",
|
161
|
+
")\n",
|
162
|
+
"\n",
|
163
|
+
"# hourly events line chart\n",
|
164
|
+
"hourly_events_fig = plt.figure(\n",
|
165
|
+
" title=\"Hourly Events\",\n",
|
166
|
+
" animation_duration=1000,\n",
|
167
|
+
" layout=widgets.Layout(width=\"600px\", height=\"500px\"),\n",
|
168
|
+
")\n",
|
169
|
+
"\n",
|
170
|
+
"plt.scales(scales={\"x\": bq.OrdinalScale()})\n",
|
171
|
+
"hourly_events_bar = plt.bar(\n",
|
172
|
+
" all_hours,\n",
|
173
|
+
" [],\n",
|
174
|
+
" colors=[\"goldenrod\"],\n",
|
175
|
+
" opacities=[0.8] * 24,\n",
|
176
|
+
" padding=0.2,\n",
|
177
|
+
" **common_bar_options\n",
|
178
|
+
")\n",
|
179
|
+
"\n",
|
180
|
+
"filtered_hourly_events_bar = plt.bar(\n",
|
181
|
+
" all_hours,\n",
|
182
|
+
" [],\n",
|
183
|
+
" colors=[\"lightgreen\"],\n",
|
184
|
+
" opacities=[0.8] * 24,\n",
|
185
|
+
" padding=0.2,\n",
|
186
|
+
" axes_options=bar_axes_options,\n",
|
187
|
+
")\n",
|
188
|
+
"\n",
|
189
|
+
"products_fig = plt.figure(\n",
|
190
|
+
" title=\"Events By Product\",\n",
|
191
|
+
" animation_duration=1000,\n",
|
192
|
+
" fig_margin=dict(top=60, bottom=20, left=100, right=40),\n",
|
193
|
+
" layout=widgets.Layout(width=\"550px\", height=\"500px\"),\n",
|
194
|
+
")\n",
|
195
|
+
"products_bar = plt.bar(\n",
|
196
|
+
" all_products,\n",
|
197
|
+
" [],\n",
|
198
|
+
" colors=[\"salmon\"],\n",
|
199
|
+
" orientation=\"horizontal\",\n",
|
200
|
+
" opacities=[0.8] * len(all_products),\n",
|
201
|
+
" padding=0.2,\n",
|
202
|
+
" **common_bar_options\n",
|
203
|
+
")\n",
|
204
|
+
"\n",
|
205
|
+
"common_pie_args = dict(\n",
|
206
|
+
" display_labels=\"outside\",\n",
|
207
|
+
" interactions={\"click\": \"select\"},\n",
|
208
|
+
" selected_style={\"stroke\": \"white\", \"stroke-width\": 3},\n",
|
209
|
+
" inner_radius=80,\n",
|
210
|
+
" apply_clip=False,\n",
|
211
|
+
")\n",
|
212
|
+
"# categories pie chart\n",
|
213
|
+
"categories_fig = plt.figure(\n",
|
214
|
+
" title=\"Events By Category\",\n",
|
215
|
+
" animation_duration=1000,\n",
|
216
|
+
" layout=widgets.Layout(width=\"550px\", height=\"500px\"),\n",
|
217
|
+
")\n",
|
218
|
+
"categories_pie = plt.pie([], labels=all_categories, **common_pie_args)\n",
|
219
|
+
"\n",
|
220
|
+
"# status codes pie chart\n",
|
221
|
+
"status_codes_fig = plt.figure(\n",
|
222
|
+
" title=\"Events By Status\",\n",
|
223
|
+
" animation_duration=1000,\n",
|
224
|
+
" layout=widgets.Layout(width=\"550px\", height=\"500px\"),\n",
|
225
|
+
")\n",
|
226
|
+
"status_codes_pie = plt.pie([], labels=all_status_codes, **common_pie_args)\n",
|
227
|
+
"\n",
|
228
|
+
"# buttons for updating and resetting filters\n",
|
229
|
+
"update_btn = widgets.Button(description=\"Update\", button_style=\"Success\")\n",
|
230
|
+
"reset_btn = widgets.Button(description=\"Reset\", button_style=\"Success\")"
|
231
|
+
]
|
232
|
+
},
|
233
|
+
{
|
234
|
+
"cell_type": "code",
|
235
|
+
"execution_count": null,
|
236
|
+
"metadata": {},
|
237
|
+
"outputs": [],
|
238
|
+
"source": [
|
239
|
+
"fields = [\"day\", \"hour\", \"product\", \"category\", \"status_code\"]\n",
|
240
|
+
"field_vals = [all_days, all_hours, all_products, all_categories, all_status_codes]\n",
|
241
|
+
"plots = [\n",
|
242
|
+
" daily_events_bar,\n",
|
243
|
+
" hourly_events_bar,\n",
|
244
|
+
" products_bar,\n",
|
245
|
+
" categories_pie,\n",
|
246
|
+
" status_codes_pie,\n",
|
247
|
+
"]"
|
248
|
+
]
|
249
|
+
},
|
250
|
+
{
|
251
|
+
"cell_type": "code",
|
252
|
+
"execution_count": null,
|
253
|
+
"metadata": {},
|
254
|
+
"outputs": [],
|
255
|
+
"source": [
|
256
|
+
"def generate_filters():\n",
|
257
|
+
" filters_dict = {}\n",
|
258
|
+
" for field, field_val, plot in zip(fields, field_vals, plots):\n",
|
259
|
+
" if plot.selected:\n",
|
260
|
+
" selected_vals = [field_val[i] for i in plot.selected]\n",
|
261
|
+
" filters_dict[field] = selected_vals\n",
|
262
|
+
" return filters_dict"
|
263
|
+
]
|
264
|
+
},
|
265
|
+
{
|
266
|
+
"cell_type": "code",
|
267
|
+
"execution_count": null,
|
268
|
+
"metadata": {},
|
269
|
+
"outputs": [],
|
270
|
+
"source": [
|
271
|
+
"def apply_filters(df, filters):\n",
|
272
|
+
" filtered_df = df\n",
|
273
|
+
"\n",
|
274
|
+
" for k, v in filters.items():\n",
|
275
|
+
" if v and len(v) > 0:\n",
|
276
|
+
" filtered_df = filtered_df[filtered_df[k].isin(v)]\n",
|
277
|
+
" return filtered_df"
|
278
|
+
]
|
279
|
+
},
|
280
|
+
{
|
281
|
+
"cell_type": "code",
|
282
|
+
"execution_count": null,
|
283
|
+
"metadata": {},
|
284
|
+
"outputs": [],
|
285
|
+
"source": [
|
286
|
+
"def update_plots(*args):\n",
|
287
|
+
" global filters, filtered_log_data\n",
|
288
|
+
" filters = generate_filters()\n",
|
289
|
+
" filtered_log_data = apply_filters(log_data, filters)\n",
|
290
|
+
"\n",
|
291
|
+
" daily_events = (\n",
|
292
|
+
" filtered_log_data.resample(\"D\")\n",
|
293
|
+
" .count()[\"status_code\"]\n",
|
294
|
+
" .reindex(pd.to_datetime(all_days))\n",
|
295
|
+
" .fillna(0)\n",
|
296
|
+
" )\n",
|
297
|
+
" daily_events_bar.y = daily_events\n",
|
298
|
+
"\n",
|
299
|
+
" hourly_events_bar.y = get_events_by_hour(filtered_log_data)\n",
|
300
|
+
"\n",
|
301
|
+
" products_bar.y = (\n",
|
302
|
+
" filtered_log_data[\"product\"].value_counts().reindex(all_products).fillna(0)\n",
|
303
|
+
" )\n",
|
304
|
+
"\n",
|
305
|
+
" events_by_category = filtered_log_data[\"category\"].value_counts()\n",
|
306
|
+
"\n",
|
307
|
+
" with categories_pie.hold_sync():\n",
|
308
|
+
" categories_pie.labels = list(events_by_category.index)\n",
|
309
|
+
" categories_pie.sizes = events_by_category\n",
|
310
|
+
" categories_pie.colors = [category_colors[d] for d in categories_pie.labels]\n",
|
311
|
+
"\n",
|
312
|
+
" events_by_status_code = filtered_log_data[\"status_code\"].value_counts()\n",
|
313
|
+
"\n",
|
314
|
+
" with status_codes_pie.hold_sync():\n",
|
315
|
+
" status_codes_pie.labels = list(events_by_status_code.index)\n",
|
316
|
+
" status_codes_pie.sizes = events_by_status_code.values\n",
|
317
|
+
" status_codes_pie.colors = [\n",
|
318
|
+
" status_label_colors[d] for d in status_codes_pie.labels\n",
|
319
|
+
" ]"
|
320
|
+
]
|
321
|
+
},
|
322
|
+
{
|
323
|
+
"cell_type": "code",
|
324
|
+
"execution_count": null,
|
325
|
+
"metadata": {},
|
326
|
+
"outputs": [],
|
327
|
+
"source": [
|
328
|
+
"def reset_filters(*args):\n",
|
329
|
+
" for plot in plots:\n",
|
330
|
+
" plot.selected = None\n",
|
331
|
+
" update_plots(None)\n",
|
332
|
+
"\n",
|
333
|
+
"\n",
|
334
|
+
"update_btn.on_click(lambda btn: update_plots(None))\n",
|
335
|
+
"reset_btn.on_click(lambda btn: reset_filters())\n",
|
336
|
+
"btns_layout = widgets.VBox(\n",
|
337
|
+
" [update_btn, reset_btn], layout=widgets.Layout(overflow_x=\"hidden\")\n",
|
338
|
+
")"
|
339
|
+
]
|
340
|
+
},
|
341
|
+
{
|
342
|
+
"cell_type": "code",
|
343
|
+
"execution_count": null,
|
344
|
+
"metadata": {
|
345
|
+
"scrolled": true
|
346
|
+
},
|
347
|
+
"outputs": [],
|
348
|
+
"source": [
|
349
|
+
"update_plots(None)\n",
|
350
|
+
"\n",
|
351
|
+
"parent_plots = widgets.HBox([daily_events_fig, hourly_events_fig])\n",
|
352
|
+
"child_plots = widgets.HBox([products_fig, categories_fig, status_codes_fig])\n",
|
353
|
+
"widgets.VBox([widgets.HBox([parent_plots, btns_layout]), child_plots])"
|
354
|
+
]
|
355
|
+
}
|
356
|
+
],
|
357
|
+
"metadata": {
|
358
|
+
"kernelspec": {
|
359
|
+
"display_name": "Python 3",
|
360
|
+
"language": "python",
|
361
|
+
"name": "python3"
|
362
|
+
},
|
363
|
+
"language_info": {
|
364
|
+
"codemirror_mode": {
|
365
|
+
"name": "ipython",
|
366
|
+
"version": 3
|
367
|
+
},
|
368
|
+
"file_extension": ".py",
|
369
|
+
"mimetype": "text/x-python",
|
370
|
+
"name": "python",
|
371
|
+
"nbconvert_exporter": "python",
|
372
|
+
"pygments_lexer": "ipython3",
|
373
|
+
"version": "3.8.2"
|
374
|
+
}
|
375
|
+
},
|
376
|
+
"nbformat": 4,
|
377
|
+
"nbformat_minor": 1
|
378
|
+
}
|
@@ -0,0 +1,123 @@
|
|
1
|
+
{
|
2
|
+
"cells": [
|
3
|
+
{
|
4
|
+
"cell_type": "code",
|
5
|
+
"execution_count": null,
|
6
|
+
"metadata": {},
|
7
|
+
"outputs": [],
|
8
|
+
"source": [
|
9
|
+
"from itertools import chain\n",
|
10
|
+
"\n",
|
11
|
+
"from bqplot import OrdinalColorScale, Figure, Graph\n",
|
12
|
+
"from ipywidgets import Layout"
|
13
|
+
]
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"cell_type": "code",
|
17
|
+
"execution_count": null,
|
18
|
+
"metadata": {},
|
19
|
+
"outputs": [],
|
20
|
+
"source": [
|
21
|
+
"# mobile patent suits - http://bl.ocks.org/mbostock/1153292\n",
|
22
|
+
"suits = [\n",
|
23
|
+
" {\"source\": \"Microsoft\", \"target\": \"Amazon\", \"type\": \"licensing\"},\n",
|
24
|
+
" {\"source\": \"Microsoft\", \"target\": \"HTC\", \"type\": \"licensing\"},\n",
|
25
|
+
" {\"source\": \"Samsung\", \"target\": \"Apple\", \"type\": \"suit\"},\n",
|
26
|
+
" {\"source\": \"Motorola\", \"target\": \"Apple\", \"type\": \"suit\"},\n",
|
27
|
+
" {\"source\": \"Nokia\", \"target\": \"Apple\", \"type\": \"resolved\"},\n",
|
28
|
+
" {\"source\": \"HTC\", \"target\": \"Apple\", \"type\": \"suit\"},\n",
|
29
|
+
" {\"source\": \"Kodak\", \"target\": \"Apple\", \"type\": \"suit\"},\n",
|
30
|
+
" {\"source\": \"Microsoft\", \"target\": \"Barnes & Noble\", \"type\": \"suit\"},\n",
|
31
|
+
" {\"source\": \"Microsoft\", \"target\": \"Foxconn\", \"type\": \"suit\"},\n",
|
32
|
+
" {\"source\": \"Oracle\", \"target\": \"Google\", \"type\": \"suit\"},\n",
|
33
|
+
" {\"source\": \"Apple\", \"target\": \"HTC\", \"type\": \"suit\"},\n",
|
34
|
+
" {\"source\": \"Microsoft\", \"target\": \"Inventec\", \"type\": \"suit\"},\n",
|
35
|
+
" {\"source\": \"Samsung\", \"target\": \"Kodak\", \"type\": \"resolved\"},\n",
|
36
|
+
" {\"source\": \"LG\", \"target\": \"Kodak\", \"type\": \"resolved\"},\n",
|
37
|
+
" {\"source\": \"RIM\", \"target\": \"Kodak\", \"type\": \"suit\"},\n",
|
38
|
+
" {\"source\": \"Sony\", \"target\": \"LG\", \"type\": \"suit\"},\n",
|
39
|
+
" {\"source\": \"Kodak\", \"target\": \"LG\", \"type\": \"resolved\"},\n",
|
40
|
+
" {\"source\": \"Apple\", \"target\": \"Nokia\", \"type\": \"resolved\"},\n",
|
41
|
+
" {\"source\": \"Qualcomm\", \"target\": \"Nokia\", \"type\": \"resolved\"},\n",
|
42
|
+
" {\"source\": \"Apple\", \"target\": \"Motorola\", \"type\": \"suit\"},\n",
|
43
|
+
" {\"source\": \"Microsoft\", \"target\": \"Motorola\", \"type\": \"suit\"},\n",
|
44
|
+
" {\"source\": \"Motorola\", \"target\": \"Microsoft\", \"type\": \"suit\"},\n",
|
45
|
+
" {\"source\": \"Huawei\", \"target\": \"ZTE\", \"type\": \"suit\"},\n",
|
46
|
+
" {\"source\": \"Ericsson\", \"target\": \"ZTE\", \"type\": \"suit\"},\n",
|
47
|
+
" {\"source\": \"Kodak\", \"target\": \"Samsung\", \"type\": \"resolved\"},\n",
|
48
|
+
" {\"source\": \"Apple\", \"target\": \"Samsung\", \"type\": \"suit\"},\n",
|
49
|
+
" {\"source\": \"Kodak\", \"target\": \"RIM\", \"type\": \"suit\"},\n",
|
50
|
+
" {\"source\": \"Nokia\", \"target\": \"Qualcomm\", \"type\": \"suit\"},\n",
|
51
|
+
"]"
|
52
|
+
]
|
53
|
+
},
|
54
|
+
{
|
55
|
+
"cell_type": "code",
|
56
|
+
"execution_count": null,
|
57
|
+
"metadata": {},
|
58
|
+
"outputs": [],
|
59
|
+
"source": [
|
60
|
+
"# transform data into nodes and links\n",
|
61
|
+
"nodes = list(set(chain(*((suit[\"source\"], suit[\"target\"]) for suit in suits))))\n",
|
62
|
+
"\n",
|
63
|
+
"# set custom node attrs\n",
|
64
|
+
"node_data = [\n",
|
65
|
+
" {\"label\": node, \"shape_attrs\": {\"r\": 6}, \"label_display\": \"outside\"}\n",
|
66
|
+
" for node in nodes\n",
|
67
|
+
"]\n",
|
68
|
+
"# for links, source and target should be indices into the nodes list\n",
|
69
|
+
"nodes_index_map = {node: i for i, node in enumerate(nodes)}\n",
|
70
|
+
"link_data = [\n",
|
71
|
+
" {\n",
|
72
|
+
" \"source\": nodes_index_map[s[\"source\"]],\n",
|
73
|
+
" \"target\": nodes_index_map[s[\"target\"]],\n",
|
74
|
+
" \"value\": s[\"type\"],\n",
|
75
|
+
" }\n",
|
76
|
+
" for s in suits\n",
|
77
|
+
"]\n",
|
78
|
+
"\n",
|
79
|
+
"# encode suit type with link color\n",
|
80
|
+
"link_color_scale = OrdinalColorScale(\n",
|
81
|
+
" domain=[\"licensing\", \"suit\", \"resolved\"],\n",
|
82
|
+
" colors=[\"limegreen\", \"dodgerblue\", \"orangered\"],\n",
|
83
|
+
")\n",
|
84
|
+
"graph = Graph(\n",
|
85
|
+
" node_data=node_data,\n",
|
86
|
+
" link_data=link_data,\n",
|
87
|
+
" link_type=\"arc\",\n",
|
88
|
+
" scales={\"link_color\": link_color_scale},\n",
|
89
|
+
" colors=[\"gray\"],\n",
|
90
|
+
" directed=True,\n",
|
91
|
+
" link_distance=100,\n",
|
92
|
+
" charge=-600,\n",
|
93
|
+
")\n",
|
94
|
+
"Figure(\n",
|
95
|
+
" marks=[graph],\n",
|
96
|
+
" layout=Layout(height=\"900px\", width=\"1000px\"),\n",
|
97
|
+
" title=\"Mobile Patent Suits\",\n",
|
98
|
+
")"
|
99
|
+
]
|
100
|
+
}
|
101
|
+
],
|
102
|
+
"metadata": {
|
103
|
+
"kernelspec": {
|
104
|
+
"display_name": "Python 3",
|
105
|
+
"language": "python",
|
106
|
+
"name": "python3"
|
107
|
+
},
|
108
|
+
"language_info": {
|
109
|
+
"codemirror_mode": {
|
110
|
+
"name": "ipython",
|
111
|
+
"version": 3
|
112
|
+
},
|
113
|
+
"file_extension": ".py",
|
114
|
+
"mimetype": "text/x-python",
|
115
|
+
"name": "python",
|
116
|
+
"nbconvert_exporter": "python",
|
117
|
+
"pygments_lexer": "ipython3",
|
118
|
+
"version": "3.7.6"
|
119
|
+
}
|
120
|
+
},
|
121
|
+
"nbformat": 4,
|
122
|
+
"nbformat_minor": 2
|
123
|
+
}
|
@@ -0,0 +1,177 @@
|
|
1
|
+
{
|
2
|
+
"cells": [
|
3
|
+
{
|
4
|
+
"cell_type": "markdown",
|
5
|
+
"metadata": {},
|
6
|
+
"source": [
|
7
|
+
"This application demonstrates how to build a simple neural network using the Graph mark.\n",
|
8
|
+
"Interactions can be enabled by adding event handlers (click, hover etc) on the nodes of the network.\n",
|
9
|
+
"See the [Mark Interactions notebook](../Interactions/Mark%20Interactions.ipynb) and the [Scatter Notebook](../Marks/Object%20Model/Scatter.ipynb) for details."
|
10
|
+
]
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"cell_type": "code",
|
14
|
+
"execution_count": 4,
|
15
|
+
"metadata": {},
|
16
|
+
"outputs": [],
|
17
|
+
"source": [
|
18
|
+
"from itertools import chain, product\n",
|
19
|
+
"\n",
|
20
|
+
"import numpy as np\n",
|
21
|
+
"from bqplot import LinearScale, Graph, Figure"
|
22
|
+
]
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"cell_type": "code",
|
26
|
+
"execution_count": 5,
|
27
|
+
"metadata": {},
|
28
|
+
"outputs": [],
|
29
|
+
"source": [
|
30
|
+
"class NeuralNet(Figure):\n",
|
31
|
+
" def __init__(self, **kwargs):\n",
|
32
|
+
" self.height = kwargs.get(\"height\", 600)\n",
|
33
|
+
" self.width = kwargs.get(\"width\", 960)\n",
|
34
|
+
" self.directed_links = kwargs.get(\"directed_links\", False)\n",
|
35
|
+
"\n",
|
36
|
+
" self.num_inputs = kwargs[\"num_inputs\"]\n",
|
37
|
+
" self.num_hidden_layers = kwargs[\"num_hidden_layers\"]\n",
|
38
|
+
" self.nodes_output_layer = kwargs[\"num_outputs\"]\n",
|
39
|
+
" self.layer_colors = kwargs.get(\n",
|
40
|
+
" \"layer_colors\", [\"Orange\"] * (len(self.num_hidden_layers) + 2)\n",
|
41
|
+
" )\n",
|
42
|
+
"\n",
|
43
|
+
" self.build_net()\n",
|
44
|
+
" super(NeuralNet, self).__init__(**kwargs)\n",
|
45
|
+
"\n",
|
46
|
+
" def build_net(self):\n",
|
47
|
+
" # create nodes\n",
|
48
|
+
" self.layer_nodes = []\n",
|
49
|
+
" self.layer_nodes.append([\"x\" + str(i + 1) for i in range(self.num_inputs)])\n",
|
50
|
+
"\n",
|
51
|
+
" for i, h in enumerate(self.num_hidden_layers):\n",
|
52
|
+
" self.layer_nodes.append(\n",
|
53
|
+
" [\"h\" + str(i + 1) + \",\" + str(j + 1) for j in range(h)]\n",
|
54
|
+
" )\n",
|
55
|
+
" self.layer_nodes.append(\n",
|
56
|
+
" [\"y\" + str(i + 1) for i in range(self.nodes_output_layer)]\n",
|
57
|
+
" )\n",
|
58
|
+
"\n",
|
59
|
+
" self.flattened_layer_nodes = list(chain(*self.layer_nodes))\n",
|
60
|
+
"\n",
|
61
|
+
" # build link matrix\n",
|
62
|
+
" i = 0\n",
|
63
|
+
" node_indices = {}\n",
|
64
|
+
" for layer in self.layer_nodes:\n",
|
65
|
+
" for node in layer:\n",
|
66
|
+
" node_indices[node] = i\n",
|
67
|
+
" i += 1\n",
|
68
|
+
"\n",
|
69
|
+
" n = len(self.flattened_layer_nodes)\n",
|
70
|
+
" self.link_matrix = np.empty((n, n))\n",
|
71
|
+
" self.link_matrix[:] = np.nan\n",
|
72
|
+
"\n",
|
73
|
+
" for i in range(len(self.layer_nodes) - 1):\n",
|
74
|
+
" curr_layer_nodes_indices = [node_indices[d] for d in self.layer_nodes[i]]\n",
|
75
|
+
" next_layer_nodes = [node_indices[d] for d in self.layer_nodes[i + 1]]\n",
|
76
|
+
" for s, t in product(curr_layer_nodes_indices, next_layer_nodes):\n",
|
77
|
+
" self.link_matrix[s, t] = 1\n",
|
78
|
+
"\n",
|
79
|
+
" # set node x locations\n",
|
80
|
+
" self.nodes_x = np.repeat(\n",
|
81
|
+
" np.linspace(0, 100, len(self.layer_nodes) + 1, endpoint=False)[1:],\n",
|
82
|
+
" [len(n) for n in self.layer_nodes],\n",
|
83
|
+
" )\n",
|
84
|
+
"\n",
|
85
|
+
" # set node y locations\n",
|
86
|
+
" self.nodes_y = np.array([])\n",
|
87
|
+
" for layer in self.layer_nodes:\n",
|
88
|
+
" n = len(layer)\n",
|
89
|
+
" ys = np.linspace(0, 100, n + 1, endpoint=False)[1:]\n",
|
90
|
+
" self.nodes_y = np.append(self.nodes_y, ys[::-1])\n",
|
91
|
+
"\n",
|
92
|
+
" # set node colors\n",
|
93
|
+
" n_layers = len(self.layer_nodes)\n",
|
94
|
+
" self.node_colors = np.repeat(\n",
|
95
|
+
" np.array(self.layer_colors[:n_layers]),\n",
|
96
|
+
" [len(layer) for layer in self.layer_nodes],\n",
|
97
|
+
" ).tolist()\n",
|
98
|
+
"\n",
|
99
|
+
" xs = LinearScale(min=0, max=100)\n",
|
100
|
+
" ys = LinearScale(min=0, max=100)\n",
|
101
|
+
"\n",
|
102
|
+
" self.graph = Graph(\n",
|
103
|
+
" node_data=[\n",
|
104
|
+
" {\"label\": d, \"label_display\": \"none\"}\n",
|
105
|
+
" for d in self.flattened_layer_nodes\n",
|
106
|
+
" ],\n",
|
107
|
+
" link_matrix=self.link_matrix,\n",
|
108
|
+
" link_type=\"line\",\n",
|
109
|
+
" colors=self.node_colors,\n",
|
110
|
+
" directed=self.directed_links,\n",
|
111
|
+
" scales={\"x\": xs, \"y\": ys},\n",
|
112
|
+
" x=self.nodes_x,\n",
|
113
|
+
" y=self.nodes_y,\n",
|
114
|
+
" # color=2 * np.random.rand(len(self.flattened_layer_nodes)) - 1\n",
|
115
|
+
" )\n",
|
116
|
+
" self.graph.hovered_style = {\"stroke\": \"1.5\"}\n",
|
117
|
+
" self.graph.unhovered_style = {\"opacity\": \"0.4\"}\n",
|
118
|
+
"\n",
|
119
|
+
" self.graph.selected_style = {\n",
|
120
|
+
" \"opacity\": \"1\",\n",
|
121
|
+
" \"stroke\": \"red\",\n",
|
122
|
+
" \"stroke-width\": \"2.5\",\n",
|
123
|
+
" }\n",
|
124
|
+
" self.marks = [self.graph]\n",
|
125
|
+
" self.title = \"Neural Network\"\n",
|
126
|
+
" self.layout.width = str(self.width) + \"px\"\n",
|
127
|
+
" self.layout.height = str(self.height) + \"px\""
|
128
|
+
]
|
129
|
+
},
|
130
|
+
{
|
131
|
+
"cell_type": "code",
|
132
|
+
"execution_count": 6,
|
133
|
+
"metadata": {},
|
134
|
+
"outputs": [
|
135
|
+
{
|
136
|
+
"data": {
|
137
|
+
"application/vnd.jupyter.widget-view+json": {
|
138
|
+
"model_id": "b2d75468c39d4bcf896561f72febb74d",
|
139
|
+
"version_major": 2,
|
140
|
+
"version_minor": 0
|
141
|
+
},
|
142
|
+
"text/plain": [
|
143
|
+
"NeuralNet(fig_margin={'top': 60, 'bottom': 60, 'left': 60, 'right': 60}, layout=Layout(height='600px', width='…"
|
144
|
+
]
|
145
|
+
},
|
146
|
+
"metadata": {},
|
147
|
+
"output_type": "display_data"
|
148
|
+
}
|
149
|
+
],
|
150
|
+
"source": [
|
151
|
+
"NeuralNet(num_inputs=3, num_hidden_layers=[10, 10, 8, 5], num_outputs=1)"
|
152
|
+
]
|
153
|
+
}
|
154
|
+
],
|
155
|
+
"metadata": {
|
156
|
+
"input_collapsed": false,
|
157
|
+
"kernelspec": {
|
158
|
+
"display_name": "Python 3",
|
159
|
+
"language": "python",
|
160
|
+
"name": "python3"
|
161
|
+
},
|
162
|
+
"language_info": {
|
163
|
+
"codemirror_mode": {
|
164
|
+
"name": "ipython",
|
165
|
+
"version": 3
|
166
|
+
},
|
167
|
+
"file_extension": ".py",
|
168
|
+
"mimetype": "text/x-python",
|
169
|
+
"name": "python",
|
170
|
+
"nbconvert_exporter": "python",
|
171
|
+
"pygments_lexer": "ipython3",
|
172
|
+
"version": "3.7.6"
|
173
|
+
}
|
174
|
+
},
|
175
|
+
"nbformat": 4,
|
176
|
+
"nbformat_minor": 2
|
177
|
+
}
|