Perfplot bench () вызывает "TypeError: ufunc 'isfinite' не поддерживается для типов ввода и типов ввода" - PullRequest
3 голосов
/ 21 июня 2019

Я использую библиотеку perpflot , чтобы проверить влияние DatetimeIndex на поиск кадра данных pandas.

Я определил функцию настройки для создания 2 кадров данных.Один с указателем даты и времени, а другой со временем в виде столбца.Я также определил 2 функции, которые используют .loc в индексе и столбце соответственно и возвращают субданные.Тем не менее, он показывает мне typeError.

TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Код:

import numpy as np
import pandas as pd
from datetime import datetime
import perfplot


def setup_code(n):
    timeline = pd.date_range(end=datetime.now(), freq='1s', periods=n)
    sensor_readings = np.random.randint(100, size=(n, 4))
    col_labels = ['Sensor1', 'Sensor2', 'Sensor3', 'Sensor4']
    data = pd.DataFrame(sensor_readings, columns=col_labels)
    data['time'] = timeline
    data['time'] = pd.to_datetime(data['time'])
    data2 = data.copy()
    data2 = data2.set_index('time')
    print(n)
    return [data, data2]


def f1(ldata):
    data = ldata[0]
    subdata = data.loc[(data['time'] >= '2019-06-21 08:00:00') & (data['time'] <= '2019-06-21 11:00:00')]
    return subdata


def f2(ldata):
    data = ldata[1]
    subdata = data.loc['2019-06-21 04:00:00':'2019-06-21 10:00:00']
    return subdata


out = perfplot.bench(
    setup=setup_code,  
    kernels=[
        f1, f2
    ],
    n_range=[1000 ** k for k in range(1, 3)],
    labels=['Without Indexing', 'With Indexing'],
    xlabel='Length of DataFrame'
)
out.show()

Трассировка:

Traceback (most recent call last):                                                                                                | 0/2 [00:00<?, ?it/s]
  File ".\scratchpad.py", line 39, in <module>
    xlabel='Length of DataFrame'
  File "C:\Users\hpandya\AppData\Local\Continuum\anaconda3\lib\site-packages\perfplot\main.py", line 128, in bench
    reference, kernel(data)
  File "C:\Users\hpandya\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\numeric.py", line 2423, in allclose
    res = all(isclose(a, b, rtol=rtol, atol=atol, equal_nan=equal_nan))
  File "C:\Users\hpandya\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\numeric.py", line 2521, in isclose
    xfin = isfinite(x)
TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Странно, что в строке, где я определил xlabel, отображается ошибка,Я чувствую, что упускаю что-то тривиальное здесь.

1 Ответ

2 голосов
/ 21 июня 2019

Методы bench() и show() по умолчанию сравнивают выходные данные ядра, чтобы убедиться, что все методы выдают один и тот же результат (для корректности). Проверка выполняется с использованием numpy-функций, которые могут применяться не ко всем случаям или всем выходам ядра.

То, что вы хотите сделать, это указать аргумент equality_check, который дает некоторую гибкость в сравнении результатов. Это особенно полезно при сравнении таких вещей, как итерации строк или словарей, с которыми numpy не может справиться хорошо.

Установите для equality_check значение Нет, если вы уверены, что ваши функции верны, или иным образом пропустите некоторую функцию, которая реализует вашу собственную логику проверки.

out = perfplot.bench(
    ...
    equality_check=lambda x, y: x.equals(y)  # equality_check=None
)

См. этот ответ (прокрутите вниз), чтобы получить больше примеров того, как equality_check использовался для синхронизации различных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...