Pandas:为什么附加到浮点数和整数的数据帧会比充满 NaN 的数据帧慢

2024-05-22

我正在从一个文件中获取数据,该文件通过 Sierra Chart 从盈透证券 5 秒 OHLCVT 柱线接收数据。

按照之前帖子中的建议,我不是将每个新行附加到数据帧,而是使用历史文件构建一个数据帧,并向其中附加 5000 个具有正确时间戳的“空白”记录。然后,我将每个新行写入空白行,如果时间戳丢失则填充任何行并更新指针。

这效果很好。这是当前的类和函数 http://pastebin.com/yc4i95EX。我的初始版本创建了 5000 行 NaN (OHLCVxyz)。我认为从最终数据类型开始会更整洁,因此将“空白”记录转换为零,其中 OHLC 为浮点数,Vxyz 为整数,使用:

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

每增加 5000 条线,只会发生一次(HSI 每天一次)。令我惊讶的是对读/写循环的影响。每行时间从 0.8 毫秒增加到 3.4 毫秒。唯一的变化是从 NaN 到零。

这张照片 https://i.stack.imgur.com/OXLK0.png显示了使用零填充帧的初始运行(参见 timestats 0.0038),然后显示了使用 NaN 填充帧的运行(timestats 0.0008)。

任何人都可以深入了解为什么写入 [0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0] 字段而不是 [NaN, NaN, NaN, NaN, NaN, NaN, NaN 字段可能会增加这么多时间,NaN]?

也欢迎任何有关代码改进的想法。 :)

Thanks

EDIT+17 小时

根据@BrenBarn 的问题,我构建了一个更简单的模型,任何没有数据的人都可以运行该模型。通过这样做,我消除了 NaN 是否影响它的问题。在这个版本中,我能够向两个版本写入 0.0,并且差异是相同的:

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

因此,除非我弄错了(总是有可能),否则添加到具有 4 列浮点数和 4 列整数的数据帧似乎需要 10 倍的时间。这是熊猫的问题还是人们应该期待的?

这是测试代码 http://pastebin.com/8dbNr7TU and 这是输出图片 https://i.stack.imgur.com/omGkA.png

我认为在添加 350,000 行 8 列的数组之前,它会产生显着的差异。我最初的测试添加到 10 行没有显示任何影响 - 我必须返回并重新测试它们。

EDIT+10 分钟

不,我返回并创建了只有 10 行的初始数组,并且对添加循环的影响没有改变,因此它不是原始数组/数据帧的大小。很可能在我之前的测试中,我认为我已经将列转换为整数,但我没有 - 检查这一点证明我认为会执行此操作的命令没有这样做。

da = SierraFrame(range(10), np.zeros((10,8)))
da.extend_frame1()

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

这个问题不应该更详细地回答吗?

此时,我的假设问题在于,如果 df 包含所有一种类型,则将 [1.0, 2.0, 3.0, 4.0, 5, 6, 7, 8] 添加到数据帧中的备用行的底层功能与包含浮点数和整数列的情况不同。我刚刚使用所有 int64 进行了测试,平均添加时间为 0.41 毫秒,所有浮点数为 0.37 毫秒,混合数据帧为 2.8 毫秒。 Int8s 花费了 0.39ms。我猜这种混合会影响熊猫优化其动作的能力因此,如果效率非常重要,那么所有列均为同一类型(可能是 float64)的数据框是最好的选择。

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


如中所述这篇博文由pandas的主要作者撰写 http://wesmckinney.com/blog/?s=BlockManager,pandas DataFrame 内部由“块”组成。块是一组具有相同数据类型的列。每个块都存储为其块类型的 numpy 数组。因此,如果有五个 int 列和五个 float 列,则会有一个 int 块和一个 float 块。

追加到多类型数组需要追加到每个底层 numpy 数组。附加到 numpy 数组很慢,因为它需要创建一个全新的 numpy 数组。因此,附加到多类型 DataFrame 的速度很慢是有道理的:如果所有列都是一种类型,则只需创建一个新的 numpy 数组,但如果它们是不同的类型,则必须创建多个新的 numpy 数组。

确实,保持数据全部相同类型会加快速度。然而,我想说的主要结论不是“如果效率很重要,请保持所有列的类型相同”。结论是如果效率很重要,请不要尝试附加到数组/数据帧.

这就是 numpy 的工作原理。使用 numpy 数组最慢的部分是首先创建它们。它们具有固定的大小,当您“附加”到其中一个时,您实际上只是用新的大小创建一个全新的大小,这很慢。如果您绝对必须附加它们,您可以尝试诸如弄乱类型之类的方法来减轻痛苦。但最终您必须接受这样的事实:任何时候您尝试附加到 DataFrame(或一般的 numpy 数组)时,您都可能会遭受重大的性能损失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas:为什么附加到浮点数和整数的数据帧会比充满 NaN 的数据帧慢 的相关文章

  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐