Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

الترحيل من pandas

يساعدك هذا الدليل على ترحيل شيفرة 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.dayofweek

عمليات الإدخال والإخراج

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.DataFrame

DataStore:

# 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 execution

2. أنواع القيم المعادة

العملية ما يعيده 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 result

4. مقارنة كائنات 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: DataFrame وعمليات pandas

إذا كنت بحاجة إلى وظائف خاصة بـ 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 مقدار التسريع
Count في GroupBy 347ms 17ms 19.93x
مسار معالجة معقّد 2,047ms 380ms 5.39x
تصفية+فرز+Head 1,537ms 350ms 4.40x
Agg في GroupBy 406ms 141ms 2.88x

اختبار أداء على 10 ملايين صف


استكشاف مشكلات الترحيل وإصلاحها

المشكلة: العملية لا تعمل

قد لا تكون بعض عمليات pandas مدعومة. تحقّق مما يلي:

  1. هل العملية مُدرجة في قائمة التوافق؟
  2. جرّب التحويل إلى 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')

استراتيجية الترحيل التدريجي

الأسبوع الأول: اختبار التوافق

# 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)

الأسبوع الرابع: الترحيل الكامل

حوّل جميع النصوص البرمجية إلى الاستيراد من 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)

هل يمكنني استخدام DataStore في Jupyter؟

نعم! يعمل DataStore في دفاتر ملاحظات Jupyter:

from chdb import datastore as pd

ds = pd.read_csv("data.csv")
ds.head()  # Displays nicely in Jupyter

كيف أبلّغ عن المشكلات؟

إذا واجهت مشكلات في التوافق، فأبلِغ عنها على: https://github.com/chdb-io/chdb/issues

Navigation