σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academyالمسارات
Ctrl K
AO
+1.2k متعلّم
تسجيل الدخولانضم ↗
المسارات
AO
+1.2k متعلّم
تسجيل الدخول
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
مسار Python›الوحدة 2 · NumPy وpandas لبيانات السوق›الموضوع 2.6·~45 دمبتدئ

إطارات بيانات pandas

الموضع في المسارالوحدة 2 من 11 · الموضوع 6 من 20
2.6 إطارات بيانات pandas
—درجة المختبر— / 100إجمالي XP—التتابع—

جدول من أعمدة موسومة

إطار البيانات (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.25
import 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 نقطة
المستكشف · lab-39-1
▾ lab-39-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-39-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

هل تريد إعادة ضبط هذا الموضوع؟

سيعود كل ما في lab-39-1 إلى الملفات الابتدائية وستُمسح الطرفية. ستفقد حلّك الحالي ولا يمكن التراجع عن ذلك.

سيُعاد ضبطه
  • main.py ← الشيفرة الابتدائية
  • سجل الطرفية ومخرجات الاختبارات
  • التغييرات غير المُرسلة
سيُحتفظ به
  • أفضل درجة في المختبر
  • نقاط XP والتتابع
  • تقدّم المحاضرة والملاحظات

سجّل الدخول لتشغيل الكود الخاص بك.

قراءة كل المحاضرات مجانية. أنشئ حسابًا أو سجّل الدخول لتشغيل الكود وتنفيذ الاختبارات وتسليم هذا المختبر.

  • بيئة تطوير داخل المتصفح مع طرفية bash — لا حاجة لتثبيت أي شيء
  • تصحيح فوري ونقاط خبرة ومكانك في المسار
إنشاء حسابتسجيل الدخول
أو
المتابعة عبر GitHub