Поиск по сайту:

Как объединить «несовпадающие» временные ряды с 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-

Статьи по данной тематике: