# Querying Hotdata with Ibis Source: https://www.hotdata.dev/blog/querying-hotdata-with-ibis Published: Sep 28, 2026 Author: Eddie A Tejeda Site index: https://www.hotdata.dev/llms.txt ![Hotdata + Ibis](/blog/querying-hotdata-with-ibis/cover.png) [Ibis](https://ibis-project.org) is a Python dataframe library that turns your expressions into SQL and runs them on a database. [`hotdata-ibis`](https://github.com/hotdata-dev/hotdata-ibis) adds Hotdata as one of those databases. You write Ibis code in Python, Hotdata does the work, and you get the results back as pandas or Arrow. ## What you can do You can handle the whole life of an instant database from Ibis: create it, upload a pandas DataFrame or Arrow table, query it, and drop it when you're finished. Queries can filter, select, join, group, aggregate, sort, and limit. `.execute()` gives you a pandas DataFrame, and `.to_pyarrow()` or `.to_pyarrow_batches()` give you Arrow. If you need SQL that Ibis doesn't cover, `con.sql(...)` runs it directly, and you can keep chaining Ibis expressions on top of the result. There are vector search helpers too. `semantic_search` writes its query in the shape Hotdata needs to use its HNSW vector index, so searches don't fall back to scanning the whole table. And if your data is in another database or warehouse today, you can [ingest it](/docs/pull-data) into an instant database first and then query it through Ibis like any other table. ## Creating, loading, and querying First, install the package: ```bash pip install hotdata-ibis ``` Then connect, create a database, and upload a DataFrame: ```python import time import ibis import pandas as pd con = ibis.hotdata.connect( api_url="https://api.hotdata.dev", token="YOUR_API_KEY", workspace_id="", ) db_id = con.create_database("sales", schema="public", tables=["orders"]) df = pd.DataFrame({ "order_id": [1, 2, 3], "amount": [9.99, 49.99, 5.00], "region": ["west", "east", "west"], }) con.create_table("orders", df, database=(db_id, "public"), overwrite=True) time.sleep(2) # uploads are async ``` Now you can query it with an Ibis expression: ```python t = con.table("orders", database=("default", "public")) result = ( t.group_by("region") .agg(total=t.amount.sum()) .order_by(ibis.desc("total")) .execute() ) ``` `create_database` returns the database id, which you'll use to load or drop tables. When querying, the catalog is always `"default"`. ## Try it out An easy way to start is with a DataFrame you already have. Upload it, then rewrite one of your pandas transformations in Ibis and let Hotdata run it. For more, see the [Ibis guide](/docs/ibis) for connection options, raw SQL, and querying existing sources, and the [repository](https://github.com/hotdata-dev/hotdata-ibis) for vector search and examples.