Streaming pivot visualization via WebAssembly

Overview

Perspective

npm PyPI Build Status FINOS - Active

Perspective is an interactive visualization component for large, real-time datasets. Originally developed for J.P. Morgan's trading business, Perspective makes it simple to build user-configurable analytics entirely in the browser, or in concert with Python and/or JupyterLab. Use it to create reports, dashboards, notebooks and applications, with static data or streaming updates via Apache Arrow.

Features

  • A fast, memory efficient streaming query engine, written in C++ and compiled for both WebAssembly and Python, with read/write/stream/virtual support for Apache Arrow.

  • A framework-agnostic User Interface component and Jupyterlab Widget, over WebWorker (WebAssembly) or WebSocket (Python/Node), and a suite of Datagrid and D3FC Chart plugins. `

Examples

Superstore Olympics Custom Styles
Superstore Olympics Custom Styles
Editable Streaming CSV
Editable Streaming CSV
IEX Cloud NYC Citibike JupyterLab Plugin
IEX Cloud NYC Citibike JupyterLab Plugin

Documentation

Comments
  • Perspective Python install failure - Windows

    Perspective Python install failure - Windows

    Bug Report

    Steps to Reproduce:

    1. pip install numpy
    2. pip install pyarrow==0.15.1
    3. pip install perspective-python

    Expected Result:

    I would expect the install to flag any additional required dependencies [y/n] and complete successfully. Full output below, apologies it's long.

    Actual Result:

    Collecting perspective-python
      Using cached perspective-python-0.4.2.post1.tar.gz (2.5 MB)
      Installing build dependencies ... done
      Getting requirements to build wheel ... done
        Preparing wheel metadata ... done
    Collecting pandas>=0.22.0
      Using cached pandas-1.0.1-cp37-cp37m-win_amd64.whl (9.0 MB)
    Requirement already satisfied: numpy>=1.13.1 in c:\users\twmeg\appdata\local\programs\python\python37\lib\site-packages (from perspective-python) (1.18.1)
    Collecting python-dateutil>=2.8.0
      Using cached python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
    Requirement already satisfied: six>=1.11.0 in c:\users\twmeg\appdata\local\programs\python\python37\lib\site-packages (from perspective-python) (1.14.0)
    Collecting ipywidgets>=7.5.1
      Using cached ipywidgets-7.5.1-py2.py3-none-any.whl (121 kB)
    Collecting psutil>=5.4.8
      Using cached psutil-5.6.7-cp37-cp37m-win_amd64.whl (236 kB)
    Collecting zerorpc>=0.6.1
      Using cached zerorpc-0.6.3-py3-none-any.whl (37 kB)
    Collecting traitlets>=4.3.2
      Using cached traitlets-4.3.3-py2.py3-none-any.whl (75 kB)
    Collecting pytz>=2017.2
      Using cached pytz-2019.3-py2.py3-none-any.whl (509 kB)
    Collecting ipykernel>=4.5.1
      Using cached ipykernel-5.1.4-py3-none-any.whl (116 kB)
    Collecting widgetsnbextension~=3.5.0
      Using cached widgetsnbextension-3.5.1-py2.py3-none-any.whl (2.2 MB)
    Collecting ipython>=4.0.0; python_version >= "3.3"
      Using cached ipython-7.12.0-py3-none-any.whl (777 kB)
    Collecting nbformat>=4.2.0
      Using cached nbformat-5.0.4-py3-none-any.whl (169 kB)
    Collecting gevent>=1.1
      Using cached gevent-1.4.0-cp37-cp37m-win_amd64.whl (3.0 MB)
    Collecting pyzmq>=13.1.0
      Using cached pyzmq-18.1.1-cp37-cp37m-win_amd64.whl (1.0 MB)
    Collecting future
      Using cached future-0.18.2.tar.gz (829 kB)
    Collecting msgpack>=0.5.2
      Using cached msgpack-0.6.2-cp37-cp37m-win_amd64.whl (68 kB)
    Collecting ipython-genutils
      Using cached https://steeleye.jfrog.io/steeleye/api/pypi/pypi/packages/packages/fa/bc/9bd3b5c2b4774d5f33b2d544f1460be9df7df2fe42f352135381c347c69a/ipython_genutils-0.2.0-py2.py3-none-any.whl (26 kB)
    Collecting decorator
      Using cached decorator-4.4.1-py2.py3-none-any.whl (9.2 kB)
    Collecting tornado>=4.2
      Using cached tornado-6.0.3-cp37-cp37m-win_amd64.whl (415 kB)
    Collecting jupyter-client
      Using cached jupyter_client-5.3.4-py2.py3-none-any.whl (92 kB)
    Collecting notebook>=4.4.1
      Using cached notebook-6.0.3-py3-none-any.whl (9.7 MB)
    Collecting backcall
      Using cached backcall-0.1.0.tar.gz (9.7 kB)
    Requirement already satisfied: setuptools>=18.5 in c:\users\twmeg\appdata\local\programs\python\python37\lib\site-packages (from ipython>=4.0.0; python_version >= "3.3"->ipywidgets>=7.5.1->perspective-python) (41.2.0)
    Collecting colorama; sys_platform == "win32"
      Using cached colorama-0.4.3-py2.py3-none-any.whl (15 kB)
    Collecting prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0
      Using cached prompt_toolkit-3.0.3-py3-none-any.whl (348 kB)
    Collecting pickleshare
      Using cached pickleshare-0.7.5-py2.py3-none-any.whl (6.9 kB)
    Collecting jedi>=0.10
      Using cached jedi-0.16.0-py2.py3-none-any.whl (1.1 MB)
    Collecting pygments
      Using cached Pygments-2.5.2-py2.py3-none-any.whl (896 kB)
    Collecting jsonschema!=2.5.0,>=2.4
      Using cached jsonschema-3.2.0-py2.py3-none-any.whl (56 kB)
    Collecting jupyter-core
      Using cached jupyter_core-4.6.2-py2.py3-none-any.whl (83 kB)
    Collecting cffi>=1.11.5; sys_platform == "win32" and platform_python_implementation == "CPython"
      Using cached cffi-1.14.0-cp37-cp37m-win_amd64.whl (176 kB)
    Collecting greenlet>=0.4.14; platform_python_implementation == "CPython"
      Using cached greenlet-0.4.15-cp37-cp37m-win_amd64.whl (16 kB)
    Collecting pywin32>=1.0; sys_platform == "win32"
      Using cached pywin32-227-cp37-cp37m-win_amd64.whl (9.1 MB)
    Collecting terminado>=0.8.1
      Using cached terminado-0.8.3-py2.py3-none-any.whl (33 kB)
    Collecting jinja2
      Using cached Jinja2-2.11.1-py2.py3-none-any.whl (126 kB)
    Collecting nbconvert
      Using cached nbconvert-5.6.1-py2.py3-none-any.whl (455 kB)
    Collecting prometheus-client
      Using cached prometheus_client-0.7.1.tar.gz (38 kB)
    Collecting Send2Trash
      Using cached https://steeleye.jfrog.io/steeleye/api/pypi/pypi/packages/packages/49/46/c3dc27481d1cc57b9385aff41c474ceb7714f7935b1247194adae45db714/Send2Trash-1.5.0-py3-none-any.whl (12 kB)
    Collecting wcwidth
      Using cached wcwidth-0.1.8-py2.py3-none-any.whl (17 kB)
    Collecting parso>=0.5.2
      Using cached parso-0.6.1-py2.py3-none-any.whl (97 kB)
    Collecting attrs>=17.4.0
      Using cached attrs-19.3.0-py2.py3-none-any.whl (39 kB)
    Collecting pyrsistent>=0.14.0
      Using cached pyrsistent-0.15.7.tar.gz (107 kB)
    Collecting importlib-metadata; python_version < "3.8"
      Using cached importlib_metadata-1.5.0-py2.py3-none-any.whl (30 kB)
    Collecting pycparser
      Using cached pycparser-2.19.tar.gz (158 kB)
    Collecting pywinpty>=0.5; os_name == "nt"
      Using cached pywinpty-0.5.7-cp37-cp37m-win_amd64.whl (1.3 MB)
    Collecting MarkupSafe>=0.23
      Using cached MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl (16 kB)
    Collecting defusedxml
      Using cached defusedxml-0.6.0-py2.py3-none-any.whl (23 kB)
    Collecting pandocfilters>=1.4.1
      Using cached https://steeleye.jfrog.io/steeleye/api/pypi/pypi/packages/packages/4c/ea/236e2584af67bb6df960832731a6e5325fd4441de001767da328c33368ce/pandocfilters-1.4.2.tar.gz (14 kB)
    Collecting bleach
      Using cached bleach-3.1.0-py2.py3-none-any.whl (157 kB)
    Collecting testpath
      Using cached testpath-0.4.4-py2.py3-none-any.whl (163 kB)
    Collecting entrypoints>=0.2.2
      Using cached entrypoints-0.3-py2.py3-none-any.whl (11 kB)
    Collecting mistune<2,>=0.8.1
      Using cached mistune-0.8.4-py2.py3-none-any.whl (16 kB)
    Collecting zipp>=0.5
      Using cached zipp-2.2.0-py36-none-any.whl (4.6 kB)
    Collecting webencodings
      Using cached https://steeleye.jfrog.io/steeleye/api/pypi/pypi/packages/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl (11 kB)
    Building wheels for collected packages: perspective-python
      Building wheel for perspective-python (PEP 517) ... error
      ERROR: Command errored out with exit status 1:
       command: 'c:\users\twmeg\appdata\local\programs\python\python37\python.exe' 'c:\users\twmeg\appdata\local\programs\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py' build_wheel 'C:\Users\twmeg\AppData\Local\Temp\tmphaq84mzg'
           cwd: C:\Users\twmeg\AppData\Local\Temp\pip-install-9cnote_9\perspective-python
      Complete output (207 lines):
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build\lib.win-amd64-3.7
      creating build\lib.win-amd64-3.7\bench
      copying bench\bench.py -> build\lib.win-amd64-3.7\bench
      copying bench\perspective_benchmark.py -> build\lib.win-amd64-3.7\bench
      copying bench\__init__.py -> build\lib.win-amd64-3.7\bench
      creating build\lib.win-amd64-3.7\perspective
      copying perspective\libpsp.py -> build\lib.win-amd64-3.7\perspective
      copying perspective\__init__.py -> build\lib.win-amd64-3.7\perspective
      creating build\lib.win-amd64-3.7\perspective\core
      copying perspective\core\aggregate.py -> build\lib.win-amd64-3.7\perspective\core
      copying perspective\core\exception.py -> build\lib.win-amd64-3.7\perspective\core
      copying perspective\core\filters.py -> build\lib.win-amd64-3.7\perspective\core
      copying perspective\core\plugin.py -> build\lib.win-amd64-3.7\perspective\core
      copying perspective\core\sort.py -> build\lib.win-amd64-3.7\perspective\core
      copying perspective\core\_version.py -> build\lib.win-amd64-3.7\perspective\core
      copying perspective\core\__init__.py -> build\lib.win-amd64-3.7\perspective\core
      creating build\lib.win-amd64-3.7\perspective\manager
      copying perspective\manager\manager.py -> build\lib.win-amd64-3.7\perspective\manager
      copying perspective\manager\session.py -> build\lib.win-amd64-3.7\perspective\manager
      copying perspective\manager\__init__.py -> build\lib.win-amd64-3.7\perspective\manager
      creating build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\table.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\view.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\view_config.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\_accessor.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\_callback_cache.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\_constants.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\_data_formatter.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\_date_validator.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\_state.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\_utils.py -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\__init__.py -> build\lib.win-amd64-3.7\perspective\table
      creating build\lib.win-amd64-3.7\perspective\tests
      copying perspective\tests\common.py -> build\lib.win-amd64-3.7\perspective\tests
      copying perspective\tests\conftest.py -> build\lib.win-amd64-3.7\perspective\tests
      copying perspective\tests\__init__.py -> build\lib.win-amd64-3.7\perspective\tests
      creating build\lib.win-amd64-3.7\perspective\tornado_handler
      copying perspective\tornado_handler\tornado_handler.py -> build\lib.win-amd64-3.7\perspective\tornado_handler
      copying perspective\tornado_handler\__init__.py -> build\lib.win-amd64-3.7\perspective\tornado_handler
      creating build\lib.win-amd64-3.7\perspective\viewer
      copying perspective\viewer\validate.py -> build\lib.win-amd64-3.7\perspective\viewer
      copying perspective\viewer\viewer.py -> build\lib.win-amd64-3.7\perspective\viewer
      copying perspective\viewer\viewer_traitlets.py -> build\lib.win-amd64-3.7\perspective\viewer
      copying perspective\viewer\__init__.py -> build\lib.win-amd64-3.7\perspective\viewer
      creating build\lib.win-amd64-3.7\perspective\widget
      copying perspective\widget\widget.py -> build\lib.win-amd64-3.7\perspective\widget
      copying perspective\widget\__init__.py -> build\lib.win-amd64-3.7\perspective\widget
      creating build\lib.win-amd64-3.7\perspective\core\data
      copying perspective\core\data\np.py -> build\lib.win-amd64-3.7\perspective\core\data
      copying perspective\core\data\pd.py -> build\lib.win-amd64-3.7\perspective\core\data
      copying perspective\core\data\__init__.py -> build\lib.win-amd64-3.7\perspective\core\data
      creating build\lib.win-amd64-3.7\perspective\tests\core
      copying perspective\tests\core\test_aggregates.py -> build\lib.win-amd64-3.7\perspective\tests\core
      copying perspective\tests\core\test_async.py -> build\lib.win-amd64-3.7\perspective\tests\core
      copying perspective\tests\core\test_layout.py -> build\lib.win-amd64-3.7\perspective\tests\core
      copying perspective\tests\core\test_plugin.py -> build\lib.win-amd64-3.7\perspective\tests\core
      copying perspective\tests\core\test_sort.py -> build\lib.win-amd64-3.7\perspective\tests\core
      copying perspective\tests\core\__init__.py -> build\lib.win-amd64-3.7\perspective\tests\core
      creating build\lib.win-amd64-3.7\perspective\tests\manager
      copying perspective\tests\manager\test_manager.py -> build\lib.win-amd64-3.7\perspective\tests\manager
      copying perspective\tests\manager\__init__.py -> build\lib.win-amd64-3.7\perspective\tests\manager
      creating build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_delete.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_exception.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_remove.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_table.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_table_arrow.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_table_datetime.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_table_infer.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_table_numpy.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_table_pandas.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_to_arrow.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_to_format.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_update.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_update_arrow.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_update_numpy.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_update_pandas.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\test_view.py -> build\lib.win-amd64-3.7\perspective\tests\table
      copying perspective\tests\table\__init__.py -> build\lib.win-amd64-3.7\perspective\tests\table
      creating build\lib.win-amd64-3.7\perspective\tests\viewer
      copying perspective\tests\viewer\test_validate.py -> build\lib.win-amd64-3.7\perspective\tests\viewer
      copying perspective\tests\viewer\test_viewer.py -> build\lib.win-amd64-3.7\perspective\tests\viewer
      copying perspective\tests\viewer\__init__.py -> build\lib.win-amd64-3.7\perspective\tests\viewer
      creating build\lib.win-amd64-3.7\perspective\tests\widget
      copying perspective\tests\widget\test_widget.py -> build\lib.win-amd64-3.7\perspective\tests\widget
      copying perspective\tests\widget\test_widget_pandas.py -> build\lib.win-amd64-3.7\perspective\tests\widget
      copying perspective\tests\widget\__init__.py -> build\lib.win-amd64-3.7\perspective\tests\widget
      running egg_info
      writing perspective_python.egg-info\PKG-INFO
      writing dependency_links to perspective_python.egg-info\dependency_links.txt
      writing requirements to perspective_python.egg-info\requires.txt
      writing top-level names to perspective_python.egg-info\top_level.txt
      reading manifest file 'perspective_python.egg-info\SOURCES.txt'
      reading manifest template 'MANIFEST.in'
      C:\Users\twmeg\AppData\Local\Temp\pip-build-env-wjl4qaim\overlay\Lib\site-packages\setuptools\dist.py:476: UserWarning: Normalizing '0.4.2post.1' to '0.4.2.post1'
        normalized_version,
      warning: no files found matching 'LICENSE'
      warning: no files found matching 'perspective\table\*.dll'
      warning: no files found matching 'perspective\table\*.dylib'
      warning: no previously-included files found matching 'docs\#*'
      no previously-included directories found matching 'docs\build'
      no previously-included directories found matching 'docs\gh-pages'
      no previously-included directories found matching 'docs\dist'
      warning: no files found matching 'webpack.config.js'
      warning: no directories found matching 'style'
      warning: no directories found matching 'js'
      warning: no previously-included files matching '*~' found anywhere in distribution
      warning: no previously-included files matching '*.pyc' found anywhere in distribution
      warning: no previously-included files matching '*.pyo' found anywhere in distribution
      warning: no previously-included files matching '.git' found anywhere in distribution
      warning: no previously-included files matching '.ipynb_checkpoints' found anywhere in distribution
      warning: no previously-included files matching '.DS_Store' found anywhere in distribution
      writing manifest file 'perspective_python.egg-info\SOURCES.txt'
      creating build\lib.win-amd64-3.7\perspective\include
      creating build\lib.win-amd64-3.7\perspective\include\perspective
      copying perspective\include\perspective\python.h -> build\lib.win-amd64-3.7\perspective\include\perspective
      creating build\lib.win-amd64-3.7\perspective\include\perspective\python
      copying perspective\include\perspective\python\accessor.h -> build\lib.win-amd64-3.7\perspective\include\perspective\python
      copying perspective\include\perspective\python\base.h -> build\lib.win-amd64-3.7\perspective\include\perspective\python
      copying perspective\include\perspective\python\context.h -> build\lib.win-amd64-3.7\perspective\include\perspective\python
      copying perspective\include\perspective\python\fill.h -> build\lib.win-amd64-3.7\perspective\include\perspective\python
      copying perspective\include\perspective\python\numpy.h -> build\lib.win-amd64-3.7\perspective\include\perspective\python
      copying perspective\include\perspective\python\serialization.h -> build\lib.win-amd64-3.7\perspective\include\perspective\python
      copying perspective\include\perspective\python\table.h -> build\lib.win-amd64-3.7\perspective\include\perspective\python
      copying perspective\include\perspective\python\utils.h -> build\lib.win-amd64-3.7\perspective\include\perspective\python
      copying perspective\include\perspective\python\view.h -> build\lib.win-amd64-3.7\perspective\include\perspective\python
      creating build\lib.win-amd64-3.7\perspective\src
      copying perspective\src\accessor.cpp -> build\lib.win-amd64-3.7\perspective\src
      copying perspective\src\context.cpp -> build\lib.win-amd64-3.7\perspective\src
      copying perspective\src\fill.cpp -> build\lib.win-amd64-3.7\perspective\src
      copying perspective\src\numpy.cpp -> build\lib.win-amd64-3.7\perspective\src
      copying perspective\src\python.cpp -> build\lib.win-amd64-3.7\perspective\src
      copying perspective\src\serialization.cpp -> build\lib.win-amd64-3.7\perspective\src
      copying perspective\src\table.cpp -> build\lib.win-amd64-3.7\perspective\src
      copying perspective\src\utils.cpp -> build\lib.win-amd64-3.7\perspective\src
      copying perspective\src\view.cpp -> build\lib.win-amd64-3.7\perspective\src
      copying perspective\table\libbinding.so -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\libpsp.so -> build\lib.win-amd64-3.7\perspective\table
      copying perspective\table\libtbb.so -> build\lib.win-amd64-3.7\perspective\table
      creating build\lib.win-amd64-3.7\perspective\tests\client
      copying perspective\tests\client\test_client.py -> build\lib.win-amd64-3.7\perspective\tests\client
      copying perspective\tests\table\psp_test -> build\lib.win-amd64-3.7\perspective\tests\table
      creating build\lib.win-amd64-3.7\perspective\tests\table\arrow
      copying perspective\tests\table\arrow\date32.arrow -> build\lib.win-amd64-3.7\perspective\tests\table\arrow
      copying perspective\tests\table\arrow\date64.arrow -> build\lib.win-amd64-3.7\perspective\tests\table\arrow
      copying perspective\tests\table\arrow\dict.arrow -> build\lib.win-amd64-3.7\perspective\tests\table\arrow
      copying perspective\tests\table\arrow\dict_update.arrow -> build\lib.win-amd64-3.7\perspective\tests\table\arrow
      copying perspective\tests\table\arrow\int_float_str.arrow -> build\lib.win-amd64-3.7\perspective\tests\table\arrow
      copying perspective\tests\table\arrow\int_float_str_file.arrow -> build\lib.win-amd64-3.7\perspective\tests\table\arrow
      copying perspective\tests\table\arrow\int_float_str_update.arrow -> build\lib.win-amd64-3.7\perspective\tests\table\arrow
      running build_ext
      Traceback (most recent call last):
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py", line 257, in <module>
          main()
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py", line 240, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py", line 182, in build_wheel
          metadata_directory)
        File "C:\Users\twmeg\AppData\Local\Temp\pip-build-env-wjl4qaim\overlay\Lib\site-packages\setuptools\build_meta.py", line 213, in build_wheel
          wheel_directory, config_settings)
        File "C:\Users\twmeg\AppData\Local\Temp\pip-build-env-wjl4qaim\overlay\Lib\site-packages\setuptools\build_meta.py", line 198, in _build_with_temp_dir
          self.run_setup()
        File "C:\Users\twmeg\AppData\Local\Temp\pip-build-env-wjl4qaim\overlay\Lib\site-packages\setuptools\build_meta.py", line 250, in run_setup
          self).run_setup(setup_script=setup_script)
        File "C:\Users\twmeg\AppData\Local\Temp\pip-build-env-wjl4qaim\overlay\Lib\site-packages\setuptools\build_meta.py", line 143, in run_setup
          exec(compile(code, __file__, 'exec'), locals())
        File "setup.py", line 237, in <module>
          cmdclass=dict(build_ext=PSPBuild),
        File "C:\Users\twmeg\AppData\Local\Temp\pip-build-env-wjl4qaim\overlay\Lib\site-packages\setuptools\__init__.py", line 144, in setup
          return distutils.core.setup(**attrs)
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\distutils\core.py", line 148, in setup
          dist.run_commands()
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\distutils\dist.py", line 966, in run_commands
          self.run_command(cmd)
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\distutils\dist.py", line 985, in run_command
          cmd_obj.run()
        File "C:\Users\twmeg\AppData\Local\Temp\pip-build-env-wjl4qaim\overlay\Lib\site-packages\wheel\bdist_wheel.py", line 223, in run
          self.run_command('build')
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\distutils\cmd.py", line 313, in run_command
          self.distribution.run_command(command)
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\distutils\dist.py", line 985, in run_command
          cmd_obj.run()
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\distutils\command\build.py", line 135, in run
          self.run_command(cmd_name)
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\distutils\cmd.py", line 313, in run_command
          self.distribution.run_command(command)
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\distutils\dist.py", line 985, in run_command
          cmd_obj.run()
        File "setup.py", line 104, in run
          self.run_cmake()
        File "setup.py", line 128, in run_cmake
          out = subprocess.check_output([self.cmake_cmd, '--version'])
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\subprocess.py", line 411, in check_output
          **kwargs).stdout
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\subprocess.py", line 488, in run
          with Popen(*popenargs, **kwargs) as process:
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\subprocess.py", line 800, in __init__
          restore_signals, start_new_session)
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\subprocess.py", line 1148, in _execute_child
          args = list2cmdline(args)
        File "c:\users\twmeg\appdata\local\programs\python\python37\lib\subprocess.py", line 555, in list2cmdline
          needquote = (" " in arg) or ("\t" in arg) or not arg
      TypeError: argument of type 'NoneType' is not iterable
      ----------------------------------------
      ERROR: Failed building wheel for perspective-python
    Failed to build perspective-python
    ERROR: Could not build wheels for perspective-python which use PEP 517 and cannot be installed directly
    

    Environment:

    Has been tried on a Windows 10 machines, separately on a Windows Server also, in both a conda virtual env and directly into a default python environment (not virtual env). The same error is received in each case.

    question Python 
    opened by twmeggs 26
  • Python 3.6 wheel

    Python 3.6 wheel

    We're interested in using python-perspective but we're currently bound to Python 3.6 ( we're on 3.6.4 to be precise ) Would it be possible to get a 3.6 wheel out?

    question Python 
    opened by robambalu 22
  • Cant get PerspectiveWidget loaded in jupyter lab

    Cant get PerspectiveWidget loaded in jupyter lab

    I'm not sure what I did or what changed, I had this working just yesterday. I tried rebuilding my end but I cant get it to work. Whenever I create the widget I get an error: Error displaying widget: model not found

    I installed both jupyterlab extensions, as I did last time.

    chrome console shows this: 523.fa256ee….js:1 Error: widget model not found at x.get_model (523.fa256ee….js:1) at u.renderModel (523.fa256ee….js:1)  ​This was done succesfully: (base) [hfalgo_csp]$ jupyter labextension install @finos/perspective-jupyterlab Building jupyterlab assets (production, minimized) (base) [hfalgo_csp]$ jupyter labextension install @jupyter-widgets/jupyterlab-manager Building jupyterlab assets (production, minimized)

    running these versions: (base) [hfalgo_csp]$ jupyter --version jupyter core : 4.7.1 jupyter-notebook : 6.3.0 qtconsole : not installed ipython : 7.12.0 ipykernel : 5.5.3 jupyter client : 6.1.12 jupyter lab : 3.0.14 nbconvert : 6.0.7 ipywidgets : 7.6.3 nbformat : 5.1.3 traitlets : 4.3.3

    Any ideas / debugging tips?

    Thanks

    opened by robambalu 21
  • Failed to import C++ bindings for Perspective

    Failed to import C++ bindings for Perspective

    Bug Report

    I have successfully install perspective-python package with all dependencies (NumPy and PyArrow) Then I get the warning message when import perspective

    CRITICAL:root:Failed to import C++ bindings for Perspective probably as it could not be built for your architecture. You can still use PerspectiveWidget in client mode using JupyterLab.

    So I can't use Table and PerspectiveManager classes. Command from perspective import Table, PerspectiveManager gives the result:

    File "", line 1, in ImportError: cannot import name 'Table' from 'perspective' (/home/akulakov/miniconda3/envs/finos/lib/python3.7/site-packages/perspective/init.py)

    Steps to Reproduce:

    1. conda create -n finos python=3.7.0
    2. conda activate finos
    3. python -m pip install numpy
    4. python -m pip install pyarrow==0.15.1
    5. python -m pip install perspective-python No errors at this time
    6. exec python: from perspective import Table, PerspectiveManager

    Expected Result:

    import packages with no errors

    Environment:

    OS: Ubuntu 19.10 Virtualenv: conda Python: 3.7.0

    question Python 
    opened by alexeykulakov 20
  • Statically link `perspective-python` and `libarrow`

    Statically link `perspective-python` and `libarrow`

    This PR builds Apache Arrow as a static library and reconfigures perspective-python to no longer link against a version of PyArrow present on the system/installed as part of perspective-python dependencies.

    Instead, Perspective's C++ library will link against the pre-compiled, minimal arrow static library, and the user is free to use any version of PyArrow they choose to install as long as the Arrow binary format is compatible with the binaries output by Perspective's version of Arrow, which is v1.0.1 at this time.

    At present, Perspective does not import pyarrow or use any of Arrow's Python-specific C++ code. If we were to use PyArrow in the Python runtime, however (like in the test suite), Perspective's C++ version of Arrow will continue to work as expected—perspective-python will use its own version of Arrow, and pyarrow will use the libarrow.so that shipped with the PyArrow install. This means further integration with PyArrow is not blocked/degraded, and if anything should be accelerated as we now have a consistent Arrow version across all Perspective runtimes.

    In effect, we have taken a "pinned" version of PyArrow that used to depend on external assets we could not fully/consistently control, and turned it into a pinned version of PyArrow that we have full management and control over.

    Benefits

    With this change, the complicated and admittedly brittle code we have in place to deal with detecting PyArrow's install location, managing PyArrow versions, copying Arrow DLLs (on Windows), etc. can be removed, as Perspective's build no longer depends on the existence and correct versioning of an asset we have little control over.

    Additionally, users can install the newest version of PyArrow in order to gain access to features/fixes without worrying about Perspective compatibility beyond the binary format, which is expected to remain stable and compatible between versions. Finally, the developer experience should be improved for both source builds and configuring the conda-forge build, which can unpin its PyArrow dependency.

    Testing

    Perspective's WASM build has built and used the minimal version of Arrow since late 2019, and perspective-python's test suite contains a litany of tests that utilize PyArrow to generate/ingest arrow binaries to and from Perspective. This PR updates the Manylinux Dockerfiles and Python test suite to use PyArrow v2.0.0 (except for Python 2, which continues to use v0.16.0). This in effect gives us full coverage over forwards and backwards compatibility between our static Arrow pinned to v.1.0.1 and the versions of PyArrow used by the tests.

    TODO:

    • [x] Remove PyArrow maintenance code/requirements from setup.py, pyproject.toml etc.
    • [x] Test that Perspective works with the latest version of PyArrow, and update the test suite to use latest Arrow
    • [x] Remove PyArrow custom installs from all Dockerfiles, and regenerate Docker images
    • [x] Clean up CMake code around PyArrow
    internal Python cla-present 
    opened by sc1f 15
  • Add Manylinux Python 3.7 wheel build + tests, disable Azure Windows Python build

    Add Manylinux Python 3.7 wheel build + tests, disable Azure Windows Python build

    This PR adds wheel builds and install tests for Perspective's manylinux2010 and manylinux2014 images on Python 3.7, storing built artifacts on Azure's pipeline artifact storage.

    Additionally, this PR temporarily disables the Windows Python 3.7 build as it seems that Boost's version/path has changed in more recent releases of the Windows VM on Azure Pipelines, which breaks all builds and requires further investigation.

    Changes

    After builds/tests on manylinux are completed, a wheel is built and installed in a fresh virtual environment. perspective is then imported and is_libpsp called to check that paths to all built C++ shared libraries resolve properly as part of the wheel install. This check is performed for every branch push to CI.

    I added a tags trigger to our pipeline, which means that a wheel will be built on each new tag, as well as when the commit containing the new tag is merged into master. There is no support for automatic disting/file upload (using jpmorganchase/nbcelltests as a guide to that end), but that can be built in as part of a more comprehensive release process.

    Caveats

    • The Python 2.7 manylinux2010 wheel is shown as incompatible when trying to install in a fresh virtual environment; I assume this is due to some technicality of wheels/virtualenv in Python 2 but am not investigating further for the time being
    • Ideally, this task should be enabled for MacOS 10.14 and MacOS 10.15 as well, which would allow us to build Mac wheels quickly as part of the release process.
    internal cla-present 
    opened by sc1f 15
  • Move CI/CD from Azure Pipelines to GitHub Actions

    Move CI/CD from Azure Pipelines to GitHub Actions

    This PR replaces the Perspective CI/CD infrastructure. We are currently using Azure Pipelines, and this PR replaces that with GitHub actions

    Motivations

    Azure pipelines are very similar to GitHub Actions (coming from the same company), both with a number of important distinctions

    • Separate interface, login, controls, etc, in Azure Devops instead of natively in GitHub
    • More difficult pipeline syntax
    • Smaller / fewer community extensions

    Additionally, anecdotal evidence suggest that the machines and pipelines used for azure pipelines are slower than for GitHub actions, and Perspective's complex build process (which is becoming more complex due to ongoing JS / Python integration work) leads to long build times.

    After some initial exploration, the easier-to-grok syntax and anecdotally faster speed of GitHub Actions was enough to motivate experiments for migrating.

    Requirements

    Perspective builds with the following languages and technologies:

    • node for scripting / project orchestration
    • emscripten emsdk for C++ compilation to webassembly
    • C/C++ compilers for python integration
    • Python + dependencies
    • rust for frontend components via webassembly

    Because perspective builds its python assets for deploy on azure, we need to support the following build matrix

    • OS X 10.15
    • Windows 2019
    • Any linux (linux packages built via manylinux docker images which provide python 3.6-3.9)
    • Python 3.6-3.9 (mac)
    • Python 3.7-3.9 (windows)

    All required technologies, operating systems, compilers, environments are supported for GitHub actions.

    Build assets

    Azure and this PR both emit the following wheel assets

    • cp36-cp36m-macosx_10_14_x86_64
    • cp37-cp37m-macosx_10_15_x86_64
    • cp38-cp38-macosx_10_15_x86_64
    • cp39-cp39-macosx_10_15_x86_64
    • cp36-cp36m-manylinux2010_x86_64
    • cp37-cp37m-manylinux2010_x86_64
    • cp38-cp38-manylinux2010_x86_64
    • cp39-cp39-manylinux2010_x86_64
    • cp36-cp36m-manylinux2014_x86_64
    • cp37-cp37m-manylinux2014_x86_64
    • cp38-cp38-manylinux2014_x86_64
    • cp39-cp39-manylinux2014_x86_64
    • cp37-cp37m-win_amd64
    • cp38-cp38-win_amd64
    • cp39-cp39-win_amd64

    Caching

    Caching is easier to configure on GitHub Actions vs Azure. However, it has caused some problems before so we may need to revisit it.

    • CCache for C++ compilation
    • Node cache for node_modules
    • Pip cache for python deps
    • rust/cargo cache for rust deps
    • homebrew cache for mac deps
    • vcpkg for windows C++ deps

    Build Flags / Partial Builds

    On Azure, we have overridable flags to check if the build is from a git tag (e.g. something starting with v), so that we can performa a full build. This flag is overridable so that manual full builds can be run.

    This PR provides the following set of flags, which can be specified via:

    • commit message

    • PR title

    • manual workflow run

    • [ci-full] run a full build across all environments. This is the default when a git tag starts with v for releases

    • [ci-skip] no CI, e.g. for docs or non-build configuration

    • [ci-skip-python] for pure JS changes, reduces the build time by roughly 50%

    • [ci-include-windows] include the windows build, increases the build time by roughly 30%

    • [ci-skip-cache] omits all caching, which has caused problems in the past on azure. Increases the build time by roughly 20%

    Helpful scripts have been added to make empty commits with these messages:

            "ci:full": "git commit --allow-empty -m \"[ci-full]\"",
            "ci:skip-python": "git commit --allow-empty -m \"[ci-skip-python]\"",
            "ci:include-windows": "git commit --allow-empty -m \"[ci-include-windows]\"",
            "ci:skip-cache": "git commit --allow-empty -m \"[ci-skip-cache]\"",
    

    To run a workflow manually, the syntax looks like this (via gh command line)

    gh workflow run "Build Status" --ref tkp/gha  -f ci-full=true -f ci-skip-cache=false  -f ci-skip-python=false -f ci-include-windows=true
    

    This runs the tkp/gha branch with the provided set of flags

    Tests performed on this PR

    • [x] Normal CI build
    • [x] Skip CI
    • [x] Full CI Build
    • [x] Skip Python
    • [x] Include Windows
    • [x] Skip Cache

    See the comments for more information

    cla-present 
    opened by timkpaine 14
  • Customized types are not support perspective 1.0.1

    Customized types are not support perspective 1.0.1

    Bug Report

    Steps to Reproduce:

    <!DOCTYPE html>
    <html>
    
    <head>
    
        <meta name="viewport"
            content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    
        <script src="https://unpkg.com/@finos/perspective/dist/umd/perspective.js"></script>
        <script src="https://unpkg.com/@finos/perspective-viewer/dist/umd/perspective-viewer.js"></script>
        <script src="https://unpkg.com/@finos/perspective-viewer-datagrid/dist/umd/perspective-viewer-datagrid.js"></script>
        <script src="https://unpkg.com/@finos/perspective-viewer-d3fc/dist/umd/perspective-viewer-d3fc.js"></script>
        <link rel='stylesheet' href="https://cdn.jsdelivr.net/npm/@finos/perspective-viewer/dist/umd/material-dense.css"
            is="custom-style">
    
        <style>
            perspective-viewer {
                position: absolute;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
            }
        </style>
    
    </head>
    
    <body>
    
        <perspective-viewer editable>
    
        </perspective-viewer>
    
        <script>
            const overridden_types = {
                types: {
                    float: {
                        filter_operator: '==',
                        aggregate: 'sum',
                        format: {
                            style: 'decimal',
                            minimumFractionDigits: 2,
                            maximumFractionDigits: 7
                        }
                    },
                    string: {
                        filter_operator: '==',
                        aggregate: 'count'
                    },
                    integer: {
                        filter_operator: '==',
                        aggregate: 'sum',
                        format: {}
                    },
                    boolean: {
                        filter_operator: '==',
                        aggregate: 'count'
                    },
                    datetime: {
                        filter_operator: '==',
                        aggregate: 'count',
                        format: {
                            year: 'numeric',
                            month: '2-digit',
                            day: '2-digit',
                            hour: '2-digit',
                            minute: '2-digit',
                            second: '2-digit',
                            fractionalSecondDigits: 3,
                            hourCycle: 'h23',
                        },
                    },
                    timestamp: {
                        filter_operator: '==',
                        aggregate: 'count',
                        type: 'datetime',
                        format: {
                            year: 'numeric',
                            month: '2-digit',
                            day: '2-digit',
                            hour: '2-digit',
                            minute: '2-digit',
                            second: '2-digit',
                            fractionalSecondDigits: 3,
                            hourCycle: 'h23',
                        },
                    },
                    time: {
                        filter_operator: '==',
                        aggregate: 'count',
                        type: 'datetime',
                        format: {
                            hour: '2-digit',
                            minute: '2-digit',
                            second: '2-digit',
                            fractionalSecondDigits: 3,
                            hourCycle: 'h23',
                        },
                        null_value: -1
                    },
                    timespan: {
                        filter_operator: '==',
                        aggregate: 'count',
                        type: 'datetime',
                        format: {
                            hour: '2-digit',
                            minute: '2-digit',
                            second: '2-digit',
                            fractionalSecondDigits: 3,
                            hourCycle: 'h23',
                        },
                        null_value: -1
                    },
                    minute: {
                        filter_operator: '==',
                        aggregate: 'count',
                        type: 'datetime',
                        format: {
                            hour: '2-digit',
                            minute: '2-digit',
                            hourCycle: 'h23',
                        },
                        null_value: -1
                    },
                    second: {
                        filter_operator: '==',
                        aggregate: 'count',
                        type: 'datetime',
                        format: {
                            hour: '2-digit',
                            minute: '2-digit',
                            second: '2-digit',
                            hourCycle: 'h23',
                        },
                        null_value: -1
                    },
                    date: {
                        filter_operator: '==',
                        aggregate: 'count',
                        format: {
                            year: 'numeric',
                            month: '2-digit',
                            day: '2-digit',
                        },
                        null_value: -1
                    },
                    month: {
                        filter_operator: '==',
                        aggregate: 'count',
                        type: 'date',
                        format: {
                            year: 'numeric',
                            month: '2-digit',
                        },
                        null_value: -1
                    }
                }
            };
    
            const worker = perspective.worker(overridden_types);
    
            document.addEventListener("DOMContentLoaded", async function () {
                var data = [
                    { x: 1, y: "a", z: true, t: "2016-01-13T17:11:29.998", s: "2000-01-01T00:00:32.000" },
                    { x: 2, y: "b", z: false, t: "2016-01-13T17:11:29.999", s: "2000-01-01T00:00:33.000" },
                    { x: 3, y: "c", z: true, t: "2016-01-13T17:11:30.000", s: "2000-01-01T00:00:34.000" },
                    { x: 4, y: "d", z: false, t: "2016-01-13T17:11:30.001", s: "2000-01-01T00:00:35.000" }
                ];
    
                var viewer = document.getElementsByTagName('perspective-viewer')[0];
    
                const table = await worker.table({
                    x: 'integer',
                    y: 'string',
                    z: 'boolean',
                    t: 'datetime',
                    s: 'second'
                });
    
                table.update(data);
    
                viewer.load(table);
            });
        </script>
    
    </body>
    
    </html>
    

    Expected Result:

    Customized types should show correctly.

    Actual Result:

    Customized types do not work anymore.

    Environment:

    fedora 34 perspective v1.0.1

    opened by jshinonome 14
  • 'import perspective' complains about undefined symbol on Linux (Manjaro)

    'import perspective' complains about undefined symbol on Linux (Manjaro)

    Bug Report

    `❯ ipython Python 3.7.7 (default, May 7 2020, 21:25:33) Type 'copyright', 'credits' or 'license' for more information IPython 7.16.1 -- An enhanced Interactive Python. Type '?' for help.

    In [1]: import perspective
    CRITICAL:root:Failed to import C++ bindings for Perspective probably as it could not be built for your architecture (check install logs for more details). You can still use PerspectiveWidget in client mode using JupyterLab. Traceback (most recent call last): File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/libpsp.py", line 21, in from .table import * # noqa: F401, F403 File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/init.py", line 9, in from .table import Table File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/table.py", line 11, in from .view import View File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/view.py", line 15, in from ._data_formatter import to_format, _parse_format_options File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/_data_formatter.py", line 12, in from .libbinding import get_data_slice_zero, get_data_slice_one, get_data_slice_two,
    ImportError: /home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/libpsp.so: undefined symbol: _ZNK5arrow6Buffer8ToStringB5cxx11Ev `

    Log from pip install -v perspective-python

    build.log

    Steps to Reproduce:

    1. install miniconda //to /opt/miniconda
    2. rm -rf ./.cache
    3. rm -rf ./.conda
    4. conda create -n redash python=3.7 -y
    5. conda activate redash
    6. pip install requests jupyter-server notebook ipython pyarrow==0.16.0
    7. rm ./build.log
    8. pip install -v perspective-python --log build.log
    9. ipython
    10. import perspective

    Expected Result:

    I expect no errors

    Actual Result:

    In [1]: import perspective CRITICAL:root:Failed to import C++ bindings for Perspective probably as it could not be built for your architecture (check install logs for more details). You can still usePerspectiveWidgetin client mode using JupyterLab. Traceback (most recent call last): File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/libpsp.py", line 21, in <module> from .table import * # noqa: F401, F403 File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/__init__.py", line 9, in <module> from .table import Table File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/table.py", line 11, in <module> from .view import View File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/view.py", line 15, in <module> from ._data_formatter import to_format, _parse_format_options File "/home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/_data_formatter.py", line 12, in <module> from .libbinding import get_data_slice_zero, get_data_slice_one, get_data_slice_two, \ ImportError: /home/peter/.conda/envs/redash/lib/python3.7/site-packages/perspective/table/libpsp.so: undefined symbol: _ZNK5arrow6Buffer8ToStringB5cxx11Ev

    Environment:

    ❯ neofetch ██████████████████ ████████ [email protected] ██████████████████ ████████ -------------- ██████████████████ ████████ OS: Manjaro Linux x86_64 ██████████████████ ████████ Kernel: 5.4.44-1-MANJARO ████████ ████████ Uptime: 9 days, 8 hours, 29 mins ████████ ████████ ████████ Packages: 1674 (pacman), 8 (flatpak) ████████ ████████ ████████ Shell: zsh 5.8 ████████ ████████ ████████ Resolution: 3840x1600 ████████ ████████ ████████ DE: Plasma ████████ ████████ ████████ WM: KWin ████████ ████████ ████████ WM Theme: Breeze ████████ ████████ ████████ Theme: Breath2 [Plasma], Breath [GTK2/3] ████████ ████████ ████████ Icons: breath2 [Plasma], breath2 [GTK2/3] ████████ ████████ ████████ Terminal: terminator CPU: Intel i7-8750H (12) @ 4.100GHz GPU: Intel UHD Graphics 630 Memory: 9915MiB / 32020MiB

    Miniconda 4.8.3

    cmake [Installed] 3.17.3-1 extra A cross-platform open-source make system

    Log from pip install -v perspective-python

    build.log

    question 
    opened by pgagarinov 14
  • I have question on updating view filters

    I have question on updating view filters

    I have question on updating view filters

    `const worker1 = perspective.worker(); const worker2 = perspective.worker();

    // Create a table andviewonworker1`. const table = worker1.table(data); const view1 = table.view({ filter: [["State", "==", "Texas"]] });

    // Create a table from view in worker2 const table2 = worker2.table(view); const view2 = table2.view({ filter: [["City", "==", "Austin"]] });

    // Both view1 and view2 are updated. table.update([{ State: "Texas", City: "Austin" }]);

    // Only view1 is updated. table.update([{ State: "Texas", City: "San Antonio" }]);`

    If I want change the filter of view1, whats the efficient way to do that?.

    question 
    opened by Madasamy26 14
  • ImportError: libpsp.so

    ImportError: libpsp.so

    Issue:

    import perspective in Python yields

    CRITICAL:root:Failed to import C++ bindings for Perspective probably as it could not be built for your architecture (check install logs for more details).
    ImportError: libpsp.so: cannot open shared object file: No such file or directory
        from perspective import Table, PerspectiveManager, PerspectiveTornadoHandler
    ImportError: cannot import name 'Table' from 'perspective' (~/.conda/envs/perspective/lib/python3.8/site-packages/perspective/__init__.py)
    

    This is likely due to some error between using pip and conda. One potential solution would be to update the conda-forge feedstock so that pip is unnecessary.


    Environment (conda list):
    $ conda list
    arrow-cpp                 0.16.0
    boost                     1.72.0
    boost-cpp                 1.72.0
    cmake                     3.17.0
    arrow-cpp                 0.16.0
    python                    3.8.2
    perspective-python        0.5.5  # although this is from pypi while the rest are from conda-forge
    

    Details To Reproduce and System:

    On Ubuntu 18.04.5 LTS

    commands to reproduce:

    conda create -n test python=3.8
    conda install -c conda-forge cmake boost
    conda install -c conda-forge pyarrow=0.16.0
    pip install -vv perspective-python
    

    This all installs with no issue.

    question Python 
    opened by choandrew 13
  • Perpective Breaking with Big Dataset

    Perpective Breaking with Big Dataset

    Hi Team ,

    We are trying to visualize 18 million records , when we are trying to send records on UI , we are getting SBOX_FATAL_MEMORY_EXCEEDED after 1 million records.

    image

    it would be helpful if you can guide that will 18 million records at a time will work or not , or what is the max no of records we can view in UI using perpective.

    Regards, Akash

    opened by akash-goel 0
  • Replace `monaco-editor`

    Replace `monaco-editor`

    A new implementation of <perspective-viewer>'s Expression Editor component, which replaces monaco-editor. While monaco-editor has lots of enviable features, it also had some issues:

    • monaco-editor packages and imports it's own CSS, which causes issues when building with CSS-aware tools like webpack and required special consideration during installation, in general making the first-impression experience poor.
    • While lazy-loaded (not downloaded until the user clicked the New Column button), monaco-editor was 2.6mb, by far the largest component in the project, and parsed/loaded much slower than similarly-sized WASM assets as it is JavaScript. The non-lazy part still imparted a ~100k JS payload in the main bundle.
    • While the features we used were great, many features provided by monaco-editor are just not needed for the much smalled scope of an expression editor (e.g. "Rename Symbol" is probably not worth the code download and I doubt many users even knew it was there, hidden in the right-click or command-P menu).
    • It had an awkward API due to the Worker and language support, requiring importing some strangely structured modules and unclear-if-global options. The examples are complex and show a lot of diverse use cases, but the actual documentation beyond that is just the raw API docs themselves which are quite sparse. This all required a lot of gnarly Rust FFI code to integrate.

    The new version has been implemented-from-scratch:

    • Weighs in at 35k in total (including the new Rust libraries added like nom). When accounting for the monaco-editor Rust FFI code removed, even the WASM asset is actually slightly smaller than in 1.6.7:

    untitled (36)

    • Requires no special build accommodations at all.
    • Features:
      • Syntax Highlighting
      • Error indicator (though the UX has changed since the monaco-editor version as the message is now displayed in the status bar, rather than in a tooltip).
      • Autocomplete dropdown for functions (and added their descriptions inline).
      • Line numbers
    Screen Shot 2022-09-24 at 3 12 52 PM enhancement cla-present 
    opened by texodus 0
  • CLI 404s on @finos/perspective-viewer-d3fc and @finos/perspective-workspace

    CLI 404s on @finos/perspective-viewer-d3fc and @finos/perspective-workspace

    Bug Report

    Steps to Reproduce:

    1. npx @finos/perspective-cli or npm install -g @finos-perspective-cli
    2. try to host something
    3. load the page

    Expected Result:

    the page loads, eg:

    Listening on port 8080
    200 /index.html
    200 /perspective-viewer-d3fc.js
    200 /perspective-workspace.js
    200 /material-dark.css
    200 /perspective.js
    200 /perspective-viewer-datagrid.js
    200 /material-dark.css
    200 /perspective.worker.js
    200 /perspective.js.map
    200 /perspective-viewer-datagrid.js.map
    200 /chunk.js
    200    *** websocket upgrade ***
    200 /editor.worker.js
    200 /perspective_viewer_bg.wasm
    200 /chunk.js.map
    200 /perspective-viewer-d3fc.js.map
    200 /perspective-workspace.js.map
    200 /perspective-workspace.js.map
    

    Actual Result:

    Listening on port 8080
    200 /index.html
    404 /perspective-workspace.js
    404 /perspective-viewer-d3fc.js
    200 /perspective.js
    200 /perspective-viewer-datagrid.js
    200 /material-dark.css
    200 /material-dark.css
    200    *** websocket upgrade ***
    200 /perspective.js.map
    200 /perspective-viewer-datagrid.js.map
    200 /perspective.worker.js
    

    Environment:

    I'm using npm from homebrew if that changes anything

    Additional Context:

    had to symlink /usr/local/lib/node_modules/@finos/perspective-... into /usr/local/lib/node_modules/@finos/perspective-cli/node_modules

    bug 
    opened by s22chan 0
  • "in" and "not in" filters not applying under certain conditions

    Bug Report

    Using repro: https://codesandbox.io/s/perspective-in-not-in-filters-37vphj

    Steps to Reproduce:

    1. Change "not in" filter to "in"
    2. Focus the value field (pre-populated with "Canada,Russia"), do not edit it, and click away from it
    3. Change "in" filter back to "not in"
    4. As in step 2, focus the value field and then click away from it

    Expected Result:

    • When "not in" filter is applied, all rows should be visible except for Canada's & Russia's
    • When "in" filter is applied, only the Canada and Russia rows should be visible

    Actual Result:

    • After step 2, both filter modes will be applied in the correct circumstances
    • After step 4, neither filter mode will be applied
    • Repeating step 2 restores the filters

    Environment:

    v1.6.5 (latest as of writing); Chrome

    opened by brianblakely 0
  • plugin selection dropdown: header background wrong with dark-mode

    plugin selection dropdown: header background wrong with dark-mode

    Discussed in https://github.com/finos/perspective/discussions/1954

    Originally posted by GREEB August 26, 2022 Seems like a dark-mode problem, in light-mode everything seems fine. (sorry for GIFS hard to screenshot these menus)

    Steps to Reproduce:

    1. Open Chromium
    2. Go to official example Perspective / Movies this should be on @latest
    3. Open the plugin selection menu

    Expected Result:

    The option headers should be the same background as the options like it is in Firefox 103.0.2 (64-bit) Peek 2022-08-27 01-27

    Actual Result:

    This happens with Chromium Version 104.0.5112.79, the option headers are not the same background as the options Peek 2022-08-27 01-28

    Environment:

    Chromium Version 104.0.5112.79 (Official Build) Arch Linux (64-bit) Reproduced on: Chromium Version 104.0.5112.101 (Official Build) Pop!_OS 22.04 LTS(64-bit)

    Cause

    Seems like Chromium does not like to have background-color on top of background, Firefox has no problems with that:

    Chrome:

    image

    Firefox:

    image (Firefox doesn't even need the background-color to render the options right, at least on my system)

    Fix

    This is probably a bad idea but what i found is: when putting background-color underneath background, chromium applies it as expected: image

    Peek 2022-08-27 01-50

    bug 
    opened by texodus 1
  • Filtering from Treemap Broken

    Filtering from Treemap Broken

    Bug Report

    Steps to Reproduce:

    1. Create a perspective-workspace configuration that includes a global filter and a main viewer
    2. Configure the viewer in the global filter to use the Treemap plugin with a group_by selected
    3. Click on a group in the Treemap global filter

    The bug is reproduced here: https://codepen.io/jhawk-the-styleful/pen/GRxLzBw

    Expected Result:

    Main viewer is filtered

    Actual Result:

    Filter appears to be applied but doesn't effect the rows in the viewer

    Environment:

    Latest version of Perspective in Chrome

    Additional Context:

    The filter that is applied includes an array as the 3rd element instead of a string (example of incorrect filter: ["country", "==", ["Canada"]]).

    bug 
    opened by JHawk 0
Owner
The Fintech Open Source Foundation (www.finos.org)
FINOS’ mission is to promote open innovation in financial services. See our full list of repos from our nearly 100 projects & 11 programs at finos.github.io
The Fintech Open Source Foundation (www.finos.org)
Drag’n’drop Pivot Tables and Charts for Jupyter/IPython Notebook, care of PivotTable.js

pivottablejs: the Python module Drag’n’drop Pivot Tables and Charts for Jupyter/IPython Notebook, care of PivotTable.js Installation pip install pivot

Nicolas Kruchten 472 Sep 22, 2022
Drag’n’drop Pivot Tables and Charts for Jupyter/IPython Notebook, care of PivotTable.js

pivottablejs: the Python module Drag’n’drop Pivot Tables and Charts for Jupyter/IPython Notebook, care of PivotTable.js Installation pip install pivot

Nicolas Kruchten 419 Feb 11, 2021
This is a super simple visualization toolbox (script) for transformer attention visualization ✌

Trans_attention_vis This is a super simple visualization toolbox (script) for transformer attention visualization ✌ 1. How to prepare your attention m

Mingyu Wang 3 Jul 9, 2022
This repository contains a streaming Dataflow pipeline written in Python with Apache Beam, reading data from PubSub.

Sample streaming Dataflow pipeline written in Python This repository contains a streaming Dataflow pipeline written in Python with Apache Beam, readin

Israel Herraiz 9 Mar 18, 2022
LabGraph is a a Python-first framework used to build sophisticated research systems with real-time streaming, graph API, and parallelism.

LabGraph is a a Python-first framework used to build sophisticated research systems with real-time streaming, graph API, and parallelism.

MLH Fellowship 6 Jun 3, 2022
Declarative statistical visualization library for Python

Altair http://altair-viz.github.io Altair is a declarative statistical visualization library for Python. With Altair, you can spend more time understa

Altair 7.7k Sep 22, 2022
Interactive Data Visualization in the browser, from Python

Bokeh is an interactive visualization library for modern web browsers. It provides elegant, concise construction of versatile graphics, and affords hi

Bokeh 16.7k Sep 25, 2022
Statistical data visualization using matplotlib

seaborn: statistical data visualization Seaborn is a Python visualization library based on matplotlib. It provides a high-level interface for drawing

Michael Waskom 9.8k Sep 25, 2022
Fast data visualization and GUI tools for scientific / engineering applications

PyQtGraph A pure-Python graphics library for PyQt5/PyQt6/PySide2/PySide6 Copyright 2020 Luke Campagnola, University of North Carolina at Chapel Hill h

pyqtgraph 3k Sep 22, 2022
Simple, realtime visualization of neural network training performance.

pastalog Simple, realtime visualization server for training neural networks. Use with Lasagne, Keras, Tensorflow, Torch, Theano, and basically everyth

Rewon Child 415 Sep 25, 2022
Apache Superset is a Data Visualization and Data Exploration Platform

Superset A modern, enterprise-ready business intelligence web application. Why Superset? | Supported Databases | Installation and Configuration | Rele

The Apache Software Foundation 48.4k Oct 1, 2022
Debugging, monitoring and visualization for Python Machine Learning and Data Science

Welcome to TensorWatch TensorWatch is a debugging and visualization tool designed for data science, deep learning and reinforcement learning from Micr

Microsoft 3.2k Sep 27, 2022
Python script to generate a visualization of various sorting algorithms, image or video.

sorting_algo_visualizer Python script to generate a visualization of various sorting algorithms, image or video.

null 146 May 30, 2022
Statistical data visualization using matplotlib

seaborn: statistical data visualization Seaborn is a Python visualization library based on matplotlib. It provides a high-level interface for drawing

Michael Waskom 8.1k Feb 13, 2021
Interactive Data Visualization in the browser, from Python

Bokeh is an interactive visualization library for modern web browsers. It provides elegant, concise construction of versatile graphics, and affords hi

Bokeh 14.7k Feb 13, 2021
Declarative statistical visualization library for Python

Altair http://altair-viz.github.io Altair is a declarative statistical visualization library for Python. With Altair, you can spend more time understa

Altair 6.4k Feb 13, 2021
Fast data visualization and GUI tools for scientific / engineering applications

PyQtGraph A pure-Python graphics library for PyQt5/PyQt6/PySide2/PySide6 Copyright 2020 Luke Campagnola, University of North Carolina at Chapel Hill h

pyqtgraph 2.3k Feb 13, 2021
Missing data visualization module for Python.

missingno Messy datasets? Missing values? missingno provides a small toolset of flexible and easy-to-use missing data visualizations and utilities tha

Aleksey Bilogur 3.3k Sep 30, 2022
3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit (VTK)

PyVista Deployment Build Status Metrics Citation License Community 3D plotting and mesh analysis through a streamlined interface for the Visualization

PyVista 1.5k Sep 24, 2022