用于附加和创建pandas数据帧的快速numpy数组结构
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于附加和创建pandas数据帧的快速numpy数组结构相关的知识,希望对你有一定的参考价值。
我想用几个小时来提出最有效的结构方法并将流动的滴答数据附加到shared memory numpy数组,然后及时得到一个pandas DataFrame。
#source tick data comes in as dict
tick_data = {"bid": float(1.2), "ask": float(1.3), "time": datetime.datetime.now()}
#construct np array
dtype_conf = [('bid', '<f4'), ('ask', '<f4'), ('time', 'datetime64[us]')]
new_tick = np.array([(11.11, 22.22, now)], dtype=dtype_conf)
#append / vstack / .. it to existing shared numpy array
shared_np_array = np.vstack((shared_np_array, new_tick))
#fast construction of pd.DataFrame if needed
pd.DataFrame(shared_np_array.reshape((1,-1))[0])
问题:
1)构造数组的正确方法是什么,并且(更快)将新的tick数据附加到它?
2)创建完整数组的pd.DataFrame或列的pd.Series最有效的方法是什么?
3)有没有更好的方法在python中使用共享内存时间序列(除了multiprocessing.basemanager)?
非常感谢!
答案
numpy
不是添加数据的数据类型的好选择。
python中最通用的选择是collections.deque
,它针对在列表的开头或结尾插入项目进行了优化。
这就是您的代码的外观:
import pandas as pd, numpy as np
import datetime
from collections import deque
now = datetime.datetime.now()
lst_d = deque()
#source tick data comes in as dict
tick_data = {"bid": float(1.2), "ask": float(1.3), "time": now}
#construct np array
dtype_conf = [('bid', '<f4'), ('ask', '<f4'), ('time', 'datetime64[us]')]
new_tick = np.array([(11.11, 22.22, now)], dtype=dtype_conf)
# existing deque object named lst_d
lst_d.append(list(new_tick))
# example of how your deque may look
lst_d = deque([[1, 2, 'time1'], [3, 4, 'time3'], [4, 5, 'time4']])
#fast dataframe construction
print(pd.DataFrame(list(lst_d), columns=['bid', 'ask', 'time']))
# bid ask time
# 0 1 2 time1
# 1 3 4 time3
# 2 4 5 time4
不确定reshape
阵列需要numpy
的原因:
# example of how your deque may look
lst_d = np.array([[1, 2, 'time1'], [3, 4, 'time3'], [4, 5, 'time4']])
#fast dataframe construction
print(pd.DataFrame(lst_d, columns=['bid', 'ask', 'time']))
# bid ask time
# 0 1 2 time1
# 1 3 4 time3
# 2 4 5 time4
以上是关于用于附加和创建pandas数据帧的快速numpy数组结构的主要内容,如果未能解决你的问题,请参考以下文章
pandas.DataFrame.agg 不适用于 np.std?