pythonsocket.recv()将数据转换为数据帧DF:有更好的工作流吗?
Python脚本(在localhost中)通过“socket”连接到交易软件,并使用socket.recv()调用,我收到所有请求的价格提要信息(时间、符号、出价、要价、最后一次、最后一次数量、数量等) 现在,我想分析和处理这些记录,所以我将它们附加到一个名为“priceAll”的全局数据框中,然后在单独的函数中使用它来创建输出过滤、求和、按…分组等,最后通过COM使用Xlwings将这些“过滤”的输出实时输出到excel工作表 我的代码:pythonsocket.recv()将数据转换为数据帧DF:有更好的工作流吗?,python,pandas,dataframe,sockets,xlwings,Python,Pandas,Dataframe,Sockets,Xlwings,Python脚本(在localhost中)通过“socket”连接到交易软件,并使用socket.recv()调用,我收到所有请求的价格提要信息(时间、符号、出价、要价、最后一次、最后一次数量、数量等) 现在,我想分析和处理这些记录,所以我将它们附加到一个名为“priceAll”的全局数据框中,然后在单独的函数中使用它来创建输出过滤、求和、按…分组等,最后通过COM使用Xlwings将这些“过滤”的输出实时输出到excel工作表 我的代码: import numpy as np import p
import numpy as np
import pandas as pd
import socket
import xlwings as xw
...
priceAll= pd.DataFrame()
def second_func(priceAll_local):
#blabla...
#groupy-by , sum, isin.... etc
...
xw.Book(file_path).sheets['sheet1'].range('A1').value = filtered_DF
def readSocket():
...
...
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('localhost', 10001))
print ("> Socket Connected >")
cmd = (cmd_syntax).encode()
mysock.send(cmd) #sending CMD request
while True:
msg = mysock.recv(16384)
msg_stringa=str(msg,'utf-8')
read_df = pd.read_csv(StringIO(msg_stringa) , sep=";", error_bad_lines=False,
index_col=None, header=None,
engine='c', names=range(33),
decimal = '.')
#if there are new prices
if (len(priceDF) > 0):
priceAll = priceAll.append(priceDF, ignore_index=True).copy()
priceAll.drop_duplicates(inplace=True, keep='last')
priceAll.dropna(how='any',inplace=True)
second_func(priceAll)
third_func(priceAll)
....
last_func(priceAll)
#it drops rows older than 10 minutes
priceAll = priceAll[(now - priceAll['time']).astype('timedelta64[s]') < 600 ].copy()
...
...
#blabla...
将numpy导入为np
作为pd进口熊猫
导入套接字
将xlwings作为xw导入
...
pricell=pd.DataFrame()
def第二功能(价格所有本地):
#布拉布拉。。。
#分组依据、总和、isin。。。。等
...
xw.Book(文件路径).sheets['sheet1'].range('A1')。value=filtered\u DF
def readSocket():
...
...
mysock=socket.socket(socket.AF\u INET,socket.SOCK\u流)
connect(('localhost',10001))
打印(“>套接字连接>”)
cmd=(cmd_语法).encode()
mysock.send(cmd)#发送cmd请求
尽管如此:
msg=mysock.recv(16384)
msg_stringa=str(msg,'utf-8')
read_df=pd.read_csv(StringIO(msg_stringa),sep=“;”,error_bad_lines=False,
索引列=无,标题=无,
发动机class='c',名称=范围(33),
十进制='。)
#如果有新的价格
如果(len(priceDF)>0):
priceAll=priceAll.append(priceDF,ignore_index=True).copy()
priceAll.drop\u重复项(inplace=True,keep=last')
pricell.dropna(how='any',in place=True)
第二功能(价格全部)
第三方职能(价格所有)
....
最后一个功能(价格全部)
#它会删除超过10分钟的行
pricell=pricell[(现在-pricell['time'])。astype('timedelta64[s]')<600]。copy()
...
...
#布拉布拉。。。
我非常清楚,DFs不是用来作为实时框来附加连续数据的,而是:
- “priceAll”的最大大小为3000-4000行,最多8列
- 处理时间(不包括从套接字接收数据)约为每周期200-300ms,还不错
- 熊猫DF操作方便,功能强大
谢谢 很难与有效的代码争论。您是否确实需要
pandas
来处理此数据?如果是这样,那么可能没有更好的解决方案了。蒂姆,谢谢你的反馈。是的,pandas
确实非常方便,我需要它来方便地分组、求和、平均值。我不熟悉任何其他不同的环境/库。谢谢,我将分享我的想法,尽管它可能不适用于你。我看到太多的人直接从文件进入pandas,然后浪费大量的时间试图在他们的数据帧上编写复杂的查询和更新,而事实上,将数据读入简单的列表,进行一些简单的操作,然后进入pandas进行分析会容易得多,因为pandas是他们的王者。这就是我想指出的全部。