小编Joh*_*631的帖子

熊猫:为什么要追加浮点数和整数的数据帧要慢于充满NaN的数据帧

我从一个文件中获取数据,该文件通过Sierra Chart从Interactive Brokers 5秒OHLCVT条接收数据.

根据早期帖子中的建议,而不是将每个新行附加到数据框,我使用历史文件构造一个数据框,并使用正确的时间戳向其附加5000个"空白"记录.然后,我将每个新行写在空行上,如果缺少时间戳并填充指针,则填充任何行.

这很好用.这是当前的类和函数.我的初始版本创建了5000行NaN(OHLCVxyz).我认为从最终数据类型开始会更整洁,所以将"空白"记录转换为零,OHLC为浮点数,Vxyz使用以下内容:

dg.iloc[0:5000] = 0.0
dg[[v, x, y, z]] = dg[[v, x, y, z]].astype('int')
Run Code Online (Sandbox Code Playgroud)

这仅在每5000行(HSI每天一次)时发生一次.让我感到惊讶的是对读/写循环的影响.它们每行从0.8ms到3.4ms.唯一的变化是从NaNs到零.

此图显示了一个初始运行,其中零填充框架(参见时间戳0.0038)然后是一个带有NaN填充框架的运行(时间段为0.0008).

任何人都可以提供有关为什么它可能会增加写入[0.0,0.0,0.0,0.0,0,0,0,0]的字段而不是[NaN,NaN,NaN,NaN,NaN,NaN,NaN]的原因的见解,NaN]?

对代码改进的任何想法也是受欢迎的.:)

谢谢

编辑 +17小时

根据@BrenBarn的问题,我构建了一个更简单的模型,可以由没有数据的任何人运行.在这样做的过程中,我消除了NaN是否会影响它的问题.在这个版本中我能够为两个版本写0.0s,差异是相同的:

  • 具有8列浮点数的数组的添加速度比具有4列浮点数和4列int64的数组快10倍.
  • 在每种情况下,添加的行是[1.0,2.0,3.0,4.0,5,6,7,8]
  • 使用self.df.iloc [self.end] = datarow和increment end完成10000次添加.

所以,除非我错了(总是可能的),似乎添加到4列浮点数和4个整数的数据帧需要10倍的时间.对于大熊猫来说这是一个问题还是人们应该期待的问题?

这是测试代码 ,这是输出图片

我认为在添加之前拥有包含8列的350,000行数组会产生显着差异.我最初的测试增加到10行显示没有影响 - 我必须回去重新测试它们.

编辑 +10分钟

不,我回去创建只有10行的初始数组,并且对add循环的影响没有改变,所以它不是原始数组/数据帧的大小.很可能在我之前的测试中我认为我已经将列转换为int但我没有 - 检查这证明了我认为这样做的命令没有.

da = SierraFrame(range(10), np.zeros((10,8)))
da.extend_frame1()
Run Code Online (Sandbox Code Playgroud)

编辑和可能的答案 +35分钟

是否应该更详细地回答这个问题.

在这一点上,我的假设是,如果df包含所有一种类型,那么将[1.0,2.0,3.0,4.0,5,6,7,8]添加到数据帧中的备用线的基本功能是不同的.浮标和整数列.我刚用所有的int64测试了它,所有浮点数的平均加法值为0.41ms vs 0.37ms,混合数据帧的平均加法值为2.8ms.Int8s耗时0.39ms.我猜混合会影响大熊猫优化其动作的能力,因此如果效率非常重要,那么所有列属于同一类型的数据框(可能是float64)是最好的选择.

使用Python 3.3.1在Linux x64上进行的测试

python casting pandas

7
推荐指数
1
解决办法
2247
查看次数

Python Pandas全局vs传递变量

我正在创建一个"实时"流程,该流程从SierraChart更新的专有格式化OHLCVTBA文件中获取数据.使用生成器读取数据并创建数据帧的代码发布在pastebin上

我意识到我的结构(新数据驱动)是错误的,我即将重新组织它. PhE的问题和Wes的回应让我朝着填充预先填充的数据框架的方向发挥了作用.我的问题是:

将我的数据帧和指针保存为全局变量或将它们传递给使用它们的各种函数是否更快?此外,还有其他考虑应该推动这一选择吗?

谢谢.

python pandas

2
推荐指数
1
解决办法
1335
查看次数

标签 统计

pandas ×2

python ×2

casting ×1