Маленький Pandas DataFrame = плохая производительность - PullRequest
0 голосов
/ 03 мая 2020

Вариант использования и выводы

Создайте таблицу 2 * 2, заполненную целыми числами, измените значения одной указанной строки c и получите доступ к нескольким строкам. Для этого я планировал использовать pandas DataFrame, но очень разочаровался производительностью. Заключение показывает несжимаемую стоимость для pandas DataFrame, когда данные представляют собой небольшие таблицы: - pandas .lo c = pandas .ilo c = 115 мкс - pandas .iat = 5 мкс ( В 20 раз быстрее, но доступ только к одной ячейке) - numpy доступ = 0,5 (в 200 раз быстрее, приемлемая производительность)

Я неправильно использую pandas DataFrame? Это должно использоваться только для больших таблиц данных? Учитывая, что моя цель состоит в том, чтобы использовать очень простую MultiIndexation (тип 1, тип 2 и дату), существует ли существующая структура данных, которая будет поддерживать производительность, аналогичную массивам numpy, и такая же простая, как pandas DataFrame?

Или другой вариант, который я рассмотрю, - это создать свой собственный класс MultiIndexed numpy массивов.

Код варианта использования

import pandas as pd
import numpy as np
from datetime import datetime
import time
data = [[1,2],[3,4]]
array = np.array(data)
index= pd.DatetimeIndex([datetime(2000,2,2), datetime(2000,2,4)])
df = pd.DataFrame(data = data, index = index)

Требуется около 0,1 мс с использованием pandas с использованием lo c функция

%timeit df.loc[datetime(2000,2,2)] = [12, 42]
115 µs ± 2.19 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

ilo c имеет таких же плохих показателей , хотя я бы интуитивно думал, что это будет быстрее

%timeit df.iloc[0] = [12, 42]
114 µs ± 3.49 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Тестирование iat, мы сократились до 5 мкс, что более приемлемо

%timeit df.iat[0,0] = 42
5.03 µs ± 37.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Наконец, тестируя то же поведение с numpy .array, мы имеем отличные характеристики:

%timeit array[0,:] = [12, 42]
705 ns ± 4.96 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...