我正在尝试几个小时来提出最有效的结构方法,并将流动的滴答数据附加到共享内存numpy numpy arnay ,然后稍后获得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(构造我的数组的正确方法是什么?
2(创建完整数组的pd.dataframe或列的pd.series是什么最有效的方法?
3(是否有更好的方法与Python中的共享内存时间工程一起工作(除了多处理。BaseManager(?
非常感谢!
numpy
不是附加 data的数据类型的好选择。
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
不确定为什么numpy
数组需要reshape
:
# 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