جدول من أعمدة موسومة
إطار البيانات (DataFrame) جدول ثنائي الأبعاد: مجموعة أعمدة كل منها سلسلة تتشارك فهرسًا واحدًا من وسوم الصفوف. وهو حصان العمل في تحليل بيانات السوق: صف لكل رمز أو يوم وعمود لكل حقل (السعر والحجم والعائد). يُبنى من قاموس أعمدة pd.DataFrame({"price": [...], "volume": [...]}, index=symbols) أو من قائمة قواميس صفوف. ولكل عمود dtype خاص (الأسعار float64 والأحجام int64) بخلاف مصفوفة NumPy ذات dtype واحد للجميع.
import pandas as pd
df = pd.DataFrame(
{"price": [184.25, 410.2, 171.0], "volume": [200, 50, 300]},
index=["AAPL", "MSFT", "GOOG"],
)
print(df)
# price volume
# AAPL 184.25 200
# MSFT 410.20 50
# GOOG 171.00 300
print(df.shape, df.columns.tolist()) # (3, 2) ['price', 'volume']
print(df.dtypes.astype(str).to_dict()) # {'price': 'float64', 'volume': 'int64'}
rows = [{"symbol": "AAPL", "price": 184.25}, {"symbol": "MSFT", "price": 410.2}]
print(pd.DataFrame(rows)) # from a list of row dictionaries
# symbol price
# 0 AAPL 184.25
# 1 MSFT 410.20الأعمدة والأعمدة الجديدة والصفوف المُرشَّحة
df["price"] عمود واحد، أي سلسلة؛ وdf[["price"]] بقائمة هو إطار من عمود واحد. ويأتي العمود الجديد من حساب على الأعمدة: df.assign(notional=df["price"] * df["volume"]) تُرجع إطارًا جديدًا بالعمود الإضافي وتترك df كما هو (أما كتابة df["notional"] = ... فتعدّل df نفسه). والشرط المنطقي على عمود يرشّح الصفوف df[df["volume"] >= 100]، وتُرتّبها df.sort_values("volume", ascending=False) ويحتفظ .head(n) بأول n. وكل هذا يعمل على أعمدة كاملة دفعة واحدة: لا تدر على الصفوف بـiterrows() حين توجد عملية على العمود.
import pandas as pd
df = pd.DataFrame(
{"price": [184.25, 410.2, 171.0], "volume": [200, 50, 300]},
index=["AAPL", "MSFT", "GOOG"],
)
bigger = df.assign(notional=df["price"] * df["volume"]) # a new frame
print(bigger)
# price volume notional
# AAPL 184.25 200 36850.0
# MSFT 410.20 50 20510.0
# GOOG 171.00 300 51300.0
print(df.columns.tolist()) # ['price', 'volume'] df is unchanged
print(df[df["volume"] >= 100]) # rows that pass the test
# price volume
# AAPL 184.25 200
# GOOG 171.00 300
print(df.sort_values("volume", ascending=False).head(2)) # the two biggest volumes
# price volume
# GOOG 171.00 300
# AAPL 184.25 200الملخصات ونظرة على البيانات
انظر دائمًا إلى الجدول قبل أن تثق به. يعرض df.head() الصفوف الأولى، ويعطي df.shape القيمة (صفوف, أعمدة)، ويسرد df.dtypes نوع كل عمود، ويعدّ df.isna().sum() القيم المفقودة لكل عمود، ويلخّص df.describe() الأعمدة العددية (العدد والمتوسط والانحراف المعياري والحد الأدنى والأرباع والحد الأقصى). وتعطي دوال الأعمدة مثل df.mean() قيمة لكل عمود؛ وdf.sum(axis=1) قيمة لكل صف. ووجود dtype من نوع object أو str حيث توقعت أرقامًا يعني غالبًا أن نصًا تسلل إلى العمود.
import pandas as pd
df = pd.DataFrame(
{"price": [184.25, 410.2, 171.0], "volume": [200, 50, 300]},
index=["AAPL", "MSFT", "GOOG"],
)
print(df.describe().loc[["count", "mean", "max"]])
# price volume
# count 3.00 3.000000
# mean 255.15 183.333333
# max 410.20 300.000000
print(df.mean().to_dict()) # {'price': 255.15, 'volume': 183.33333333333334}
print(df.sum(axis=1).tolist()) # [384.25, 460.2, 471.0] one value per row
print(df.isna().sum().to_dict()) # {'price': 0, 'volume': 0}
# Changing a copy never changes the original (pandas 3 copies on write)
cheap = df[df["price"] < 200].copy()
cheap.loc["AAPL", "price"] = 0.0
print(df.loc["AAPL", "price"]) # 184.25import pandas as pd
rows = [
{"symbol": "AAPL", "price": 184.25, "volume": 200},
{"symbol": "MSFT", "price": 410.2, "volume": 50},
]
df = pd.DataFrame(rows).set_index("symbol") # make a column the row labels
print(df)
# price volume
# symbol
# AAPL 184.25 200
# MSFT 410.20 50
print(df.rename(columns={"price": "px"}).columns.tolist()) # ['px', 'volume']
print(df.drop(columns="volume").columns.tolist()) # ['price']
print(df.reset_index().columns.tolist()) # ['symbol', 'price', 'volume']assign والترشيح المنطقي وsort_values فكلها تُرجع إطارات جديدة. والخطأ الكلاسيكي كتابة عمود جديد في الوسيط فيُضاف بصمت إلى جدول المستدعي. وتقارن اختبارات المختبر الوسيط قبل وبعد لهذا السبب بالتحديد.pd.DataFrame({column: values}, index=labels)؛ وdf["c"]سلسلة وdf[["c"]]إطار؛ ولكل عمود dtype خاص.assignتضيف عمودًا إلى إطار جديد؛ وdf[mask]ترشّح الصفوف؛ وsort_values(...).head(n)تختار أعلى n.- انظر أولًا:
shapeوdtypesوhead()وdescribe()وisna().sum()؛ ولا تعدّل إطار المستدعي.
التالي: اختيار البيانات بـloc وiloc، الطريقتان الدقيقتان لانتقاء الصفوف والأعمدة بالوسم أو بالموضع.
المختبر: ما الذي يُقيَّم
- ابنِ جدول أسعار وأحجام باستخدام
make_frame25 نقطة - أضف عمود القيمة المتداولة باستخدام
add_notional25 نقطة - احتفظ بالصفوف السائلة فقط باستخدام
filter_liquid25 نقطة - رتّب الصفوف حسب أي عمود باستخدام
top_by25 نقطة