このガイドでは、互換性を維持しながら、既存の pandas コードを DataStore に移行してパフォーマンスを向上させる方法を説明します。
ワンライナーでの移行
最も簡単なのは、インポート文を変更するだけです:
# Before (pandas)
import pandas as pd
# After (DataStore)
from chdb import datastore as pd以上です!ほとんどの pandas コードはそのまま動作します。
段階的な移行
chDB をインストール
pip install "chdb>=4.0"インポートを変更
# これを:
import pandas as pd
# これに変更:
from chdb import datastore as pdコードをテスト
既存のコードを実行します。ほとんどの操作はそのまま動作します。
from chdb import datastore as pd
# これらはすべて同じように動作します
df = pd.read_csv("data.csv")
result = df[df['age'] > 25]
grouped = df.groupby('city')['salary'].mean()
df.to_csv("output.csv")相違点に対応
一部の操作は挙動が異なります。以下の主な違いを参照してください。
そのまま動作するもの
データの読み込み
# All these work the same
df = pd.read_csv("data.csv")
df = pd.read_parquet("data.parquet")
df = pd.read_json("data.json")
df = pd.read_excel("data.xlsx")フィルタリング
# Boolean indexing
df[df['age'] > 25]
df[(df['age'] > 25) & (df['city'] == 'NYC')]
# query() method
df.query('age > 25 and salary > 50000')選択範囲
# Column selection
df['name']
df[['name', 'age']]
# Row selection
df.head(10)
df.tail(10)
df.iloc[0:100]GroupBy と集計
# GroupBy
df.groupby('city')['salary'].mean()
df.groupby(['city', 'dept']).agg({'salary': ['sum', 'mean']})ソート
df.sort_values('salary', ascending=False)
df.sort_values(['city', 'age'])文字列操作
df['name'].str.upper()
df['name'].str.contains('John')
df['name'].str.len()DateTime の操作
df['date'].dt.year
df['date'].dt.month
df['date'].dt.dayofweekI/O 操作
df.to_csv("output.csv")
df.to_parquet("output.parquet")
df.to_json("output.json")主な違い
1. 遅延評価
DataStore の操作は遅延実行されるため、結果が必要になるまで実行されません。
pandas:
# Executes immediately
result = df[df['age'] > 25]
print(type(result)) # pandas.DataFrameDataStore:
# Builds query, doesn't execute yet
result = ds[ds['age'] > 25]
print(type(result)) # DataStore (lazy)
# Executes when you need the data
print(result) # Triggers execution
df = result.to_df() # Triggers execution2. 戻り値の型
| 操作 | pandas の戻り値 | DataStore の戻り値 |
|---|---|---|
df['col'] |
Series | ColumnExpr (遅延実行) |
df[['a', 'b']] |
DataFrame | DataStore (遅延実行) |
df[condition] |
DataFrame | DataStore (遅延実行) |
df.groupby('x') |
GroupBy | LazyGroupBy |
3. inplace パラメータはありません
DataStore は inplace=True をサポートしていません。必ず戻り値を使用してください。
pandas:
df.drop(columns=['col'], inplace=True)DataStore:
ds = ds.drop(columns=['col']) # Assign the result4. DataStore の比較
pandas は DataStore オブジェクトを認識しないため、比較するには to_pandas() を使用します。
# This may not work as expected
df == ds # pandas doesn't know DataStore
# Do this instead
df.equals(ds.to_pandas())5. 行の順序
DataStore では、ファイルソース (SQL データベースなど) の場合、行の順序が保持されないことがあります。明示的にソートしてください。
# pandas preserves order
df = pd.read_csv("data.csv")
# DataStore - use sort for guaranteed order
ds = pd.read_csv("data.csv")
ds = ds.sort('id') # Explicit ordering移行パターン
パターン 1: 読み込み・分析・書き込み
# pandas
import pandas as pd
df = pd.read_csv("data.csv")
result = df[df['amount'] > 100].groupby('category')['amount'].sum()
result.to_csv("output.csv")
# DataStore - same code works!
from chdb import datastore as pd
df = pd.read_csv("data.csv")
result = df[df['amount'] > 100].groupby('category')['amount'].sum()
result.to_csv("output.csv")パターン2: pandasで操作するDataFrame
pandas固有の機能が必要な場合は、最後に変換します:
from chdb import datastore as pd
# Fast DataStore operations
ds = pd.read_csv("large_data.csv")
ds = ds.filter(ds['date'] >= '2024-01-01')
ds = ds.filter(ds['amount'] > 100)
# Convert to pandas for specific features
df = ds.to_df()
df_pivoted = df.pivot_table(...) # pandas-specificパターン3: 混在ワークフロー
from chdb import datastore as pd
import pandas
# Start with DataStore for fast filtering
ds = pd.read_csv("huge_file.csv") # 10M rows
ds = ds.filter(ds['year'] == 2024) # Fast SQL filter
ds = ds.select('col1', 'col2', 'col3') # Column pruning
# Convert for pandas-specific operations
df = ds.to_df() # Now only ~100K rows
result = df.apply(complex_custom_function) # pandas性能比較
大規模なデータセットでは、DataStoreは大幅に高速です。
| 操作 | pandas | DataStore | 高速化倍率 |
|---|---|---|---|
| GroupBy count | 347ms | 17ms | 19.93x |
| 複雑なパイプライン | 2,047ms | 380ms | 5.39x |
| Filter+Sort+Head | 1,537ms | 350ms | 4.40x |
| GroupBy agg | 406ms | 141ms | 2.88x |
1,000万行でのベンチマーク
移行のトラブルシューティング
問題: 操作が機能しない
一部の pandas の操作はサポートされていないことがあります。次の点を確認してください。
- その操作は互換性リストに含まれていますか?
- まず pandas に変換してから試してください:
ds.to_df().operation()
問題: 結果が異なる
何が起きているかを把握するため、デバッグログを有効にします:
from chdb.datastore.config import config
config.enable_debug()
# View the SQL being generated
ds.filter(ds['x'] > 10).explain()問題: パフォーマンスが低い
実行パターンを確認してください。
# Bad: Multiple small executions
for i in range(1000):
result = ds.filter(ds['id'] == i).to_df()
# Good: Single execution
result = ds.filter(ds['id'].isin(ids)).to_df()問題: 型の不一致
DataStore では、型の推論結果が異なる場合があります:
# Check types
print(ds.dtypes)
# Force conversion
ds['col'] = ds['col'].astype('int64')段階的移行戦略
第1週: 互換性をテスト
# Keep both imports
import pandas as pd
from chdb import datastore as ds
# Compare results
pdf = pd.read_csv("data.csv")
dsf = ds.read_csv("data.csv")
# Verify they match
assert pdf.equals(dsf.to_pandas())第2週: 単純なスクリプトを移行する
まずは、次のようなスクリプトから始めます。
- 大きなファイルを読み込む
- フィルタリングと集約を行う
- カスタムの apply 関数を使用しない
第3週: 複雑なケースに対応
カスタム関数を含むスクリプトの場合:
from chdb import datastore as pd
# Let DataStore handle the heavy lifting
ds = pd.read_csv("data.csv")
ds = ds.filter(ds['year'] == 2024) # SQL
# Convert for custom work
df = ds.to_df()
result = df.apply(my_custom_function)第4週: 完全移行
すべてのスクリプトのインポートをDataStoreに切り替えます。
よくある質問
pandas と DataStore の両方を使用できますか?
はい。両者は自由に相互変換できます。
from chdb import datastore as ds
import pandas as pd
# DataStore to pandas
df = ds_result.to_pandas()
# pandas to DataStore
ds = ds.DataFrame(pd_result)テストはこれまでどおり通りますか?
ほとんどのテストは通るはずです。比較用のテストでは、pandas に変換してください:
def test_my_function():
result = my_function()
expected = pd.DataFrame(...)
pd.testing.assert_frame_equal(result.to_pandas(), expected)Jupyter で DataStore を使用できますか?
はい!DataStore は Jupyter ノートブックで利用できます。
from chdb import datastore as pd
ds = pd.read_csv("data.csv")
ds.head() # Displays nicely in Jupyterissue はどのように報告すればよいですか?
互換性に関する issue を見つけた場合は、以下で報告してください。 https://github.com/chdb-io/chdb/issues