Skip to article frontmatterSkip to article content

02 - Python - praca z danymi

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?

KrajLudność (mln)PKB (bUSD)
USA329.520.94
WIELKA BRYTANIA76.222.7
CHINY140214.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)
Loading...

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)
Loading...

Używanie DataFrame

  • Teraz, gdy mamy obiekt DataFrame, chcemy być w stanie używać tego DataFrame.
  • Obejmuje to:
    • Uzyskanie podstawowych informacji o DataFrame (np. jego kształt).
    • Dostęp do określonych kolumn.
    • Dostęp do określonych wierszy.

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órne x wierszy DataFrame.
  • Podobnie, tail(x) wyświetla ostatnie x wierszy.
df_pokemon.head(2)
Loading...
df_pokemon.tail(2)
Loading...

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)
Loading...
### Pokaż najwyższe HP
df_pokemon.sort_values("HP", ascending = False).head(2)
Loading...

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
Loading...

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)
Loading...

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)
Loading...

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()
Loading...

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.