Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the user has tabular data (pandas DataFrame, parquet, csv, Arrow, json) and wants to filter, group, aggregate, join, or speed up slow pandas. Provides chDB DataStore — same pandas API, ClickHouse engine underneath. Also handles reading from S3, MySQL, PostgreSQL, MongoDB, ClickHouse Cloud, Iceberg, Delta Lake as DataFrames and joining across sources. TRIGGER when: user mentions DataFrame, parquet, csv, "fast pandas", "speed up pandas", or cross-source DataFrame joins; user imports `chdb
.claude/skills/itamarzand88-chdb-datastore/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 8% | 0% |
<!-- source: chdb-datastore — https://raw.githubusercontent.com/chdb-io/chdb/main/agent/skills/chdb-datastore/SKILL.md -->
python# Change this: import pandas as pd # To this: import chdb.datastore as pd # Everything else stays the same.
DataStore is a lazy, ClickHouse-backed pandas replacement. Your existing pandas code works unchanged — but operations compile to optimized SQL and execute only when results are needed (e.g., print(), len(), iteration).
bashpip install chdb
1. "I have a file/database and want to analyze it with pandas"
→ DataStore.from_file() / from_mysql() / from_s3() etc.
→ See references/connectors.md
2. "I need to join data from different sources"
→ Create DataStores from each source, use .join()
→ See examples/examples.md #3-5
3. "My pandas code is too slow"
→ import chdb.datastore as pd — change one line, keep the rest
4. "I need raw SQL queries"
→ Use the chdb-sql skill insteadpythonfrom datastore import DataStore # Local file (auto-detects .parquet, .csv, .json, .arrow, .orc, .avro, .tsv, .xml) ds = DataStore.from_file("sales.parquet") # Database ds = DataStore.from_mysql(host="db:3306", database="shop", table="orders", user="root", password="pass") # Cloud storage ds = DataStore.from_s3("s3://bucket/data.parquet", nosign=True) # URI shorthand — auto-detects source type ds = DataStore.uri("mysql://root:pass@db:3306/shop/orders")
All 16+ sources and URI schemes → connectors.md
pythonresult = ds[ds["age"] > 25] # filter result = ds[["name", "city"]] # select columns result = ds.sort_values("revenue", ascending=False) # sort result = ds.groupby("dept")["salary"].mean() # groupby result = ds.assign(margin=lambda x: x["profit"] / x["revenue"]) # computed column ds["name"].str.upper() # string accessor ds["date"].dt.year # datetime accessor result = ds1.join(ds2, on="id") # join result = ds.head(10) # preview print(ds.to_sql()) # see generated SQL
209 DataFrame methods supported. Full API → api-reference.md
pythonfrom datastore import DataStore customers = DataStore.from_mysql(host="db:3306", database="crm", table="customers", user="root", password="pass") orders = DataStore.from_file("orders.parquet") result = (orders .join(customers, left_on="customer_id", right_on="id") .groupby("country") .agg({"amount": "sum", "rating": "mean"}) .sort_values("sum", ascending=False)) print(result)
More join examples → examples.md
pythonsource = DataStore.from_mysql(host="db:3306", database="shop", table="orders", user="root", password="pass") target = DataStore("file", path="summary.parquet", format="Parquet") target.insert_into("category", "total", "count").select_from( source.groupby("category").select("category", "sum(amount) AS total", "count() AS count") ).execute()
| Problem | Fix | |---------|-----| | ImportError: No module named 'chdb' | pip install chdb | | ImportError: cannot import 'DataStore' | Use from datastore import DataStore or from chdb.datastore import DataStore | | Database connection timeout | Include port in host: host="db:3306" not host="db" | | Join returns empty result | Check key types match (both int or both string); use .to_sql() to inspect | | Unexpected results | Call ds.to_sql() to see the generated SQL and debug | | Environment check | Run python agent/skills/chdb-datastore/scripts/verify_install.py |
> Note: This skill teaches how to use chdb DataStore. > For raw SQL queries, use the chdb-sql skill. > For contributing to chdb source code, see CLAUDE.md in the project root.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 12,073 | 6,875 | -43% | 1 | 1 | 0% | 2,638 | 2,702 | +2% | 0 | 0 | — |
case-02 | fail→pass | 8,519 | 4,654 | -45% | 1 | 1 | 0% | 1,893 | 2,402 | +27% | 0 | 0 | — |
case-03 | fail→pass | 9,675 | 3,591 | -63% | 1 | 1 | 0% | 2,070 | 2,115 | +2% | 0 | 0 | — |
case-04 | fail→pass | 7,121 | 2,545 | -64% | 1 | 1 | 0% | 1,482 | 1,815 | +22% | 0 | 0 | — |
case-05 | fail→pass | 7,926 | 2,841 | -64% | 1 | 1 | 0% | 1,717 | 1,847 | +8% | 0 | 0 | — |
case-06 | fail→pass | 15,477 | 1,771 | -89% | 1 | 1 | 0% | 3,158 | 1,674 | -47% | 0 | 0 | — |
case-07 | pass→pass | 9,491 | 2,082 | -78% | 1 | 1 | 0% | 2,029 | 1,781 | -12% | 0 | 0 | — |
case-12 | pass→pass | 4,491 | 2,291 | -49% | 1 | 1 | 0% | 920 | 1,748 | +90% | 0 | 0 | — |
case-08 | fail→pass | 12,519 | 2,207 | -82% | 1 | 1 | 0% | 2,532 | 1,773 | -30% | 0 | 0 | — |
case-09 | pass→pass | 3,862 | 2,899 | -25% | 1 | 1 | 0% | 656 | 1,909 | +191% | 0 | 0 | — |
case-10 | pass→pass | 6,402 | 3,372 | -47% | 1 | 1 | 0% | 1,277 | 1,964 | +54% | 0 | 0 | — |
case-11 | pass→pass | 4,068 | 2,568 | -37% | 1 | 1 | 0% | 903 | 1,837 | +103% | 0 | 0 | — |
case-13 | pass→pass | 3,690 | 2,605 | -29% | 1 | 1 | 0% | 818 | 1,815 | +122% | 0 | 0 | — |
case-14 | pass→pass | 5,033 | 1,928 | -62% | 1 | 1 | 0% | 1,109 | 1,714 | +55% | 0 | 0 | — |
case-15 | pass→pass | 7,319 | 3,334 | -54% | 1 | 1 | 0% | 1,633 | 2,070 | +27% | 0 | 0 | — |
case-16 | fail→pass | 10,706 | 1,481 | -86% | 1 | 1 | 0% | 2,122 | 1,583 | -25% | 0 | 0 | — |
case-17 | fail→pass | 4,492 | 2,019 | -55% | 1 | 1 | 0% | 875 | 1,699 | +94% | 0 | 0 | — |
case-18 | fail→pass | 5,384 | 3,198 | -41% | 1 | 1 | 0% | 1,204 | 2,031 | +69% | 0 | 0 | — |
case-19 | fail→pass | 9,200 | 3,055 | -67% | 1 | 1 | 0% | 1,783 | 1,963 | +10% | 0 | 0 | — |
case-20 | pass→pass | 7,919 | 3,129 | -60% | 1 | 1 | 0% | 1,643 | 2,011 | +22% | 0 | 0 | — |
case-21 | fail→pass | 16,498 | 4,523 | -73% | 1 | 1 | 0% | 979 | 2,244 | +129% | 0 | 0 | — |
case-22 | pass→pass | 10,147 | 5,674 | -44% | 1 | 1 | 0% | 2,075 | 2,448 | +18% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +55 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.