Я хочу обработать данные уровня 2 запаса в пандах. Предположим, что для простоты в каждой строке четыре вида данных:
- миллис: timestamp, int64
- last_price: цена последней сделки, float64,
- ask_queue: объем запрашиваемой стороны, массив фиксированного размера (200) из int32
- bid_queue: объем стороны предложения, массив фиксированного размера (200) из int32
Который может быть легко определен как структурированный dtype в numpy:
dtype = np.dtype([
('millis', 'int64'),
('last_price', 'float64'),
('ask_queue', ('int32', 200)),
('bid_queue', ('int32', 200))
])
И таким образом, я могу получить доступ к ask_queue
и bid_queue
например:
In [17]: data = np.random.randint(0, 100, 1616 * 5).view(dtype)
% compute the average of ask_queue level 5 ~ 10
In [18]: data['ask_queue'][:, 5:10].mean(axis=1)
Out[18]:
array([33.2, 51. , 54.6, 53.4, 15. , 37.8, 29.6, 58.6, 32.2, 51.6, 34.4,
43.2, 58.4, 26.8, 54. , 59.4, 58.8, 38.8, 35.2, 71.2])
Мой вопрос заключается в том, как определить DataFrame
включить данные?
Здесь есть два решения:
A. установите ask_queue
и bid_queue
как два столбца со значениями массива следующим образом:
In [5]: df = pd.DataFrame(data.tolist(), columns=data.dtype.names)
In [6]: df.dtypes
Out[6]:
millis int64
last_price float64
ask_queue object
bid_queue object
dtype: object
Однако в этом решении есть как минимум две проблемы:
-
ask_queue
иbid_queue
потеряли dtype 2D-массив и все удобные методы; - Производительность, поскольку она становится массивом объектов, а не двумерным массивом.
Б. ask_queue
bid_quene
ask_queue
и bid_quene
до 2 * 200
столбцов:
In [8]: ntype = np.dtype([('millis', 'int64'), ('last_price', 'float64')] +
...: [(f'{name}{i}', 'int32') for name in ['ask', 'bid'] for i in range(200)])
In [9]: df = pd.DataFrame.from_records(data.view(ntype))
In [10]: df.dtypes
Out[10]:
millis int64
last_price float64
ask0 int32
ask1 int32
ask2 int32
ask3 int32
ask4 int32
ask5 int32
...
Это лучше, чем решение А. Но столбцы 2 * 200 выглядят избыточными.
Есть ли какое-нибудь решение, которым можно воспользоваться как структурированным dtype в numpy? Интересно, может ли ExtensionArray
или ExtensionDtype решить эту проблему?