σμ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›الوحدة 1 · أساسيات Python للمحللين الكميين›الموضوع 1.17·~35 دمبتدئ

ملفات CSV

الموضع في المسارالوحدة 1 من 11 · الموضوع 17 من 33
1.17 ملفات CSV
—درجة المختبر— / 100إجمالي XP—التتابع—

الجداول كنص

يخزّن ملف CSV (قيم مفصولة بفواصل) جدولًا كنص: صف لكل سطر وخلايا مفصولة بفواصل، وغالبًا مع صف رأس يسمّي الأعمدة. تأتي سجلات الأسعار ودفاتر الصفقات وتصديرات أي أداة تقريبًا بهذا الشكل. يبدو تحليله سهلًا بـline.split(",")، لكن قد تحتوي الخلية نفسها على فاصلة، فتُحاط بعلامات اقتباس: AAPL,"Q3, adjusted". والتقسيم اليدوي يفشل هنا، فاستخدم الوحدة القياسية csv وافتح الملف بـnewline="" لتُعالَج فواصل الأسطر داخل الخلايا معالجة صحيحة.

import csv

# Write a small table with csv.writer
with open("prices.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["date", "symbol", "close", "note"])
    writer.writerow(["2025-01-02", "AAPL", 184.25, "Q3, adjusted"])
    writer.writerow(["2025-01-03", "AAPL", 185.5, ""])

# The comma inside the note is quoted for us
with open("prices.csv", encoding="utf-8") as file:
    print(file.read().splitlines()[1])  # 2025-01-02,AAPL,184.25,"Q3, adjusted"

قراءة الصفوف

تُنتج csv.reader(file) كل صف كـقائمة نصوص. أما csv.DictReader(file) فتقرأ الرأس أولًا ثم تنتج كل صف كـقاموس مفاتيحه أسماء الأعمدة، وهو أسهل قراءة ولا يتأثر بتغيير ترتيب الأعمدة. وفي الحالتين كل خلية نص: حوّلها بـfloat(...) أو int(...) قبل الحساب. مرّر delimiter=";" (أو "\t") للملفات التي تستخدم فاصلًا آخر.

import csv

# DictReader gives each row as a dict; cells are strings
closes = []
with open("prices.csv", newline="", encoding="utf-8") as file:
    for row in csv.DictReader(file):
        closes.append(float(row["close"]))
print(closes)  # [184.25, 185.5]

# csv.reader gives plain lists, header included
with open("prices.csv", newline="", encoding="utf-8") as file:
    rows = list(csv.reader(file))
print(rows[0])  # ['date', 'symbol', 'close', 'note']
print(rows[1])  # ['2025-01-02', 'AAPL', '184.25', 'Q3, adjusted']

كتابة الصفوف

تكتب csv.writer(file).writerow(values) صفًا واحدًا وتضع علامات الاقتباس عند الحاجة، وتحوّل الأرقام إلى نص عنك. وتكتب csv.DictWriter(file, fieldnames=[...]) قواميس، وتكتب writeheader() أسماء الأعمدة أولًا. افتح الملف بـ"w" وnewline=""؛ فبدون newline="" قد تظهر في ويندوز أسطر فارغة بين الصفوف.

import csv

# DictWriter: header first, then one dict per row
trades = [{"symbol": "AAPL", "quantity": 200}, {"symbol": "MSFT", "quantity": 50}]
with open("trades.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["symbol", "quantity"])
    writer.writeheader()
    writer.writerows(trades)

with open("trades.csv", encoding="utf-8") as file:
    print(file.read().splitlines())  # ['symbol,quantity', 'AAPL,200', 'MSFT,50']
import csv

# Cells are text until you convert them
with open("prices.csv", newline="", encoding="utf-8") as file:
    row = next(csv.DictReader(file))
print(repr(row["close"]), row["close"] * 2)   # '184.25' 184.25184.25
print(float(row["close"]) * 2)                # 368.5

# Another separator: semicolons
with open("euro.csv", "w", newline="", encoding="utf-8") as file:
    csv.writer(file, delimiter=";").writerow(["AAPL", "184,25"])
with open("euro.csv", newline="", encoding="utf-8") as file:
    print(next(csv.reader(file, delimiter=";")))  # ['AAPL', '184,25']
كل شيء يعود نصًاملف CSV بلا أنواع: 184.25 و200 وAAPL مجرد أحرف حتى تحوّلها. ونسيان ذلك يعطي "184.25" * 200 (النص مكررًا 200 مرة) بدل خطأ. حوّل كل عمود مرة واحدة عند قراءته، وتحقق من أسماء الرأس بدل افتراض المواضع.
  • افتح بـnewline=""؛ ولا تقسّم أسطر CSV أو تدمجها يدويًا.
  • تقرأ csv.DictReader الصفوف كقواميس؛ وكل خلية نص.
  • csv.writer / csv.DictWriter تكتبان الصفوف وتضعان علامات الاقتباس عنك.

التالي: بيانات JSON، للسجلات المتداخلة التي لا تناسب جدولًا مسطحًا.

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

  • جمّع أسعار الإغلاق بحسب الرمز باستخدام read_closes25 نقطة
  • احفظ الصفقات كملف CSV باستخدام write_trades25 نقطة
  • اجمع القيمة المتداولة لكل رمز باستخدام total_by_symbol25 نقطة
  • انسخ صفوف رمز واحد إلى ملف جديد باستخدام filter_rows25 نقطة
المستكشف · lab-17-1
▾ lab-17-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-17-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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