Как объединить «несовпадающие» временные ряды с Pandas?
Данные временных рядов — важная часть многих бизнес-операций, особенно в финансовой и производственной отраслях. Эти наборы данных часто представлены в виде нескольких таблиц или файлов, каждая из которых содержит определенное подмножество данных. Объединение этих таблиц может оказаться сложной задачей, особенно если таблицы содержат несовпадающие данные.
В этой статье мы узнаем, как объединить данные временных рядов, которые не совпадают, с помощью Pandas. Pandas — это мощная библиотека анализа данных на Python, которая предоставляет обширные инструменты для объединения данных и управления ими. Мы также изучим различные методы объединения временных рядов с их синтаксисом и полными примерами.
Подходы
Существует множество подходов, которые можно использовать для объединения необновляемых данных временных рядов с пандами. В этой статье мы увидим некоторые распространенные подходы к объединению несовпадающих временных рядов. Давайте теперь обсудим их подробно.
Метод 1: использование внутреннего соединения
Первый метод объединения несовпадающих данных временных рядов с использованием pandas в Python — использование внутреннего соединения. Это соединение возвращает только те строки, которые имеют совпадающие метки времени в обоих DataFrames. Это означает, что любые строки, не имеющие соответствующего совпадения в другом DataFrame, будут исключены из объединенного DataFrame.
Синтаксис
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='inner')
Пример
В данном примере мы сначала создаем два DataFrame dataframe1 и dataframe2 с помощью pd.DataFrame(). Затем мы выполняем внутреннее соединение столбца метки времени с помощью pd.merge(). Результирующий DataFrame содержит только те строки, которые имеют совпадающие метки времени в обоих DataFrame.
import pandas as pd
# Creating DataFrame one
dataframe1 = pd.DataFrame({'timestamp': ['2023-05-10 13:00:00', '2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00'],
'stock': [25, 26, 28, 29]})
# Creating DataFrame two
dataframe2 = pd.DataFrame({'timestamp': ['2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00', '2023-05-10 17:00:00'],
'price': [40, 50, 60, 70]})
# Perform inner join operation to merge not matching time series
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='inner')
print(mergedData)
Выход
timestamp stock price
0 2023-05-10 14:00:00 26 40
1 2023-05-10 15:00:00 28 50
2 2023-05-10 16:00:00 29 60
Способ 2: использование внешнего соединения
Второй метод объединения несовпадающих данных временных рядов с использованием pandas в Python — это использование внешнего соединения. Это соединение возвращает все строки из обоих DataFrame, независимо от того, есть ли совпадающая метка времени в другом DataFrame. Если строка не имеет соответствующего совпадения в другом DataFrame, Pandas заполнит недостающие значения NaN (а не числом).
Синтаксис
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='outer)
Пример
В данном примере мы сначала создаем два DataFrame dataframe1 и dataframe2 с помощью pd.DataFrame(). Затем мы выполняем внешнее соединение столбца метки времени с помощью pd.merge(). Результирующий DataFrame содержит все строки из обоих DataFrame с пропущенными значениями (NaN) в тех местах, где не было совпадений.
import pandas as pd
# Creating DataFrame one
dataframe1 = pd.DataFrame({'timestamp': ['2023-05-10 13:00:00', '2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00'],
'stock': [25, 26, 28, 29]})
# Creating DataFrame two
dataframe2 = pd.DataFrame({'timestamp': ['2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00', '2023-05-10 17:00:00'],
'price': [30, 40, 50, 60]})
# Perform left join operation to merge not matching time series
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='outer')
print(mergedData)
Выход
timestamp stock price
0 2023-05-10 13:00:00 25.0 NaN
1 2023-05-10 14:00:00 26.0 30.0
2 2023-05-10 15:00:00 28.0 40.0
3 2023-05-10 16:00:00 29.0 50.0
4 2023-05-10 17:00:00 NaN 60.0
Способ 3: использование левого соединения
Третий метод объединения несовпадающих данных временных рядов с использованием pandas в Python — использование левого соединения. Это соединение возвращает все строки из левого DataFrame и только соответствующие строки из правого DataFrame. Если строка не имеет соответствующего совпадения в правом DataFrame, Pandas заполнит недостающие значения значением NaN.
Синтаксис
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='left')
Пример
В приведенном ниже примере мы сначала создаем два DataFrame dataframe1 и dataframe2 с помощью pd.DataFrame(). Затем мы выполняем левое соединение столбца метки времени с помощью pd.merge(). Результирующий DataFrame содержит все строки из dataframe1 и соответствующие строки из dataframe2 с пропущенными значениями (NaN) в тех местах, где не было совпадений.
import pandas as pd
# Creating DataFrame one
dataframe1 = pd.DataFrame({'timestamp': ['2023-05-10 13:00:00', '2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00'],
'stock': [25, 26, 28, 29]})
# Creating DataFrame two
dataframe2 = pd.DataFrame({'timestamp': ['2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00', '2023-05-10 17:00:00'],
'price': [30, 40, 50, 60]})
# Perform left join operation to merge not matching time series
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='left')
print(mergedData)
Выход
timestamp stock price
0 2023-05-10 13:00:00 25 NaN
1 2023-05-10 14:00:00 26 30.0
2 2023-05-10 15:00:00 28 40.0
3 2023-05-10 16:00:00 29 50.0
Способ 4: использование функции Merge_asof()
Последний метод объединения несовпадающих данных временных рядов с использованием pandas в Python — использование функции merge_asof(). Эта функция в Pandas также используется для объединения двух кадров данных временных рядов, где мы хотим сопоставить значения правого кадра данных с ближайшими предыдущими значениями в левом кадре данных.
Синтаксис
mergedData = pd.merge_asof(df, dataframe1, on='time', direction='backward')
Пример
В приведенном ниже примере мы сначала создаем два фрейма данных df и dataframe1 с помощью pd.DataFrame(). Затем мы конвертируем столбец времени в обоих кадрах данных в формат даты и времени, используя pd.to_datetime(). Наконец, мы объединяем два кадра данных с помощью pd.merge_asof() и указываем параметр направления как «назад», чтобы указать, что мы хотим сопоставить значения правого кадра данных с ближайшими предыдущими значениями в левом кадре данных.
import pandas as pd
# Creating DataFrame 1: Course price data
df = pd.DataFrame({'time': pd.date_range('2023-05-10', periods=10, freq='1h'),
'price': [100, 102, 105, 104, 107, 109, 111, 110, 112, 115]})
# Creating DataFrame 2: Course Launch events data
dataframe1 = pd.DataFrame({'time': ['2023-05-10 03:00:00', '2023-05-10 07:30:00', '2023-05-10 09:45:00', '2023-05-10 12:15:00'],
'news': ['Newly added', 'Most demanded course', 'Best Seller', 'Developers choice']})
# Converting the 'time' column in both dataframes to datetime format
df['time'] = pd.to_datetime(df['time'])
dataframe1['time'] = pd.to_datetime(dataframe1['time'])
# Merging both the dataframes using merge_asof() function using backward approach
mergedData = pd.merge_asof(df, dataframe1, on='time', direction='backward')
print(mergedData)
Выход
time price news
0 2023-05-10 00:00:00 100 NaN
1 2023-05-10 01:00:00 102 NaN
2 2023-05-10 02:00:00 105 NaN
3 2023-05-10 03:00:00 104 Newly added
4 2023-05-10 04:00:00 107 Newly added
5 2023-05-10 05:00:00 109 Newly added
6 2023-05-10 06:00:00 111 Newly added
7 2023-05-10 07:00:00 110 Newly added
8 2023-05-10 08:00:00 112 Most demanded course
9 2023-05-