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

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łączanyon- nazwa kolumny używanej do łączenia, działa tylko jeśli nazwa jest wspólna dla obu tabelleft_on,right_on- nazwy kolumn do łączenia gdy w obu tabelach nazwy się różniąby- opcjonalny parametr do grupowania po dodatkowych polachdirection- 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.
