مصفوفة بوسوم
سلسلة 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 نقطة