کتابخونههای موردعلاقه من برای بررسی سریع داده
راستشو بخواین، وقتی یه دیتاست تازه میاد جلوی چشمم، دنبال تشریفات و کارای اضافه نیستم. دنبال وضوحم. اون یک ساعت اول، خیلی مهمتر از چیزیه که اکثر آدما فکر میکنن. باید خیلی سریع بفهمم زمین بازی چه شکلیه—کجا کثیف و بههمریختهست، کجا چیزای جالب داره، و اصلاً ارزش کندوکاو بیشتر داره یا نه.
یه بار اول کارم، نصف روز رو گذاشتم واسه درست کردن کلاستر، ساختن اسکیمای شیک و طراحی داشبورد… آخرش فهمیدم کل دیتاست حتی ارزشش رو هم نداشته! اینجاست که آدم میفهمه گاهی باید اول یه طرح کوچیک بکشه، یه لقمه بچشه، یا قبل دویدن کمی بدنشو گرم کنه. کار با داده هم همینطوره.
توی این سالها کلی ابزار امتحان کردم. ولی وقتی زمان تنگه یا کنجکاوی خیلی زور میزنه، همیشه برمیگردم به یه استک کوچیک و ساده که میدونم جواب میده. اینجا قراره همونو باهاتون شریک بشم: نه کاملترین لیست دنیا، بلکه اون چندتا ابزاری که واقعاً توی لحظه حیاتی به دادم رسیدن.
وقتی میگم «سریع»، منظورم چیه؟
سریع فقط یعنی عددای بنچمارک بالا نیست. برای من یعنی:
- از صفر تا اولین کوئری توی چند دقیقه. نه سر و کله زدن با سرور و تنظیمات عجیب.
- یه حد وسط منطقی. دیتاستهای ۱ تا ۱۰ گیگی روی لپتاپ جواب بدن.
- حلقههای تند و تیز. ببین → تغییر بده → رسم کن → اعتبار بگیر.
- سازگاری. همهچیز با Arrow به هم وصل، بیدردسر.
ابزار سریع باعث میشه توی «فلو» بمونم. میتونم قبل اینکه ایدهم فرار کنه دنبالش برم.
استک اصلی (۴ کتابخونهای که استفاده میکنم)
۱. Polars — موتور پیشفرض من برای DataFrame
Polars بیشتر از اینکه فقط «سریع» باشه، حس امنیت میده. میتونم میلیونها ردیف رو گروپ کنم یا جوین بزنم، بدون اینکه فکر کنم: «خب، حالا پنج دقیقه باید منتظر بمونم…»
۸۰٪ مواقع اولین انتخابمه: چه برای لود کردن Parquet یا CSV، چه برای فیلتر و جوین و آمار سریع. API تنبلش (lazy API) هم خودش هوشمندانه کوئری رو بهینه میکنه—انگار یکی پشت صحنه داره کدتو مرتب میکنه.
import polars as pl # Load Parquet file df = pl.read_parquet("events.parquet") # Quick filtering, grouping, and aggregation top_pages = ( df.filter(pl.col("country") == "DE") .group_by("page") .agg([ pl.len().alias("visits"), pl.col("dwell_time").mean().alias("avg_time") ]) .sort("visits", descending=True) .head(5) ) print(top_pages) # Lazy API for optimization lazy_df = df.lazy().filter(pl.col("country") == "US").group_by("device").count() print(lazy_df.collect())
۲. DuckDB — مثل SQLite، ولی برای تحلیل
DuckDB همون چیزیه که وقتی فقط میخوام یه نتیجه رو سریع چک کنم، نجاتم میده. بعضی وقتا SQL خیلی زودتر جواب میده تا کلی کد زدن.
میتونه مستقیم روی Parquet/CSV کوئری بزنه، چندتا فایل رو جوین کنه و راحت با Polars یا Pandas کار کنه. چیزی که بیشتر از همه دوست دارم؟ هیچ تشریفاتی نداره. میتونی همینطوری به یه فولدر فایل اشاره کنی و شروع کنی به سؤال پرسیدن.
import duckdb # Run SQL directly on Parquet files result = duckdb.sql(""" SELECT category, COUNT(*) AS n, AVG(price) AS avg_price FROM 'data/products/*.parquet' WHERE price > 0 GROUP BY category ORDER BY n DESC """) print(result.df()) # Convert to Pandas if needed # You can also query in-memory Polars/Pandas DataFrames import polars as pl df = pl.DataFrame({"a": [1, 2, 3], "b": ["x", "y", "z"]}) duckdb.query("SELECT a, b FROM df WHERE a > 1").show()
۳. PyArrow — اون چسب پنهانی
Arrow خیلی هیجانانگیز به نظر نمیاد، ولی بدون اون تقریباً همهچی سخت میشد. باهاش میتونی داده رو بین ابزارها رد و بدل کنی بدون اینکه هی تبدیل و کپی و لود کنی.
من معمولاً Arrow Table رو بهعنوان فرمت «اصلی» نگه میدارم. یه بار لود میکنم، فیلتر و اسلایس میزنم، بین کتابخونهها میچرخونم و فقط وقتی لازم باشه تبدیل میکنم. همین کوچیکه باعث میشه هم حافظه کمتر مصرف شه، هم اعصابم راحتتر باشه.
import pyarrow.parquet as pq import pyarrow.compute as pc # Load big parquet file into Arrow Table table = pq.read_table("big.parquet") # Filter with Arrow (zero-copy, very fast) filtered = table.filter(pc.equal(table["country"], "FI")) # Save subset pq.write_table(filtered, "big_fi.parquet", compression="zstd") # Convert to Polars directly import polars as pl pl_df = pl.from_arrow(filtered) print(pl_df.head())
۴. Plotly Express — ویژوال سریع برای sanity check
بررسی داده بدون ویژوال، مثل خوندن با یه چشم بستهست. نصف چیزا رو از دست میدی. Plotly Express برای من همون راه سادهست. یه خط کد میزنم و یه نمودار تعاملی دارم که میتونم روش زوم کنم یا با موس رد شم.
اینا داشبورد برای مدیرعامل نیستن؛ بیشتر یادداشتای شخصی خودمنن. یه هیستوگرام برای دیدن outlier، یه باکسپلات برای توزیع، یه لاینچارت برای پیدا کردن افت و خیزای عجیب. ساده، سریع و کار راهانداز.
import plotly.express as px import polars as pl # Sample data df = pl.DataFrame({ "country": ["DE", "DE", "FR", "FR", "US", "US"], "amount": [100, 120, 90, 110, 150, 130] }).to_pandas() # Plotly expects Pandas # Histogram fig1 = px.histogram(df, x="amount", nbins=5, title="Transaction Amounts") fig1.show() # Boxplot fig2 = px.box(df, x="country", y="amount", title="Spending by Country") fig2.show()
حلقه ۱۰ دقیقهای من
معمولاً اینجوری پیش میره:
۱. با Polars لود میکنم → شکل، نوع دادهها و چند ردیف اول رو میبینم.
2. یه خلاصه میگیرم با df.describe()
یا یه کوئری DuckDB.
3. دو سه تا نمودار با Plotly Express میکشم.
4. یه subset تمیز رو با Arrow/Parquet ذخیره میکنم برای مراحل بعدی.
بعد از ده دقیقه، نقشه کلی دستمه. میدونم کجا باید دقیقتر بشم، کجا نویزه، و اصلاً ارزش ادامه دادن داره یا نه.
عادتهای کوچیک که در طول زمان خیلی فرق میسازن
- همیشه Parquet رو به CSV ترجیح بده: سریعتر و کمحجمتر.
- نمونهگیری هوشمند:
duckdb.sql("SELECT * FROM 'big.parquet' USING SAMPLE 5%")
. - فیلتر رو بذار روی دوش Polars یا DuckDB، نه Pandas.
- از همون اول نوع داده درست انتخاب کن: دستهبندی/تاریخ → کار بعداً راحتتر.
این چیزا شاید کوچیک به نظر بیان، ولی توی طول ماهها و سالها، ساعتها وقت ذخیره میکنن.
چند کلمه آخر
بررسی داده بیشتر از اینکه یه فرآیند فنی باشه، یه جور حس کنجکاوی و راحتی کاره. ابزار درست فقط زمان رو ذخیره نمیکنه، بلکه کمک میکنه توی جریان بمونی.
اگه فقط بخوای دوتا ابزار انتخاب کنی، پیشنهاد من Polars و DuckDBه. یه مقدار Plotly Express اضافه کن واسه ویژوال، و بذار Arrow بیسروصدا همهچیزو بهم بچسبونه.
این استک ساده بارها و بارها نجاتم داده: چه موقعی که توی یه CSV شلوغ گیر کردم، چه موقعی که یه Parquet عظیم باید سریع خلاصه میشد، یا وقتی یه تحلیل فوری خواستن. کامل نیست، ولی منو توی حرکت نگه میداره—و بعضی وقتا همین کافیه.
کنجکاو بمونید، و سریع پیش برید.