使用 groupby 后在 Pandas 中计算 np.diff 会导致意外结果

2024-03-16

我有一个数据框,我正在尝试向其附加一列连续差异。我找到了一种我非常喜欢的方法(并且很好地概括了我的用例)。但一路上我注意到一件奇怪的事情。你能帮我理解一下吗?

这是一些具有正确结构的数据(根据答案建模的代码here https://stackoverflow.com/a/20649094/2501018):

import pandas as pd
import numpy as np
import random
from itertools import product

random.seed(1)       # so you can play along at home
np.random.seed(2)    # ditto

# make a list of dates for a few periods
dates = pd.date_range(start='2013-10-01', periods=4).to_native_types()
# make a list of tickers
tickers = ['ticker_%d' % i for i in range(3)]
# make a list of all the possible (date, ticker) tuples
pairs = list(product(dates, tickers))
# put them in a random order
random.shuffle(pairs)
# exclude a few possible pairs
pairs = pairs[:-3]
# make some data for all of our selected (date, ticker) tuples
values = np.random.rand(len(pairs))

mydates, mytickers = zip(*pairs)
data = pd.DataFrame({'date': mydates, 'ticker': mytickers, 'value':values})

太好了。这给了我一个像这样的框架:

     date        ticker      value
0    2013-10-03  ticker_2    0.435995
1    2013-10-04  ticker_2    0.025926
2    2013-10-02  ticker_1    0.549662
3    2013-10-01  ticker_0    0.435322
4    2013-10-02  ticker_2    0.420368
5    2013-10-03  ticker_0    0.330335
6    2013-10-04  ticker_1    0.204649
7    2013-10-02  ticker_0    0.619271
8    2013-10-01  ticker_2    0.299655

我的目标是向该数据帧添加一个新列,其中将包含顺序更改。为了做到这一点,需要数据,但排序和差异需要“逐个股票代码”完成,以便另一个股票代码中的间隙不会导致给定股票代码出现 NA。我想在不以任何其他方式扰乱数据帧的情况下执行此操作(即,我不希望根据进行差异所需的内容重新排序生成的数据帧)。以下代码有效:

data1 = data.copy() #let's leave the original data alone for later experiments
data1.sort(['ticker', 'date'], inplace=True)
data1['diffs'] = data1.groupby(['ticker'])['value'].transform(lambda x: x.diff())
data1.sort_index(inplace=True)
data1

并返回:

     date        ticker      value       diffs
0    2013-10-03  ticker_2    0.435995    0.015627
1    2013-10-04  ticker_2    0.025926   -0.410069
2    2013-10-02  ticker_1    0.549662    NaN
3    2013-10-01  ticker_0    0.435322    NaN
4    2013-10-02  ticker_2    0.420368    0.120713
5    2013-10-03  ticker_0    0.330335   -0.288936
6    2013-10-04  ticker_1    0.204649   -0.345014
7    2013-10-02  ticker_0    0.619271    0.183949
8    2013-10-01  ticker_2    0.299655    NaN

到目前为止,一切都很好。如果我用此处显示的更简洁的代码替换上面的中间行,一切仍然有效:

data2 = data.copy()
data2.sort(['ticker', 'date'], inplace=True)
data2['diffs'] = data2.groupby('ticker')['value'].diff()
data2.sort_index(inplace=True)
data2

快速检查表明,事实上,data1等于data2。但是,如果我这样做:

data3 = data.copy()
data3.sort(['ticker', 'date'], inplace=True)
data3['diffs'] = data3.groupby('ticker')['value'].transform(np.diff)
data3.sort_index(inplace=True)
data3

我得到一个奇怪的结果:

     date        ticker     value       diffs
0    2013-10-03  ticker_2    0.435995    0
1    2013-10-04  ticker_2    0.025926   NaN
2    2013-10-02  ticker_1    0.549662   NaN
3    2013-10-01  ticker_0    0.435322   NaN
4    2013-10-02  ticker_2    0.420368   NaN
5    2013-10-03  ticker_0    0.330335    0
6    2013-10-04  ticker_1    0.204649   NaN
7    2013-10-02  ticker_0    0.619271   NaN
8    2013-10-01  ticker_2    0.299655    0

这里发生了什么?当您致电.diffPandas 对象上的方法,是不是只是调用np.diff?我知道有一个diff方法上的DataFrame类,但我不知道如何将其传递给transform没有lambda我以前制作的函数语法data1工作。我错过了什么吗?为什么是diffs列于data3古怪?我怎样才能叫熊猫diff内的方法transform无需编写lambda去做吧?


很好的易于重现的例子!!更多的问题应该是这样的!

只需传递一个 lambda 来进行转换(这相当于直接传递一个函数对象,例如 np.diff (或 Series.diff)。所以这相当于 data1/data2

In [32]: data3['diffs'] = data3.groupby('ticker')['value'].transform(Series.diff)

In [34]: data3.sort_index(inplace=True)

In [25]: data3
Out[25]: 
         date    ticker     value     diffs
0  2013-10-03  ticker_2  0.435995  0.015627
1  2013-10-04  ticker_2  0.025926 -0.410069
2  2013-10-02  ticker_1  0.549662       NaN
3  2013-10-01  ticker_0  0.435322       NaN
4  2013-10-02  ticker_2  0.420368  0.120713
5  2013-10-03  ticker_0  0.330335 -0.288936
6  2013-10-04  ticker_1  0.204649 -0.345014
7  2013-10-02  ticker_0  0.619271  0.183949
8  2013-10-01  ticker_2  0.299655       NaN

[9 rows x 4 columns]

我相信np.diff不遵循 numpy 自己的 unfunc 准则来处理数组输入(它尝试各种方法来强制输入和发送输出,例如__array__输入时__array_wrap__关于输出)。我不太清楚为什么,请查看更多信息here http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#internal-refactoring。所以底线是np.diff没有正确处理索引并进行自己的计算(在这种情况下是错误的)。

Pandas 有很多方法,它们不仅仅调用 numpy 函数,主要是因为它们处理不同的数据类型,处理 nan,在这种情况下,处理“特殊”差异。例如您可以将时间频率传递给 datelike-index ,它会计算实际比较的 n 数量。

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

使用 groupby 后在 Pandas 中计算 np.diff 会导致意外结果 的相关文章

  • 有没有办法清理 jinja2 生成的 html?

    我们使用 jinja2 来创建 html 但是 由于我们在 jinja 中执行许多循环和其他操作来生成 html 所以 html 看起来 很丑 注意 这只是为了美观 我们可以做些什么来清理 html 吗 除了清理我们的 jinja2 代码之
  • 通过 SSH 的 Pygame 不注册击键(Raspberry Pi 3)

    所以我得到了 raspi 3 和简单的 8x8 LED 矩阵 在玩了一些之后 我决定用 pygame 的事件制作一个简单的蛇游戏 显示在该矩阵上 我之前没有 pygame 的经验 除了 LED 矩阵之外 没有连接任何屏幕 显示器 所以最初的
  • Scrapy 未通过请求回调从项目中的已抓取链接返回附加信息

    基本上 下面的代码会抓取表格的前 5 项 其中一个字段是另一个 href 单击该 href 会提供更多信息 我想收集这些信息并将其添加到原始项目中 所以parse应该将半填充的项目传递给parse next page然后刮掉下一位并返回完成
  • 如何使用 tweepy 仅提取主题标签中的文本?

    我想为我的情感分析项目提取主题标签 但是我得到了一个字典列表 其中包含所有主题标签及其在推文中的索引 我只想要文字 我的代码 data tweepy Cursor api search q since a i until b i items
  • Python Raspberry pi - 如果路径不存在,则跳过循环

    我有一个收集温度 文本文件中的值 的功能 它使用部分预定义的路径 但是 有时如果温度传感器未加载 断开连接 则路径不存在 如果路径不可用 如何设置条件或例外来跳过循环 我想使用 continue 但我不知道要设置什么条件 def read
  • 带有 UnboundLocalError 的本地和全局引用

    我不太明白为什么代码 def f print s s foo f 运行得很好但是 def f print s s bar s foo f 给我 UnboundLocalError 我知道我可以通过声明来解决这个问题s作为函数内的全局变量或简
  • python 没有名为serial的模块

    我的 python 程序有问题 我编写了程序来将数据 温度 从 arduino 获取到我的树莓派 sqlite 数据库 但它在第 4 行 导入串行 处给了我一个错误 提示 ImportError 没有名为串行的模块 我使用 python3
  • 构建一个简单的解析器,能够使用 PyParse 解析不同的日期格式

    我正在构建一个简单的解析器 它接受如下查询 显示 fizi 从 2010 年 1 月 1 日到 2006 年 2 月 11 日的提交 到目前为止我有 class QueryParser object def parser self stmn
  • 通过Python通过蓝牙发送消息或数据

    如何通过 python 通过蓝牙发送消息 而无需输入数字等密钥身份验证 我用过 pybluez 但我收到了这个错误 File send line 12 in
  • Jupyter 笔记本中未显示绘图

    我正在尝试为 Anscombe 数据集创建 2x2 图 加载数据集并分离数据集中的每个类 import seaborn as sns import matplotlib pyplot as plt anscombe sns load dat
  • Keras ImageDataGenerator 相当于 csv 文件

    我在文件夹中排序了一堆数据 如下图所示 我需要构建一个 DataIterator 以便将数据放入神经网络模型中 当数据是图像时 我找到了很多例子来解决这个问题 使用 Keras 类图像数据生成器及其方法流自目录 但当数据是 csv 结构时则
  • 如何编辑 QProgressBar 的样式表

    我无法在我的应用程序中编辑进度条的颜色 仅编辑文本颜色 pyhton 3 9 PySide6 QT Creator 7 0 2 Python应用程序 https i stack imgur com 6hKFI png import sys
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • 无法编辑,但可以在 Django 管理中添加新的内联

    这是我的模型 class Note note models TextField null False blank False editable True user models ForeignKey to User null True bl
  • 如何配置应用程序中的所有记录器

    Python 的日志记录模块允许模块或类定义自己的记录器 不同的记录器可以有不同的处理程序 其中一些可能选择记录到文件 而另一些则选择记录到标准输出 现在 我的应用程序使用其中几个模块 每个模块都有自己的记录器 这些记录器具有各种处理程序
  • Python Pandas DateOffset 使用另一列中的值

    我以为这会很容易 但下面的内容并不适合我想要的 只是尝试通过使用另一列中的值将天数添加到预先存在的日期时间列来计算新的日期列 我下面的 偏移 列只有 1 位数字 df new date df orig date apply lambda x
  • 如何检索 SQLAlchemy 结果集的 python 列表? [复制]

    这个问题在这里已经有答案了 我有以下查询来检索单列数据 routes query select schema stop times c route number schema stop times c stop id stop id dis
  • 如何在 Python 中将 .docx 转换为 .txt

    我想将大量 MS Word 文件转换为纯文本格式 我不知道如何在 Python 中做到这一点 我在网上找到了以下代码 我的路径是本地路径 所有文件名都类似于 cx xxx 即 c1 000 c1 001 c2 000 c2 001 等 fr
  • 从多个大型 NetCDF 文件中提取数据的快速/高效方法

    我只需要从全局网格中提取特定节点集的数据 由纬度 经度坐标 按 5000 10000 的顺序 给出 这些数据是水力参数的时间序列 例如波高 全局数据集很大 因此分为许多 NetCDF 文件 每个 NetCDF 文件大小约为 5GB 包含整个
  • 使 flake8 区分未定义函数和星型导入

    我有一个相当大的项目 我试图在发布之前清理它 但是当我运行 flake8 时 我得到了大量的 F405

随机推荐

  • 显示来自 Rails 应用程序的 Twitter feed

    我已经能够让用户通过 OmniAuth 登录 Twitter 我遵循 Railscast 235 6 并制作了一个简单的应用程序 现在我正在尝试显示已登录用户的 Twitter 提要 谁能告诉我这是怎么做到的 如何初始化 Twitter 如
  • Git http.proxy 设置

    我试图弄清楚这个 git 问题 有一次我搞乱了 http proxy 变量 现在这只是废话 asdf 所以推动不起作用 我不知道之前的代理设置是什么 我什至不知道代理服务器是什么 有什么方法可以将 http proxy 设置为正确的值吗 现
  • 将 Zookeeper 从 3.3.X 升级到 3.4.X 时,我需要了解哪些信息?

    我有一个 Zookeeper 整体 我想从 3 3 X 分支升级到 3 4 X 分支 这可以在实时集群上完成吗 需要停机吗 有什么说明可以在某处找到吗 据我检查 升级 ZooKeeper 有哪些选项 流程 有两种主要方法可以做到这一点 1
  • 数据报总是被完整接收吗?

    大多数数据报接收函数 例如c的recv或read java的DatagramPacket类或python的SocketServer 都包含找出接收数据量的可能性 c int amount recv sock buf n MSG WAITAL
  • ASP.NET Web API - OWIN - TokenEndPointPath 在 IIS 中不起作用

    我的startup cs 中有以下代码 当 Web API 项目部署到 IIS 中网站的根目录时 在 IIS Express 中设置 TokenEndpointPath 效果非常好 但是 如果我托管在 IIS 中的嵌套应用程序 即网站内的应
  • 使用php从linux访问windows共享文件夹

    我需要能够使用在 Linux 服务器上运行的 php 脚本访问多个 Windows 服务器上的一些共享文件夹 我只需要获取文件夹中包含的文件的名称以及创建它们的时间戳 到目前为止 我想到的唯一解决方案是在 Linux 中安装共享并从那里访问
  • C# 在锯齿状数组中快速查找值的方法

    我有一个锯齿状数组String 现在我需要找到具有特定值的数组String n 0 我现在所拥有的只是一个简单的 foreach foo in bar if foo 0 needle return foo 正如您所看到的 由于显而易见的原因
  • 在 setup.py 中安装 numpy + pandas 作为依赖项

    安装中numpy pandas通过 setuptools 作为 setup py 中的依赖项对我不起作用 这与缺少依赖项无关 如果我通过安装 numpypip install numpy然后python setup py develop一切
  • 将两种不同的字体样式应用于 TextView

    我想将两种不同的字体样式应用于单个 TextView 中的文本 我的情况与Android 两句话 两种样式 一个TextView https stackoverflow com questions 8999781 android two s
  • 检测客户端中止请求 Jersey

    我有 Jersey 提供轻松的网络服务 客户端经常会中止通过 ajax 完成的请求 使用 ajax 中止方法 如下所述中止 ajax 请求 https stackoverflow com questions 4551175 how to c
  • 构造函数中引发的异常的处理程序是什么? [复制]

    这个问题在这里已经有答案了 我是 C 异常处理的新手 我心中的规则是 如果没有找到异常处理程序调用链 函数调用的堆栈 然后终止函数被调用 处理程序是一个catch block 但是 我无法理解以下行为 include
  • Java重复模式匹配

    我正在尝试获取 Java 中简单正则表达式的每个重复匹配项 它匹配 中包含的任何字符串 只要它不包含 字符 例如 它会匹配 a nice repetitive pattern 事先不知道存在多少个这样的组 并且我无法找到通过模式匹配器访问各
  • 当从 dom-repeat 函数设置时,属性更改未反映在 UI 中 - Polymer

    我有对象数组和属性 我的 dom repeat 结构如下所示
  • 您正在使用 Microsoft 企业库吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在android中添加徽章到选项卡

    我想像在 iPhone 中一样在我的应用程序中添加徽章到选项卡 iPhone 中使用的徽章屏幕截图位于以下链接 i have done some image like badge in android app its screen shot
  • R:删除数值向量中的 NA

    我是一名 R 新手 面临一些挑战 我正在处理一个从 csv 文件中读取的大型数据框 我的数值向量包含 NA 这阻止我进行分析 如何摆脱这些 NA 以便我可以真正利用我的数据做一些事情 对于特定变量 x is na x or na omit
  • Stripe 结账不接受元数据

    我已经集成了 Stripe checkout 最新版本 并且需要发送额外的数据 以便我可以协调以后的 webhook Stripe 拒绝元数据并出现以下错误 Fatal error Uncaught exception Stripe Err
  • 我是否需要付费 Apple 开发者帐户才能获得 .p12 认证来推送通知?

    我正在使用 iOS 测试 AWS Mobile Hub 以实现推送通知功能 AWS 要求上传 p12 证书 该证书可以通过 Apple Developer 网站获取 但根据教程 维护标识符 设备和配置文件 没有出现在我的 Apple 开发者
  • 如何使用 JavaScript 循环长字符串以在每次匹配后插入新字符串

    我有一个变量 其中包含表示 XML 文档的长字符串 在该字符串中 我需要搜索每个自关闭标签并扩展到两个匹配的开始 结束标签 我真的不知道如何解决这个问题 非常感谢您的建议 此时 我所知道的是如何通过正则表达式匹配自关闭标签 lt gt 这是
  • 使用 groupby 后在 Pandas 中计算 np.diff 会导致意外结果

    我有一个数据框 我正在尝试向其附加一列连续差异 我找到了一种我非常喜欢的方法 并且很好地概括了我的用例 但一路上我注意到一件奇怪的事情 你能帮我理解一下吗 这是一些具有正确结构的数据 根据答案建模的代码here https stackove