在Python/Pandas中读取和处理10k Excel单元格的最快方法?

在Python/Pandas中读取和处理10k Excel单元格的最快方法?,python,pandas,openpyxl,xlwings,pyxll,Python,Pandas,Openpyxl,Xlwings,Pyxll,我想从交易平台读取和处理实时DDE数据,使用Excel作为发送数据的交易平台和处理数据的Python之间的“桥梁”,并将其作为前端“gui”打印回Excel。速度至关重要。我需要: 尽可能快地在Excel中读取6/10000个单元格 在同一时间同一个h:m:sec传递的总刻度 检查DataFrame是否在静态数组中包含任何值,例如大量值 将输出写入同一excel文件的不同工作表,用作前端输出“gui” 我导入了“xlwings”库,并使用它从一个工作表中读取数据,用python计算所需的值,然后

我想从交易平台读取和处理实时DDE数据,使用Excel作为发送数据的交易平台和处理数据的Python之间的“桥梁”,并将其作为前端“gui”打印回Excel。速度至关重要。我需要:

尽可能快地在Excel中读取6/10000个单元格

在同一时间同一个h:m:sec传递的总刻度

检查DataFrame是否在静态数组中包含任何值,例如大量值

将输出写入同一excel文件的不同工作表,用作前端输出“gui”

我导入了“xlwings”库,并使用它从一个工作表中读取数据,用python计算所需的值,然后在同一文件的另一个工作表中打印结果。我想让Excel打开并可见,以便用作“输出仪表板”。此函数在读取实时股票价格的无限循环中运行

import xlwings as xw
import numpy as np
import pandas as pd

...
...

tickdf = pd.DataFrame(xw.Book('datafile.xlsx').sheets['raw_data'].range((1,5)(1500, 8)).value)
tickdf.columns = ['time', 'price', 'all-tick','symb']
tickdf = tickdf[['time','symb', 'price', 'all-tick']]
#read data and fill a pandas.df with values, then re-order columns

try:
   global ttt #this is used as temporary global pandas.df
   global tttout #this is used as output global pandas.df copy
   #they are global as they can be zeroed with another function

   ttt= ttt.append(tickdf, ignore_index=False) 
   #at each loop, newly read ticks are added as rows to the end of ttt global.df.

   ttt.drop_duplicates(inplace=True)

   tttout = ttt.copy()
   #to prevent outputting incomplete data,for extra-safety, I use a copy of the ttt as DF to be printed out on excel file. I find this as an extra-safety step

   tttout = tttout.groupby(['time','symb'], as_index=False).agg({'all-tick':'sum', 'price':'first'})
   tttout = tttout.set_index('time')
   #sort it by time/name and set time as index

   tttout = tttout.loc[tttout['all-tick'].isin(target_ticker)] 
   #find matching values comparing an array of a dozen values

   tttout = tttout.sort_values(by = ['time', 'symb'], ascending = [False, True])
   xw.Book(file_path).sheets['OUTPUT'].range('B2').value = tttout
我在一台电脑上运行这个i5@4.2ghz,这个函数,加上其他一些小代码,每个循环运行500-600ms,这是相当好的,但不是很好我想知道是否有更好的方法,哪些步骤可能是瓶颈

代码读取1500行,每个上市股票按字母顺序排列一行,每行都是该特定股票在市场上传递的“最后一次滴答声”,如下所示:

'10:00:04 | ABC | 10.33 | 50000'
'09:45:20 | XYZ | 5.260 | 200 '
'....
时间、股票符号、价格、数量

我想调查市场上是否有一些特定数量的交易,比如1.000.000,因为它代表一个巨大的订单,或者可能只是“1”经常被用作市场“心跳”,一种虚假订单


我的方法是使用Pandas/Xlwings/和“isin”方法。有没有更有效的方法可以提高我的脚本性能

使用用PyXLL编写的UDF会更快,因为这样可以避免通过COM和外部进程。您将在Excel中创建一个公式,将输入设置为您的数据范围,并在每次更新输入数据时调用该公式。这将避免在无限循环中不断轮询数据,并且应该比在Excel之外运行Python快得多

看看您是否还不熟悉PyXLL

PyXLL可以将输入范围转换为数据帧,但这可能不是最快的方法

将数据从Excel传输到Python的最快方法是使用PyXLL中的numpy_数组类型通过浮点numpy数组。请参见

考虑到速度问题,您可能需要将数据拆分,并使用一些函数来获取大部分静态数据,例如行和列标题,以及其他函数,这些函数在可能的情况下将变量数据作为numpy_数组,在不可能的情况下,将其他类型的数据作为numpy_数组,然后使用最后一个函数来组合它们


PyXLL可以将Python对象作为对象句柄返回Excel。如果您需要返回中间结果,那么这样做通常比将整个数据集扩展到Excel范围更快。

@Tony Roberts,谢谢

我有一个疑问和一个观察

疑问:数据更新非常快,每50-100毫秒更新一次。使用如此频繁调用的UDF函数是否可行?它会变瘦吗?我在这方面没有什么经验


观察:PyXLL确实非常强大,做得很好,维护得很好,但是IMHO每月花费25美元,它超出了免费Python语言的纯粹本质。虽然我知道质量是有代价的

有一个Excel插件使用Python实现这类功能。@Charlie Clark,你是说PyXLL吗?它被称为网格箭头,但我不确定它是否仍然存在:我认为它不适合我的用途,因为我需要在我的计算机上打开并运行我的交易平台,而不是在其他地方。无论如何,谢谢你。非常感谢你完整而详细的回复-学习新流程非常有用。