<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Antoine Prouvost</title><link href="https://jupyter.org/blog/" rel="alternate"/><link href="https://jupyter.org/blog/feeds/author-antoine-prouvost.atom.xml" rel="self"/><id>https://jupyter.org/blog/</id><updated>2026-02-04T14:50:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Instantly view Parquet files in JupyterLab with Arbalister</title><link href="https://jupyter.org/blog/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/" rel="alternate"/><published>2026-01-29T16:18:00+00:00</published><updated>2026-02-04T14:50:00+00:00</updated><author><name>Antoine Prouvost</name></author><id>tag:jupyter.org,2026-01-29:/blog/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/</id><summary type="html">&lt;p&gt;A colleague sends you a SQLite file, a Parquet dataset, or an Avro snapshot. You need to explore the content, but you’re not sure what’s inside or even how to open it. You shouldn’t have to write code, craft SQL queries, or recall the syntax for read_parquet in a Python library.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A colleague sends you a SQLite file, a Parquet dataset, or an Avro snapshot.&lt;br&gt;
You need to explore the content, but you’re not sure what’s inside or even how to open it. You shouldn’t have to write code, craft SQL queries, or recall the syntax for &lt;code&gt;read_parquet&lt;/code&gt; in a Python library. Instead, you should be able to click the file once and instantly see the tables and metadata.&lt;/p&gt;
&lt;p&gt;Despite being the &lt;em&gt;de-facto&lt;/em&gt; standard for data science and exploration, JupyterLab lacks this basic capability out of the box. Of course, there are extremely well designed libraries to read, process, and transform tabular data — but opening and viewing a file with a table should be simpler. A workflow with libraries like Pandas or Polars require you to install relevant packages, create a notebook, and iterate on queries to get a full picture of the data.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;display.max_rows&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;display.max_columns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;display.width&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_parquet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data/2025/PERFORMANCE_SNAPSHOT_2025_01_05.parquet&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Whether for a newcomer to data science, or someone that needs to investigate many different files with hard to remember schemas, this is a bit cumbersome. Comma separated value files (CSV) have better support: double click on the file to see it open (see figure below). That is a great way to understand the business logic and answer questions such as &lt;em&gt;What type of information is in this file? What do values typically look like? Does it seem to contain all the data I need? What is the difference between &lt;code&gt;customer_id&lt;/code&gt; and &lt;code&gt;user_id&lt;/code&gt;?&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The built-in CSV viewer of JupterLab shows data as a table." src="https://jupyter.org/blog/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/images/001-1_pHSj3jmo0D69yzM86_XAZg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterLab CSV viewer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Arbalister&lt;/strong&gt;, our new JupyterLab extension, changes this. With Arbalister, you can &lt;strong&gt;double-click to instantly view&lt;/strong&gt; a wide range of tabular data files: &lt;strong&gt;Parquet, CSV, Avro, ORC, SQLite,&lt;/strong&gt; and more…&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Arbalister viewer can open Parquet files and more" src="https://jupyter.org/blog/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/images/002-1_CHOorqcOpRmlHlHFIPpF-A.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Arbalister viewer can open Parquet files and more&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The extension will load data as it is displayed, making it possible to view it almost instantaneously even if the file does not fit in memory. A toolbar lets the user select some reading options, such as the delimiter for a CSV file, or selecting the table to display in the SQLite file!&lt;/p&gt;
&lt;h2 id="arrow-over-the-wire"&gt;Arrow over the wire&lt;/h2&gt;
&lt;p&gt;Fueling it all is the &lt;a href="https://arrow.apache.org/"&gt;Apache Arrow&lt;/a&gt; ecosystem, an in-memory format for tabular data used in most data science libraries. Plenty of files types can already be read into an Arrow data structure so we exploit it heavily in Arbalister (with &lt;a href="https://datafusion.apache.org/"&gt;Apache Datafusion&lt;/a&gt; in our case).&lt;/p&gt;
&lt;p&gt;The table displayed in the user’s browser reuses JupyterLab Lumino DataGrid with a custom data model. In the latter, we divide the whole table in chunks across both the rows and columns axes (&lt;em&gt;e.g.&lt;/em&gt; 512 rows and 24 columns). When we need to display data from a chunk that is not already available, we make an HTTP request to a server-side extension that open the file, read the relevant portion into an Arrow table and return it to the client. The table is returned as Arrow IPC (Inter Process Communication, a binary format close to the original Arrow memory) in the response body. In the client, a lightweight Arrow implementation can read it back efficiently.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A diagram show a client server-server architecture for Arbalister, with the backend responsible for reading many different file types into an Arrow IPC format, while the frontend displays it." src="https://jupyter.org/blog/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/images/003-1_6qFKCpSW5d3GT1p6EOfekg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Arbalister client-server architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;When nothing else is happening, the implementation will also pre-fetch some of the next chunks in the background so that scrolling past a chunk boundary is imperceptible.&lt;/p&gt;
&lt;p&gt;Because it all works in Arrow, which is standard for tabular data, adding support for new types of files that can be read into the Arrow format is extremely easy. Vortex, Lance, or whichever other format becomes relevant. But that is not all…&lt;/p&gt;
&lt;p&gt;The existing SQLite support is made possible through &lt;a href="https://arrow.apache.org/adbc/"&gt;ADBC&lt;/a&gt;, an SQL connector that reads databases into Arrow format. SQLite databases fit into single files, which fit the abstraction used in Arbalister, but ADBC could also be used to add general database exploration (Postgres &lt;em&gt;etc&lt;/em&gt;.) into Arbalister. With Datafusion, we could also add visualization for data lakehouses: partitioned datasets (&lt;em&gt;e.g.&lt;/em&gt; &lt;a href="https://delta.io/"&gt;DeltaLake&lt;/a&gt; or &lt;a href="https://iceberg.apache.org/"&gt;Apache Iceberg&lt;/a&gt;) over remote object storage (S3). With Intelligent predicate and projections pushdowns, we could visualize remote tera-byte table instantly by only downloading the relevant parts.&lt;/p&gt;
&lt;h2 id="looking-further"&gt;Looking further&lt;/h2&gt;
&lt;p&gt;There are multiple things that would make great improvements to Arbalister. We have already mentioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Optional support for newer file types: Vortex, Lance;&lt;/li&gt;
&lt;li&gt;Object storage and data lakehouses support;&lt;/li&gt;
&lt;li&gt;SQL databases support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another direction is support for &lt;a href="https://jupyterlite.readthedocs.io/en/stable/"&gt;JupyterLite&lt;/a&gt;, a &lt;a href="https://webassembly.org/"&gt;WebAssembly&lt;/a&gt; distribution of JupyterLab running entirely in the browser. This setting is great for education because it does not require more than a static file server to host.&lt;br&gt;
Being able to work directly with Parquet files in the browser is great for making dashboard and interactive demonstrations. Arrow and Datafusion already have some experimental support for WebAssembly so this is not so far-fetched.&lt;/p&gt;
&lt;p&gt;Finally Arbalister could use a few features to investigate deeper questions about the data. For instance, beyond the &lt;em&gt;What does the data look like?&lt;/em&gt; question, some column filters could help answer questions such as &lt;em&gt;What does the data look like in November 2024 for John Doe?&lt;/em&gt; Perhaps even an SQL console for more advanced queries.&lt;/p&gt;
&lt;h2 id="an-extension-point"&gt;An extension point&lt;/h2&gt;
&lt;p&gt;The server extension being only a way to serve Arrow data, it can be reused by other libraries to use it in other ways. For instance, if we knew that our table contains time-series data, a second viewer could display it as a graph.&lt;br&gt;
Similarly for geospatial data.&lt;/p&gt;
&lt;p&gt;If you are interested to use or contribute to Arbalister, head to &lt;a href="https://github.com/QuantStack/Arbalister"&gt;our GitHub&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;Antoine Prouvost is a senior scientific software engineer at QuantStack. His work on Arbalister was funded by Bloomberg.&lt;/p&gt;
</content><category term="JupyterLab"/><category term="visualization"/></entry><entry><title>A Jupyter kernel for GNU Octave</title><link href="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/" rel="alternate"/><published>2023-01-11T17:33:00+00:00</published><updated>2023-01-11T17:33:00+00:00</updated><author><name>Giulio Girardi</name></author><id>tag:jupyter.org,2023-01-11:/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/</id><summary type="html">&lt;p&gt;Today, we are happy to announce the xeus-octave project, a Jupyter kernel for GNU Octave.&lt;/p&gt;
</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/001-0__HZJpXD-awr4mPDG.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;GNU Octave is a long-standing member of the scientific computing ecosystem, featuring a mathematics-oriented syntax with built-in 2D/3D plotting and visualization tools, and compatible with the Matlab syntax. It is a natural candidate for high-quality integration in the Jupyter ecosystem.&lt;/p&gt;
&lt;p&gt;Jupyter has been devised with language agnosticism in mind since it was spun off from the IPython project. The Kernel (the part of the infrastructure responsible for executing the code input by the user) is a key extension point to Jupyter, and dozens of language kernels exist in the ecosystem.&lt;/p&gt;
&lt;p&gt;Prior art on Jupyter / GNU Octave integration includes the &lt;a href="https://github.com/Calysto/octave_kernel"&gt;Calysto/Octave_kernel&lt;/a&gt; project by Steven Silvester (who is also a core Jupyter maintainer and the co-creator of JupyterLab). This existing kernel is part of the family of kernels built on top of the &lt;a href="https://github.com/ipython/ipykernel"&gt;ipykernel&lt;/a&gt; reference implementation of the Jupyter protocol, in Python.&lt;/p&gt;
&lt;p&gt;Today, we are happy to announce the &lt;a href="https://github.com/jupyter-xeus/xeus-octave/"&gt;xeus-octave&lt;/a&gt; project, a Jupyter kernel for GNU Octave. Xeus-octave was created by &lt;a href="http://rapgenic.it/"&gt;Giulio Girardi&lt;/a&gt;, recently joined by &lt;a href="https://twitter.com/AntoineProuvost"&gt;Antoine Prouvost&lt;/a&gt; — and has been incorporated into the Project Jupyter governance.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/002-0__YEF9gl4rxnapBiz.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Xeus-octave is built upon the &lt;a href="https://github.com/jupyter-xeus/xeus"&gt;Xeus&lt;/a&gt; library, a C++ implementation of the Jupyter kernel protocol that enables fast development of new kernels using programming languages’ native APIs, unlocking new possibilities without parsing standard outputs or requiring a Python interpreter at runtime. After all, a Jupyter kernel is merely an executable providing a well-defined communication protocol. It is not bound to Python APIs.&lt;/p&gt;
&lt;h2 id="a-fully-featured-kernel"&gt;A fully-featured kernel&lt;/h2&gt;
&lt;p&gt;We strove to make the xeus-octave kernel as complete as possible for this first iteration.&lt;/p&gt;
&lt;h3 id="multiple-graphical-toolkits"&gt;Multiple graphical toolkits&lt;/h3&gt;
&lt;h4 id="notebook"&gt;Notebook&lt;/h4&gt;
&lt;p&gt;A &lt;code&gt;notebook&lt;/code&gt; Octave graphical toolkit can be used to render plots natively, and present the figure as an image in the notebook.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of GNU Octave in action in Jupyter with the native Octave plots" src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/003-0_0tfvTOYDrjvK6SyO.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The classic Octave sombrero plot rendered as an image inside the notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id="plotly"&gt;Plotly&lt;/h4&gt;
&lt;p&gt;An experimental &lt;code&gt;plotly&lt;/code&gt; Octave graphical toolkit can also use &lt;a href="https://plotly.com/"&gt;Plotly&lt;/a&gt; to render code in the browser, with dynamic views, zooms, and hover tooltips.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of GNU Octave in action in Jupyter with the Plotly plots" src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/004-0_ZT86_erLnKUyRvP4.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Multiple plots rendered in a single plotly figure&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="rich-display"&gt;Rich display&lt;/h3&gt;
&lt;p&gt;The kernel binds with the C++ interface of GNU Octave to provide a complete Octave experience. Having access to the exact internal type of the objects, xeus-octave can present data with rich output.&lt;/p&gt;
&lt;p&gt;Matrices can be presented as HTML or LaTeX tables.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/005-0_015CLZOO-yfxSRSe.webp" alt="Screenshot of GNU Octave in action in Jupyter with the rich rendering of matrices" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Symbolic expressions can be presented as LaTeX formulas.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/006-0_U-Nxc_9FqhxARiGF.webp" alt="Screenshot of GNU Octave in action in Jupyter with the rich rendering of equations" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Structured data can be visualized as interactive tree views&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/007-0_oshl__rdb1-OtfCM.webp" alt="Screenshot of GNU Octave in action in Jupyter with the rich rendering of Octave structured data as interactive tree views." loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h3 id="interactive-help"&gt;Interactive help&lt;/h3&gt;
&lt;p&gt;Formatted help, extracted from the GNU Octave reference manual, can be queried using the &lt;code&gt;?&lt;/code&gt; syntax.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/008-0_zQcXBUjgbwqY0IHG.webp" alt="Screenshot of GNU Octave in action in Jupyter with the interactive help displayed in an output cell" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="trying-it-online"&gt;Trying it online&lt;/h2&gt;
&lt;p&gt;You can try the new Jupyter kernel for GNU Octave by clicking on the link below:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://mybinder.org/v2/gh/jupyter-xeus/xeus-octave/stable?urlpath=/lab/tree/notebooks/xeus-octave.ipynb"&gt;&lt;img src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/009-0_SDB4IuVwEGuk2yz1.webp" alt="Logo of Binder" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Binder linked above includes examples of notebooks in the fields of Electronics, demonstrating the usability of xeus-octave in real-life complex scenarios.&lt;/p&gt;
&lt;p&gt;This interactive demo is also featured on the Jupyter website at &lt;a href="https://jupyter.org/try#kernels"&gt;https://jupyter.org/try#kernels&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="installing-xeus-octave"&gt;Installing xeus-octave&lt;/h2&gt;
&lt;p&gt;Xeus-octave has been packaged on conda-forge and can be installed with mamba or conda.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;mamba&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;xeus-octave&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;conda-forge
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="future-work"&gt;Future Work&lt;/h2&gt;
&lt;p&gt;In future iterations, we will work towards consolidating the xeus-octave experience, by adding cell magics and improving the Plotly integration.&lt;/p&gt;
&lt;p&gt;A major ongoing development is the implementation of an Octave backend for Jupyter interactive widgets, based on the &lt;a href="https://github.com/jupyter-xeus/xwidgets"&gt;xwidgets&lt;/a&gt; project. Combined with &lt;a href="https://github.com/voila-dashboards/voila"&gt;Voilà&lt;/a&gt;, it will be possible to use GNU Octave to create standalone web dashboards.&lt;/p&gt;
&lt;p&gt;Another ongoing endeavor is to port a growing portion of the scientific computing stack to WebAssembly (using the emscripten-forge project). Producing a Wasm build of GNU Octave will enable its use with &lt;a href="https://github.com/jupyterlite/jupyterlite"&gt;Jupyterlite&lt;/a&gt;, enabling large-scale deployments on websites, blogs, and arbitrary web pages without any need for scalable cloud infrastructure.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/010-1_h3ZtdyQicGecxGFPkc3tYQ.jpeg" alt="Headshot of Antoine Prouvost" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/AntoineProuvost"&gt;Antoine Prouvost&lt;/a&gt; is a Scientific Software Engineer at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; and a xeus-octave maintainer. Previously, Antoine was researching Machine Learning and Combinatorial Optimization at the &lt;a href="https://twitter.com/DS4DM"&gt;DS4DM&lt;/a&gt; research chair and &lt;a href="https://twitter.com/MILAMontreal"&gt;Mila&lt;/a&gt;.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2023/a-jupyter-kernel-for-gnu-octave/images/011-1_vUpNORkYEpszm-vTZoSXwg.jpeg" alt="Headshot of Giulio Girardi" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://rapgenic.it/"&gt;Giulio Girardi&lt;/a&gt; is a Master’s degree student in Electronic Engineering at the &lt;a href="https://twitter.com/UniPadova"&gt;UNIPD&lt;/a&gt;, currently working as an Electronic Engineer at &lt;a href="http://protechgroup.it/"&gt;Protech Engineering&lt;/a&gt;. Giulio is the creator and a maintainer of the xeus-octave project.&lt;/p&gt;
</content><category term="kernels"/></entry></feed>