Cele tego rozdziału¶
Ten wykład będzie przeglądem narzędzi przydatnych do pracy z danymi w Pythonie.
- Główny nacisk: dane tabelaryczne w plikach
.csv
. - Wprowadzenie do
pandas
. - Podstawowa manipulacja i analiza przy użyciu
pandas
.
Czym jest plik?¶
Plik jest zbiorem bajtów używanym do przechowywania pewnego rodzaju danych.
Format tych danych zależy od tego, do czego ich używasz, ale na pewnym poziomie są one tłumaczone na binarne bity (1
i 0
).
Format pliku jest zwykle określony w rozszerzeniu pliku.
.csv
: wartości oddzielone przecinkami..txt
: zwykły plik tekstowy..py
: wykonywalny plik Pythona..png
: przenośny sieciowy plik graficzny (tj. obraz).
Czym są dane tabelaryczne?¶
Dane tabelaryczne to dane zorganizowane w tabeli z wierszami i kolumnami.
- Ten rodzaj danych jest dwuwymiarowy.
- Zazwyczaj każdy wiersz reprezentuje „obserwację”.
- Zazwyczaj każda kolumna reprezentuje atrybut.
Często przechowywane w plikach .csv
.
.csv
= „wartości oddzielone przecinkami”
Przykład: Kraje¶
Pytanie: Co reprezentuje każdy wiersz? A co każda kolumna?
Kraj | Ludność (mln) | PKB (bUSD) |
---|---|---|
USA | 329.5 | 20.94 |
WIELKA BRYTANIA | 76.22 | 2.7 |
CHINY | 1402 | 14.72 |
Pakiet pandas
¶
pandas
to pakiet, który umożliwia płynne i wydajne przechowywanie, manipulowanie i analizowanie danych.
## Instrukcja importu: pandas jest „pakietem”
import pandas as pd
pandas.read_csv
¶
Dane tabelaryczne są często przechowywane w plikach .csv
.
pandas.read_csv
może być użyty do wczytania pliku.csv
.- Jest on reprezentowany jako
pandas.DataFrame
.
pd.read_csv(„path/to/file.csv”) ### zastąp rzeczywistą ścieżką pliku!
### Plik .csv z danymi o różnych Pokemonach
df_pokemon = pd.read_csv("data/pokemon.csv")
df_pokemon.head(5)
read_csv
z adresem URL¶
Do funkcji read_csv
można również przekazać adres URL wskazujący na plik .csv
.
- Jest to zbiór danych z Brand et al. (2019), w którym określono ilościowo zmiany w pozytywności i negatywności tekstów piosenek w czasie.
- Wkrótce będziemy pracować więcej z tym zbiorem danych!
import ssl
import warnings
warnings.filterwarnings('ignore')
ssl._create_default_https_context = ssl._create_unverified_context
import requests
from io import StringIO
url = "https://raw.githubusercontent.com/kflisikowsky/sad/refs/heads/main/data/billboard_analysis.csv"
response = requests.get(url, verify=False)
df_lyrics = StringIO(response.text)
df_lyrics = pd.read_csv(df_lyrics, sep=",")
print(df_lyrics.head())
artist artist_processed rank \
0 sam the sham and the pharaohs sam the sham and the pharaohs 1
1 four tops four tops 2
2 the rolling stones the rolling stones 3
3 we five we five 4
4 the righteous brothers the righteous brothers 5
song year ID_index negative \
0 wooly bully 1965 1 0.0
1 i cant help myself sugar pie honey bunch 1965 2 3.0
2 i cant get no satisfaction 1965 3 NaN
3 you were on my mind 1965 4 10.0
4 youve lost that lovin feelin 1965 5 6.0
positive n
0 0.0 73.0
1 8.0 192.0
2 NaN NaN
3 2.0 138.0
4 31.0 225.0
df_lyrics.head(2)
Używanie DataFrame
¶
- Teraz, gdy mamy obiekt
DataFrame
, chcemy być w stanie używać tegoDataFrame
. - Obejmuje to:
- Uzyskanie podstawowych informacji o
DataFrame
(np. jego kształt). - Dostęp do określonych kolumn.
- Dostęp do określonych wierszy.
- Uzyskanie podstawowych informacji o
Używanie shape
¶
df.shape
mówi nam ile wierszy i kolumn znajduje się w DataFrame
.
## (#wiersze, #kolumny)
df_pokemon.shape
(800, 13)
Używanie head
i tail
¶
- Funkcja
head(x)
wyświetla górnex
wierszyDataFrame
. - Podobnie,
tail(x)
wyświetla ostatniex
wierszy.
df_pokemon.head(2)
df_pokemon.tail(2)
Dostęp do kolumn¶
- Dostęp do kolumny można uzyskać za pomocą
dataframe_name['column_name']
.
### Co przypomina ci ta składnia nawiasów ([„nazwa_kolumny”])?
df_pokemon['Speed'].head(5)
0 45
1 60
2 80
3 80
4 65
Name: Speed, dtype: int64
Przydatne operacje z pandas
¶
DataFrame
umożliwia wszelkiego rodzaju użyteczne operacje, włączając w to:
- Sortowanie
DataFrame
według określonej kolumny. - Obliczanie statystyk opisowych (np.
średnia
,mediana
itp.). - Filtrowanie ramki danych.
- Agregacja między poziomami zmiennej przy użyciu
groupby
.
sort_values
¶
### Domyślnie, będzie sortować od najniższego do najwyższego
df_pokemon.sort_values("HP").head(2)
### Pokaż najwyższe HP
df_pokemon.sort_values("HP", ascending = False).head(2)
Twoja kolej¶
Jaka jest Szybkość
Pokemona z najwyższym Atakiem
?
### Rozwiązanie tutaj
# Odkomentuj następującą linię, aby zobaczyć rozwiązanie:
# %load ./solutions/solution4.py
Statystyki opisowe¶
Kolumny DataFrame
mogą być również podsumowane:
średnia
: wartość średnia (dla zmiennych numerycznych)mediana
: „środkowa” wartość (dla zmiennych numerycznych)modalna
: najczęściej występująca wartość w zbiorze
df_pokemon['Attack'].mean()
np.float64(79.00125)
df_pokemon['Attack'].median()
np.float64(75.0)
df_pokemon['Attack'].mode()
0 100
Name: Attack, dtype: int64
Filtrowanie DataFrame
¶
- Często chcemy filtrować
DataFrame
, aby zobaczyć tylko te obserwacje, które spełniają określone warunki. - Ostatecznie jest to podobne do używania deklaracji warunkowej - tylko z inną składnią.
Przykład 1: filtrowanie po zmiennej kategorialnej¶
- Kolumna
legendary
jest zmienną kategoryczną, co oznacza, że istnieje kilka dyskretnych kategorii.
## Ile jest legendarnych pokemonów?
df_pokemon[df_pokemon['Legendary']==True].head(5)
Przykład 2: filtrowanie na zmiennej ciągłej¶
- Kolumna
HP
jest zmienną ciągłą. - Pokażmy tylko wiersze dla Pokemonów z
HP > 150
.
df_pokemon[df_pokemon['HP'] > 150].head(3)
Używanie groupby
¶
Funkcja
groupby
pozwala na podzielenie danych (np. według różnych kategorii), a następnie zastosowanie pewnej funkcji do każdego podziału tych danych (np.średnia
).
Składnia jest następująca:
df_name.groupby(„column_to_group_by”).mean() ## lub mediana, itd.
Przykład: mean Attack
by Legendary
¶
Tutaj składnia [[...]]
po prostu ogranicza kolumny w DataFrame
do tych, na których nam bezpośrednio zależy.
df_pokemon[['Legendary', 'Attack']].groupby("Legendary").mean()
Twoja kolej¶
Jak obliczyć medianę
Obrony
według statusu Legendarnego
?
### Twoje rozwiązanie tutaj
# Odkomentuj następującą linię, aby zobaczyć rozwiązanie:
# %load ./solutions/solution5.py
Twoja kolej:¶
Jak obliczyć średnią
HP
dla Typu 1
?
### Twoje rozwiązanie tutaj
# Odkomentuj następującą linię, aby zobaczyć rozwiązanie:
# %load ./solutions/solution6.py
Podsumowanie¶
To kończy nasz dział dotyczący interakcji z danymi.
- Wczytywanie plików
.csv
za pomocąpandas
. - Podsumowywanie i praca z danymi tabelarycznymi.