σμ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.5·~40 دمبتدئ

سلاسل pandas

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

مصفوفة بوسوم

سلسلة pandas (Series) مصفوفة أحادية البُعد لكل قيمة فيها وسم محفوظ في فهرس السلسلة. وبدلًا من تذكّر أن الموضع 1 هو مايكروسوفت تطلب prices["MSFT"]. وللسلسلة name وdtype مثل مصفوفة NumPy، وتدعم الحساب نفسه على المصفوفات الكاملة، فتعمل prices * 2 وprices.mean() وprices > 180. وتُستورد pandas عُرفًا بـimport pandas as pd؛ وهي مبنية على NumPy التي رأيتها في الموضوعات السابقة.

import pandas as pd

prices = pd.Series([184.25, 410.2, 171.0], index=["AAPL", "MSFT", "GOOG"], name="price")
print(prices)
# AAPL    184.25
# MSFT    410.20
# GOOG    171.00
# Name: price, dtype: float64

print(prices["AAPL"], prices.iloc[1])    # 184.25 410.2   by label, by position
print(prices.index.tolist())             # ['AAPL', 'MSFT', 'GOOG']
print(prices[prices > 180])              # keeps AAPL and MSFT, labels intact
print(prices.mean(), prices.idxmax())    # 255.15 MSFT

# A dict also builds a Series: keys become the index
print(pd.Series({"AAPL": 1, "MSFT": 2}))

المحاذاة: العمليات تطابق الوسوم لا المواضع

عند الجمع بين سلسلتين تحاذيهما pandas بالوسوم أولًا. والوسوم الموجودة في إحداهما فقط تعطي NaN (ليس رقمًا، علامة القيمة المفقودة) في النتيجة، وفهرس النتيجة هو اتحاد الفهرسين. وهذا بالضبط ما تريده لمراكز محفوظة في حسابات مختلفة. استخدم a.add(b, fill_value=0) لمعاملة الوسم الغائب كصفر بدل إنتاج NaN. والقراءة بالوسم تختلف عن NumPy أيضًا: s["MSFT"] بالوسم، وs.iloc[1] بالموضع، والوسم غير الموجود يرفع KeyError.

import pandas as pd

a = pd.Series([100, 200], index=["AAPL", "MSFT"])
b = pd.Series([50, 10], index=["MSFT", "GOOG"])

print(a + b)
# AAPL      NaN
# GOOG      NaN
# MSFT    250.0

print(a.add(b, fill_value=0))
# AAPL    100.0
# GOOG     10.0
# MSFT    250.0

# Selecting by a list of labels, and asking for one that is missing
prices = pd.Series([184.25, 410.2], index=["AAPL", "MSFT"])
print(prices.reindex(["MSFT", "TSLA"]).tolist())   # [410.2, nan]

الفرز والترتيب وإعادة القاعدة

ترتّب s.sort_values(ascending=False) حسب القيمة وتحمل معها الوسوم، وترتّب s.sort_index() حسب الوسم، وتأخذ s.abs() القيم المطلقة. والترتيب مع التقطيع يجدان أكبر التحركات: r.abs().sort_values(ascending=False).index[:3] يعطي الوسوم الثلاثة ذات أكبر عائد مطلق. ولمقارنة أصول تتداول بمستويات أسعار مختلفة أعِد قاعدة كل منها إلى 100 عند البداية: s / s.iloc[0] * 100 التي تحتفظ بالفهرس والاسم. وتتجاهل sum وmean وأخواتها القيم المفقودة (NaN)؛ وs.isna() تحدّدها.

import pandas as pd

r = pd.Series([0.01, -0.03, 0.02], index=["x", "y", "z"])
print(r.abs().sort_values(ascending=False))
# y    0.03
# z    0.02
# x    0.01
# dtype: float64

prices = pd.Series([184.25, 410.2, 171.0], index=["AAPL", "MSFT", "GOOG"], name="price")
print(prices / prices.iloc[0] * 100)           # rebased to 100 at the first value
# AAPL    100.000000
# MSFT    222.632293
# GOOG     92.808684
# Name: price, dtype: float64

gappy = pd.Series([1.0, None, 3.0])
print(gappy.sum(), gappy.mean(), gappy.isna().tolist())   # 4.0 2.0 [False, True, False]
import pandas as pd

# A stray space and a lower-case letter make "the same" symbol two labels
raw = pd.Series([1, 2], index=["AAPL", "aapl "])
print(raw.index.is_unique)                     # True: they look different

raw.index = raw.index.str.strip().str.upper()  # clean the labels
print(raw.index.is_unique)                     # False: now both are "AAPL"
print(raw["AAPL"].tolist())                    # [1, 2]   a duplicate label returns a Series

merged = raw.groupby(level=0).sum()            # combine duplicates (groupby comes soon)
print(merged.to_dict())                        # {'AAPL': 3}
الوسوم بيانات أيضًا: التكرار والأخطاء الإملائيةالمحاذاة بقدر جودة الوسوم. فـ"AAPL" و"aapl " وسمان مختلفان، فيُنتج خطأ إملائي بصمت صفوف NaN؛ نظّف الوسوم (strip وupper) قبل الجمع. وقد يحوي الفهرس تكرارات فتُرجع s["AAPL"] سلسلة لا قيمة؛ افحص s.index.is_unique للبيانات التي يُفترض أن تحمل قيمة واحدة لكل وسم. وتُرجع العمليات سلاسل جديدة وتترك الأصل دون مساس، وهو السلوك الذي تفحصه اختبارات المختبر.
  • pd.Series(values, index=labels, name=...)؛ والقراءة بالوسم s["A"] أو الموضع s.iloc[0].
  • العمليات تحاذي بالوسوم (فهرس اتحاد وNaN للمفقود)؛ وa.add(b, fill_value=0) تعدّ الفجوة صفرًا.
  • sort_values وabs وidxmax وs / s.iloc[0] * 100؛ والنتائج سلاسل جديدة والأصل لا يتغير.

التالي: إطارات بيانات pandas (DataFrame)، جداول مكوَّنة من سلاسل تتشارك فهرسًا واحدًا.

المختبر: ما الذي يُقيَّم

  • ضع وسم الرمز على الأسعار باستخدام price_series25 نقطة
  • اجمع حسابين بالوسم باستخدام total_exposure25 نقطة
  • اعثر على أكبر التحركات باستخدام top_movers25 نقطة
  • اجعل كل سعر على قاعدة 100 باستخدام rebase_to_10025 نقطة
المستكشف · lab-38-1
▾ lab-38-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-38-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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