pandas との主な違い
DataStore は pandas と非常に高い互換性がありますが、理解しておくべき重要な違いがいくつか存在します。
概要表
| 観点 | pandas | DataStore |
|---|---|---|
| 実行方式 | Eager(即時実行) | Lazy(遅延実行) |
| 戻り値の型 | DataFrame/Series | DataStore/ColumnExpr |
| 行の順序 | 保持される | 保持される(自動);performance mode では保証されない |
| inplace | サポートあり | サポートなし |
| 索引 | フルサポート | 簡略化 |
| メモリ | すべてのデータをメモリ上に保持 | データはソース側に保持 |
1. 遅延評価と即時評価
pandas(即時評価)
処理はその場で即時に実行されます:
DataStore(遅延評価)
処理は、結果が必要になるまで実行されません。
なぜ重要なのか
遅延実行によって、次のことが可能になります:
- クエリの最適化: 複数の操作を1つのSQLクエリにコンパイルできる
- カラムのプルーニング: 必要なカラムだけを読み込む
- フィルターのプッシュダウン: フィルターをデータソース側で適用する
- メモリ効率: 不要なデータを読み込まない
2. 戻り値の型
pandas
DataStore
pandas 型への変換
3. 実行トリガー
DataStore は、実際の値が必要になったタイミングで評価されます:
| Trigger | Example | Notes |
|---|---|---|
print() / repr() | print(ds) | 表示のためにデータが必要 |
len() | len(ds) | 行数が必要 |
.columns | ds.columns | カラム名が必要 |
.dtypes | ds.dtypes | 型情報が必要 |
.shape | ds.shape | 次元情報が必要 |
.values | ds.values | 実データが必要 |
.index | ds.index | 索引が必要 |
to_df() | ds.to_df() | 明示的な変換が必要 |
| Iteration | for row in ds | 反復処理が必要 |
equals() | ds.equals(other) | 比較が必要 |
遅延評価のまま残る操作
| Operation | 戻り値 |
|---|---|
filter() | DataStore |
select() | DataStore |
sort() | DataStore |
groupby() | LazyGroupBy |
join() | DataStore |
ds['col'] | ColumnExpr |
ds[['a', 'b']] | DataStore |
ds[condition] | DataStore |
4. 行順序
pandas
行の順序は常に保持されます。
DataStore
多くの操作において、行の順序は自動的に保たれます。
DataStore は内部で元の行の位置を自動的に追跡(rowNumberInAllBlocks() を使用)し、pandas と同じ順序が保たれるようにします。
順序が保持される場合
- ファイルソース(CSV、Parquet、JSON など)
- pandas DataFrame のソース
- フィルター操作
- カラム選択
- 明示的に
sort()またはsort_values()を実行した後 - 順序を定義する操作(
nlargest()、nsmallest()、head()、tail())
順序が異なる場合
groupby()集計の後(sort_values()を使用して順序を一貫させる)- 特定の結合タイプでの
merge()/join()の後 - performance mode(
config.use_performance_mode())では、いかなる操作においても行の順序は保証されません。Performance Mode を参照してください。
5. inplace パラメーターは存在しない
pandas
DataStore
inplace=True はサポートされていません。必ず結果を変数に代入してください:
なぜ in-place 操作がないのか?
DataStore は次のことを可能にするために、イミュータブルな操作を採用しています:
- クエリ構築(遅延評価)
- スレッドセーフ
- デバッグの容易さ
- よりクリーンなコード
6. 索引のサポート
pandas
索引を完全にサポート:
DataStore
簡易的な索引サポート:
DataStore のソースが重要
- DataFrame ソース: pandas の索引を保持します
- ファイル ソース: 単純な整数の索引を使用します
7. 比較時の挙動
pandas との比較
pandas は DataStore オブジェクトを認識できません。
equals() の利用
8. 型推論
pandas
numpy/pandas の型を利用します。
DataStore
ClickHouse のデータ型を使用できます:
明示的キャスト
9. メモリモデル
pandas
すべてのデータはメモリ上に常駐します:
DataStore
データは、必要になるまで元のデータソース上にとどまります:
10. エラーメッセージ
エラー発生元の種類
- pandas errors: pandas ライブラリに起因するエラー
- DataStore errors: chDB または ClickHouse に起因するエラー
デバッグのヒント
マイグレーションチェックリスト
pandas から移行する際は次を確認・実施してください:
- import 文を変更する
-
inplace=Trueパラメータを削除する - pandas の DataFrame が必要な箇所に明示的に
to_df()を追加する - 行の順序が重要な場合はソートを追加する
- 比較テストには
to_pandas()を使用する - 代表的なデータ量でテストする
クイックリファレンス
| pandas | DataStore |
|---|---|
df[condition] | 同様(DataStore を返す) |
df.groupby() | 同様(LazyGroupBy を返す) |
df.drop(inplace=True) | ds = ds.drop() |
df.equals(other) | ds.to_pandas().equals(other) |
df.loc['label'] | ds.to_df().loc['label'] |
print(df) | 同様(実行をトリガーする) |
len(df) | 同様(実行をトリガーする) |