Ключевые отличия от pandas
Хотя DataStore в значительной степени совместим с pandas, важно понимать некоторые важные отличия.
Сводная таблица
| Аспект | pandas | DataStore |
|---|---|---|
| Выполнение | Раннее (немедленное) | Отложенное (ленивое) |
| Типы возвращаемых значений | DataFrame/Series | DataStore/ColumnExpr |
| Порядок строк | Сохраняется | Сохраняется (автоматически); не гарантируется в режиме производительности |
| inplace | Поддерживается | Не поддерживается |
| Индекс | Полная поддержка | Упрощённая |
| Память | Все данные в памяти | Данные остаются у источника |
1. Ленивое vs немедленное выполнение
pandas (жадное выполнение)
Операции выполняются немедленно:
DataStore (ленивый режим)
Операции выполняются только тогда, когда требуются результаты.
Почему это важно
Ленивое выполнение позволяет:
- Оптимизацию запросов: несколько операций объединяются в один SQL-запрос
- Отсечение столбцов: считываются только необходимые столбцы
- Проталкивание фильтров: фильтры применяются на стороне источника данных
- Более эффективное использование памяти: данные, которые не нужны, не загружаются
2. Типы возвращаемых значений
pandas
Хранилище данных (DataStore)
Преобразование в типы данных pandas
3. Триггеры выполнения
DataStore выполняет вычисления, когда вам нужны фактические значения:
| Триггер | Пример | Примечания |
|---|---|---|
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
Порядок строк автоматически сохраняется при большинстве операций:
DataStore автоматически отслеживает исходные позиции строк во внутреннем представлении (используя rowNumberInAllBlocks()), чтобы порядок соответствовал порядку в pandas.
Когда порядок сохраняется
- Источники из файлов (CSV, Parquet, JSON и т. д.)
- Источники pandas DataFrame
- Операции фильтрации
- Выбор столбцов
- После явного вызова
sort()илиsort_values() - Операции, задающие порядок (
nlargest(),nsmallest(),head(),tail())
Когда порядок может отличаться
- После агрегаций с
groupby()(используйтеsort_values()для обеспечения детерминированного порядка) - После
merge()/join()с определёнными типами соединений - В режиме производительности (
config.use_performance_mode()): порядок строк не гарантируется ни для каких операций. См. Режим производительности.
5. Отсутствие параметра inplace
pandas
DataStore
inplace=True не поддерживается. Всегда присваивайте результат:
Почему нет inplace?
DataStore использует неизменяемые операции для:
- построения запросов (ленивое вычисление)
- потокобезопасности
- более простой отладки
- более чистого кода
6. Поддержка индексов
pandas
Полная поддержка индексов:
DataStore
Упрощённая поддержка индексов:
Важно, какой источник DataStore используется
- Источник DataFrame: сохраняет индекс pandas
- Файловый источник: использует простой целочисленный индекс
7. Поведение при сравнении
Сравнение с pandas
pandas не распознаёт объекты типа DataStore:
Использование метода equals()
8. Вывод типов
pandas
Используются типы numpy/pandas:
DataStore
Может использовать типы данных ClickHouse:
Явное приведение типов
9. Модель памяти
pandas
Все данные хранятся в памяти:
DataStore
Данные остаются в исходном источнике до тех пор, пока не понадобятся:
10. Сообщения об ошибках
Различные источники ошибок
- ошибки pandas: из библиотеки pandas
- ошибки DataStore: из chDB или ClickHouse
Рекомендации по отладке
Контрольный список миграции
При миграции с pandas:
- Измените инструкцию
import - Удалите параметры
inplace=True - Добавьте явный вызов
to_df(), когда требуется pandas DataFrame - Добавьте сортировку, если важен порядок строк
- Используйте
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) | Аналогично (запускает выполнение) |