Вариант использования и выводы
Создайте таблицу 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)