Jak działa pandas merge_asof w języku Python? Przykład zastosowania

Jak działa pandas merge_asof w języku Python? Przykład zastosowania
„`html

W pracy z danymi często pojawia się potrzeba łączenia tabel w oparciu o wartości bliskie, ale niekoniecznie identyczne. Właśnie wtedy z pomocą przychodzi funkcja pandas.merge_asof() w Pythonie. Jest to świetne narzędzie do dopasowywania rekordów w sposób optymalny, co szczególnie sprawdza się w analizie szeregów czasowych.

Co to jest pandas.merge_asof()?

Funkcja merge_asof() w bibliotece Pandas działa podobnie do klasycznego merge(), ale z jedną kluczową różnicą: zamiast łączyć dokładnie dopasowane wartości klucza, szuka najbliższej mniejszej lub równej wartości w drugim zbiorze danych. Dzięki temu doskonale nadaje się do analizy danych o charakterze czasowym, gdzie punkty danych nie zawsze idealnie się pokrywają.

Składnia funkcji

Podstawowa składnia merge_asof() wygląda następująco:


pd.merge_asof(left, right, on=None, left_on=None, right_on=None, by=None, 
              left_by=None, right_by=None, direction='backward', tolerance=None)

Najważniejsze parametry tej funkcji to:

  • left – pierwszy DataFrame (główny)
  • right – drugi DataFrame, który będzie dołączany
  • on – nazwa kolumny używanej do łączenia, działa tylko jeśli nazwa jest wspólna dla obu tabel
  • left_on, right_on – nazwy kolumn do łączenia gdy w obu tabelach nazwy się różnią
  • by – opcjonalny parametr do grupowania po dodatkowych polach
  • direction – sposób dopasowywania wartości:
    • 'backward' – łączy z najbliższą poprzednią wartością (domyślne)
    • 'forward' – łączy z najbliższą następną wartością
    • 'nearest' – łączy z najbliższą wartością (niezależnie od kierunku)
  • tolerance – określa maksymalny dopuszczalny zakres różnicy między dopasowywanymi wartościami

Przykład zastosowania

Aby lepiej zrozumieć działanie pandas.merge_asof(), załóżmy, że mamy dwa zestawy danych: jeden zawiera pomiary temperatury sprzedawane w sklepie, a drugi godzinowe dane pogodowe. Chcemy połączyć oba zbioru w taki sposób, by każdej transakcji przypisać najbliższą godzinowo temperaturę.


import pandas as pd

# Dane dotyczące transakcji
df_sales = pd.DataFrame({
    "time": pd.to_datetime(["2024-06-01 09:15", "2024-06-01 10:45", "2024-06-01 13:10"]),
    "product": ["Kawa", "Herbata", "Woda"],
    "price": [10, 7, 3]
})

# Dane pogodowe
df_weather = pd.DataFrame({
    "time": pd.to_datetime(["2024-06-01 09:00", "2024-06-01 10:00", "2024-06-01 11:00", "2024-06-01 12:00", "2024-06-01 13:00"]),
    "temperature": [18, 20, 22, 21, 19]
})

# Scalanie danych z użyciem merge_asof
df_merged = pd.merge_asof(df_sales, df_weather, on="time", direction="backward")

print(df_merged)

Po uruchomieniu powyższego kodu, otrzymamy następujący wynik:

time product price temperature
2024-06-01 09:15 Kawa 10 18
2024-06-01 10:45 Herbata 7 20
2024-06-01 13:10 Woda 3 19

Funkcja przyporządkowała każdej transakcji najbliższą chronologicznie wcześniejszą temperaturę.

Użycie tolerance do kontrolowania łączenia

Możemy ograniczyć dopasowywanie do określonej różnicy czasowej, np. maksymalnie 1 godziny:


df_merged = pd.merge_asof(df_sales, df_weather, on="time", direction="backward", tolerance=pd.Timedelta("1h"))

Jeśli różnica między wartościami przekracza podany zakres, dane nie zostaną połączone.

Kiedy warto używać merge_asof()?

merge_asof() sprawdza się najlepiej w przypadku:

  • Analizy danych czasowych (np. parowanie transakcji z danymi pogodowymi, akcjami giełdowymi itp.)
  • Łączenia pomiarów z różnych systemów, gdzie czas jest kluczowym elementem
  • Interpolacji brakujących wartości w seriach czasowych

Podsumowanie

Funkcja pandas.merge_asof() to potężne narzędzie dla każdego, kto pracuje z danymi czasowymi. Umożliwia dopasowanie najbliższych wartości w sposób elastyczny i efektywny. Dzięki opcjom takim jak direction i tolerance, masz pełną kontrolę nad sposobem łączenia danych. Jeśli kiedykolwiek napotkasz problem, w którym tradycyjne merge() nie wystarcza – wypróbuj merge_asof() i przekonaj się, jak ułatwia życie.

„` Inny ciekawy artykuł: Jak działa pandas idxmin w języku Python? Przykład zastosowania
KajoDataSpace