2016-12-01 1 views
0

Для unittest мне нужно сравнить два pandas DataFrames (с одним столбцом, чтобы они также могли быть переданы в Series без потери информации). Проблема в том, что индекс одного из них имеет тип даты и времени, а другая дата. Для наших целей информация в двух случаях одинакова, так как компонент времени datetime не используется.Сравните две серии Pandas/DataFrames, которые практически равны

Чтобы проверить, если два объекта равны для UnitTest I Could:

  • Извлечь индекс одного из них и бросил на дату/DateTime
  • Extract только значения одного столбца, сравнить те, и даты начала и окончания

Не хватает ли вы элегантного способа сравнить эти два?

Пример кода:

from datetime import date, datetime, timedelta 
import pandas as pd 

days_in_training = 40 
start_date = date(2016, 12, 1) 
dates = [start_date + timedelta(days=i) for i in range(days_in_training)] 
actual = pd.DataFrame({'col1': range(days_in_training)}, index=dates) 

start_datetime = datetime(2016, 12, 1) 
datetimes = [start_datetime + timedelta(days=i) for i in range(days_in_training)] 
expected = pd.DataFrame({'col1': range(days_in_training)}, index=datetimes) 

assert(all(actual == expected)) 

Дает:

ValueError: Can only compare identically-labeled DataFrame objects 
+0

try 'assert (all (actual.values ​​== expected.values))' здесь '.values' возвращает массив np, поэтому индекс не задействован – EdChum

+0

Ну, да. Это было одно из моих предложений, но оно не проверяет, совпадают ли даты. Я мог бы проверить это отдельно, но мне было просто интересно, было ли элегантное решение сделать все сразу. –

+1

Почему бы просто не преобразовать индекс на сегодняшний день? 'expected.index = expected.index.date', тогда он выровнят – EdChum

ответ

0

Для дальнейшего использования, с помощью этого BlogPost (https://penandpants.com/2014/10/07/testing-with-numpy-and-pandas/) Я нашел функцию pandas.util.testing.assert_frame_equal() (https://github.com/pandas-dev/pandas/blob/29de89c1d961bea7aa030422b56b061c09255b96/pandas/util/testing.py#L621)

Эта функция имеет некоторую гибкость в чем он проверяет. Кроме того, он выводит резюме о том, почему DataFrames не может считаться равным, строка assert(all(actual == expected)) возвращает только True или False, что усложняет отладку.

Смежные вопросы