يساعدك هذا الدليل على ترحيل شيفرة 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.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: 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 مدعومة. تحقّق مما يلي:
- هل العملية مُدرجة في قائمة التوافق؟
- جرّب التحويل إلى 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