#python #numpy #pyarrow
#python #numpy #pyarrow
Вопрос:
Я хочу преобразовать numpy recarray в pyarrow.Таблица. Есть ли рекомендуемый способ сделать это?
Преобразование через фрейм данных pandas проще всего:
ra = ... # some recarray
T1 = pa.Table.from_pandas(pd.DataFrame(ra))
но, похоже, это должно добавить ненужные накладные расходы. Я пробовал from_pydict
, и, похоже, это работает, хотя и несколько хакерски:
ra = ... # some recarray
T2 = pa.Table.from_pydict({k:ra[k] for k in ra.dtype.fields.keys()})
Если я попытаюсь синхронизировать эти два в несколько реалистичном примере, from_pydict
подход будет намного быстрее:
c:>python
Python 3.8.5 (default, Sep 3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> import pyarrow as pa
>>> import numpy as np
>>>
>>> np.random.seed(123)
>>> rectype = np.dtype([('timestamp', np.int64),
... ('category', np.int32),
... ])
>>> nrows = 20000
>>> rawvals = np.random.randint(1000,size=(nrows,2))
>>> ra = np.array([tuple(row) for row in rawvals], dtype=rectype)
>>> T1 = pa.Table.from_pandas(pd.DataFrame(ra))
>>> T2 = pa.Table.from_pydict({k:ra[k] for k in ra.dtype.fields.keys()})
>>> (T1.to_pandas() == T2.to_pandas()).all()
timestamp True
category True
dtype: bool
>>>
>>> import timeit
>>> def f1():
... return pa.Table.from_pandas(pd.DataFrame(ra))
...
>>> def f2():
... return pa.Table.from_pydict({k:ra[k] for k in ra.dtype.fields.keys()})
...
>>> timeit.timeit(f1,number=1000)
1.4761637000000007
>>> timeit.timeit(f2,number=1000)
0.05712700000000126
Является from_pydict
ли лучший подход в этом случае? Есть ли у него какие-либо недостатки?
Комментарии:
1.
dict
Подход заканчивается обработкой каждого поля как отдельного массива. Это разумный способ работы со структурированными массивами. Я ничего не знаюpyarrow
, но если в его документации нет чего-то противоположного, он не знает ничего особенного о структурированных массивах.2. Для
from_pydict
меня метод выглядит нормально. Похоже, что преобразование pandas из массива записей в pandas. DataFrame является неоптимальным (с момента преобразования из DataFrame в pyarrow. Таблица, безусловно, оптимизирована)