サマリー表
| 項目 | pandas | DataStore |
|---|---|---|
| 実行 | 即時実行 (即時) | 遅延実行 (遅延) |
| 戻り値の型 | DataFrame/Series | DataStore/ColumnExpr |
| 行順 | 維持される | 維持される (自動) 。ただし、performance mode では保証されない |
| inplace | サポートされる | サポートされない |
| 索引 | 完全対応 | 簡易的 |
| メモリ | すべてのデータがメモリ上にある | データはソース側に保持される |
1. 遅延実行と即時実行
pandas (即時実行)
DataStore (遅延実行)
これが重要な理由
- クエリ最適化: 複数の操作が1つのSQLクエリにまとめられます
- カラムの絞り込み: 必要なカラムだけが読み込まれます
- フィルタのプッシュダウン: フィルタがソース側で適用されます
- メモリ効率: 必要のないデータは読み込みません
2. 戻り値の型
pandas
DataStore
pandasのデータ型への変換
3. 実行トリガー
| トリガー | 例 | 注記 |
|---|---|---|
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() | 明示的な変換 |
| 反復処理 | for row in ds | 反復処理が必要 |
equals() | ds.equals(other) | 比較が必要 |
遅延実行のままの操作
| 操作 | 戻り値 |
|---|---|
filter() | DataStore |
select() | DataStore |
sort() | DataStore |
groupby() | LazyGroupBy |
join() | DataStore |
ds['col'] | ColumnExpr |
ds[['a', 'b']] | DataStore |
ds[condition] | DataStore |
4. 行の並び順
pandas
DataStore
rowNumberInAllBlocks() を使って) 自動的に追跡します。
順序が保持されるケース
- ファイルソース (CSV、Parquet、JSON など)
- pandas DataFrame ソース
- フィルタ処理
- カラムの選択
- 明示的に
sort()またはsort_values()を実行した後 - 順序を決定する操作 (
nlargest()、nsmallest()、head()、tail())
順序が変わる可能性がある場合
groupby()による集計の後 (順序を一定に保つにはsort_values()を使用してください)- 特定の join 型で
merge()/join()を実行した後 - performance mode (
config.use_performance_mode()) では、どの操作でも行の順序は保証されません。詳しくは Performance Mode を参照してください。
5. inplace パラメーターはありません
pandas
DataStore
inplace=True には対応していません。必ず結果を代入してください。
なぜ inplace はないのか?
- クエリの構築 (遅延評価)
- スレッドセーフ
- デバッグの容易化
- よりクリーンなコード
6. 索引のサポート
pandas
DataStore
DataStore ではソースの種類が重要です
- DataFrame ソース: pandas の索引を保持します
- File ソース: シンプルな整数索引を使用します
7. 比較時の挙動
pandas との比較
equals() の使用
8. 型推論
pandas
DataStore
明示的な型変換
9. メモリモデル
pandas
DataStore
10. エラーメッセージ
エラーの種類
- pandas errors: pandasライブラリに起因
- DataStore errors: chDB または ClickHouse に起因
デバッグのヒント
移行チェックリスト
- インポート文を変更する
-
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) | 同じ (実行がトリガーされる) |