0Pricing
Pandas & NumPy Academy · Lekcja

Operacje zwektoryzowane na Series

Wykonywać działania arytmetyczne między dwiema seriami, automatycznie obsługiwać dopasowanie indeksów i wypełniać brakujące dopasowane wartości za pomocą NaN

Operacje zwektoryzowane na Series to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Dlaczego operacje zwektoryzowane?

Podobnie jak NumPy, obiekty Series w Pandas obsługują operacje zwektoryzowane, które stosują działania arytmetyczne, porównania i funkcje do każdego elementu bez używania pętli Pythona. Zapewnia to zarówno zwięzłość, jak i szybkość. W tle każda operacja korzysta z procedur NumPy na poziomie C, ale Pandas dodaje istotną funkcję: automatyczne dopasowanie indeksów przed wykonaniem operacji.

import pandas as pd

revenue = pd.Series([1000, 2000, 1500], index=['Jan', 'Feb', 'Mar'])
tax_rate = 0.2
net = revenue * (1 - tax_rate)   # vectorized -- no loop
print(net)

Działania arytmetyczne na dwóch obiektach Series

Gdy dodają, odejmują, mnożą lub dzielą Państwo dwa obiekty Series, Pandas najpierw dopasowuje je według etykiet indeksu. Wynik powstaje tylko dla pozycji, na których oba obiekty Series mają daną etykietę; dla niedopasowanych etykiet pojawia się NaN. Takie działanie zapobiega ukrytym błędom wynikającym z niezgodnego ułożenia danych — na przykład podczas dodawania danych styczniowych z dwóch źródeł, które przypadkowo zapisują je w różnej kolejności.

import pandas as pd

a = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
b = pd.Series([1, 2, 3], index=['y', 'z', 'w'])

print(a + b)
# w     NaN
# x     NaN
# y    21.0
# z    32.0

Uzupełnianie wartości NaN w operacjach z dopasowaniem

Aby uniknąć propagacji wartości NaN w operacjach na niedopasowanych danych, należy używać metod arytmetycznych, takich jak .add(), .sub(), .mul() i .div(), wraz z parametrem fill_value=. Zastępuje on podaną wartością każdą etykietę, której brakuje w jednym z obiektów Series, przed wykonaniem operacji — zazwyczaj wartością 0 przy dodawaniu i 1 przy mnożeniu.

import pandas as pd

a = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
b = pd.Series([1, 2, 3], index=['y', 'z', 'w'])

result = a.add(b, fill_value=0)
print(result)
# w     3.0
# x    10.0
# y    21.0
# z    32.0

Arytmetyka skalarna na obiekcie Series

Operacja arytmetyczna ze skalarem jest stosowana do każdego elementu i tworzy nowy obiekt Series z tym samym indeksem. Jest to najprostsza forma wektoryzacji: s + 5, s * 100, s ** 2. Arytmetyka skalarna nigdy nie wprowadza wartości NaN i służy do konwersji jednostek, normalizacji oraz przesuwania szeregów czasowych.

import pandas as pd

prices_eur = pd.Series([1.0, 2.5, 4.0], index=['a', 'b', 'c'])
exchange = 1.08
prices_usd = prices_eur * exchange
print(prices_usd.round(2))
# a    1.08
# b    2.70
# c    4.32

Stosowanie funkcji ufunc NumPy do obiektów Series

Funkcje ufunc biblioteki NumPy działają bezproblemowo na obiektach Series biblioteki Pandas i zwracają obiekt Series z tym samym indeksem. Oznacza to, że można bezpośrednio wywołać np.sqrt(s), np.log1p(s) lub np.exp(s) na obiekcie Series, bez wcześniejszej konwersji do tablicy. Wynikiem jest nowy obiekt Series zachowujący oryginalne etykiety.

import pandas as pd
import numpy as np

s = pd.Series([0, 1, 4, 9, 16], index=list('abcde'))
print(np.sqrt(s))
# a    0.0
# b    1.0
# c    2.0
# d    3.0
# e    4.0

Operacje porównania na obiektach Series

Operatory porównania (==, !=, >, <, >=, <=) zwracają element po elemencie serię wartości logicznych. Są one podstawą filtrowania: serię wartości logicznych przekazuje się do .loc, aby wybrać pasujące wiersze. Podczas porównywania dwóch obiektów Series Pandas również dopasowuje je według indeksu.

import pandas as pd

s = pd.Series([3, 7, 2, 9, 1], index=list('abcde'))
print(s > 4)
# a    False
# b     True
# c    False
# d     True
# e    False
print(s[s > 4])  # b:7  d:9

Łączenie operacji zwektoryzowanych

Ponieważ każda operacja zwraca nowy obiekt Series, można łączyć wiele przekształceń w jednym wyrażeniu. Zwiększa to czytelność i pozwala uniknąć tworzenia niepotrzebnych zmiennych pośrednich. W przypadku złożonych potoków należy podzielić łańcuch na kilka wierszy, używając nawiasów. Łączenie operacji jest odpowiednikiem programowania funkcyjnego z niezmiennymi danymi w Pandas.

import pandas as pd
import numpy as np

raw_scores = pd.Series([55, 80, 45, 90, 72])
normalised = (raw_scores - raw_scores.min()) / (raw_scores.max() - raw_scores.min())
print(normalised.round(2))
# 0    0.22
# 1    0.78
# 2    0.00
# 3    1.00
# 4    0.60

Obsługa wartości NaN w operacjach zwektoryzowanych

NaN jest wartością „zaraźliwą”: każde działanie arytmetyczne z udziałem NaN daje w wyniku NaN. Przed wykonaniem operacji należy użyć s.fillna(value), aby zastąpić brakujące wartości, albo przekazać parametr skipna=True do metod agregujących. Funkcja pd.isna(s) zwraca serię wartości logicznych oznaczających pozycje zawierające NaN — należy jej użyć do sprawdzenia danych przed obliczeniem statystyk.

import pandas as pd
import numpy as np

s = pd.Series([1.0, np.nan, 3.0, np.nan, 5.0])
print(s + 10)
# 0    11.0  2    13.0  4    15.0 -- NaN stays NaN

print(s.fillna(0) + 10)
# 0    11.0  1    10.0  2    13.0  3    10.0  4    15.0

abs(), clip() i round() na obiektach Series

Obiekty Series biblioteki Pandas udostępniają bezpośrednio wiele metod podobnych do funkcji NumPy: s.abs(), s.clip(lower, upper) i s.round(decimals) zwracają nowe obiekty Series z przekształceniem zastosowanym element po elemencie. Są one odpowiednikami wywołań funkcji ufunc NumPy, ale używają składni metod i zachowują indeks oraz nazwę obiektu Series.

import pandas as pd

s = pd.Series([-2.5, 1.3, -0.7, 4.9, -3.1])
print(s.abs())          # [2.5 1.3 0.7 4.9 3.1]
print(s.clip(-2, 2))    # [-2.  1.3 -0.7  2. -2. ]
print(s.round(0))       # [-2.  1.  -1.   5.  -3.]

pct_change() do obliczania tempa wzrostu

s.pct_change() oblicza procentową zmianę między kolejnymi elementami: (bieżąca wartość - poprzednia wartość) / poprzednia wartość. Pierwszy element ma wartość NaN, ponieważ nie istnieje dla niego poprzednia wartość. Jest to standardowa operacja używana do obliczania miesięcznego tempa wzrostu, dziennych stóp zwrotu w finansach oraz cech tempa zmian w modelach szeregów czasowych.

import pandas as pd

monthly_revenue = pd.Series([100, 120, 110, 140],
                            index=['Q1', 'Q2', 'Q3', 'Q4'])
growth = monthly_revenue.pct_change()
print(growth.round(3))
# Q1      NaN
# Q2    0.200
# Q3   -0.083
# Q4    0.273

cumsum() i cumprod() na obiektach Series

s.cumsum() zwraca obiekt Series z narastającymi sumami, a s.cumprod() — z narastającymi iloczynami. Funkcje te służą do obliczania skumulowanych przychodów, składanych stóp zwrotu z inwestycji lub bieżącej liczby słów. Zachowują oryginalne etykiety indeksu, co ułatwia wykreślanie skumulowanej serii w czasie lub według kategorii.

import pandas as pd

daily_sales = pd.Series([100, 150, 80, 200],
                        index=['Mon', 'Tue', 'Wed', 'Thu'])
print(daily_sales.cumsum())
# Mon    100
# Tue    250
# Wed    330
# Thu    530

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat operacji zwektoryzowanych na obiektach Series z tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczyli się Państwo, że: operatory arytmetyczne działają element po elemencie na obiektach Series bez użycia pętli, Pandas automatycznie dopasowuje dwa obiekty Series według etykiet indeksu przed wykonaniem operacji, umieszczając NaN na niedopasowanych pozycjach, a także że metody takie jak fill_value, pct_change i cumsum rozszerzają możliwości operacji zwektoryzowanych w zadaniach analitycznych. Następnie omówimy przydatne metody obiektów Series, takie jak describe, value_counts i map, służące do szybkiego podsumowywania danych.

Często zadawane pytania

Czy lekcja „Operacje zwektoryzowane na Series” jest bezpłatna?

Tak — pełny tekst „Operacje zwektoryzowane na Series” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Operacje zwektoryzowane na Series”?

Wykonywać działania arytmetyczne między dwiema seriami, automatycznie obsługiwać dopasowanie indeksów i wypełniać brakujące dopasowane wartości za pomocą NaN Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Operacje zwektoryzowane na Series”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie Series
  2. Dostęp według etykiet i pozycji
  3. Operacje zwektoryzowane na Series
  4. Przydatne metody Series
← Powrót do Pandas & NumPy Academy