在具有多个参数的 pandas 数据帧上应用滚动函数

2024-03-13

我正在尝试在 pandas 数据帧上应用具有 3 年窗口的滚动函数。

import pandas as pd

# Dummy data
df = pd.DataFrame({'Product': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
                   'Year': [2015, 2016, 2017, 2018, 2015, 2016, 2017, 2018],
                   'IB': [2, 5, 8, 10, 7, 5, 10, 14],
                   'OB': [5, 8, 10, 12, 5, 10, 14, 20],
                   'Delta': [2, 2, 1, 3, -1, 3, 2, 4]})

# The function to be applied
def get_ln_rate(ib, ob, delta):
    n_years = len(ib)
    return sum(delta)*np.log(ob[-1]/ib[0]) / (n_years * (ob[-1] - ib[0]))

预期输出是

  Product  Year  IB  OB  Delta  Ln_Rate
0       A  2015   2   5      2     
1       A  2016   5   8      2    
2       A  2017   8  10      1   0.3353
3       A  2018  10  12      3   0.2501
4       B  2015   7   5     -1  
5       B  2016   5  10      3
6       B  2017  10  14      2   0.1320
7       B  2018  14  20      4   0.2773

我努力了

df['Ln_Rate'] = df.groupby('Product').rolling(3).apply(lambda x: get_ln_rate(x['IB'], x['OB'], x['Delta']))

但这是行不通的。

我发现了好几个类似的帖子

将自定义滚动函数应用于数据框 https://stackoverflow.com/questions/45517686/applying-custom-rolling-function-to-dataframe- 这个没有明确的答案

熊猫滚动应用自定义 https://stackoverflow.com/questions/40954560/pandas-rolling-apply-custom- 这个没有多个参数

在滚动窗口上的 pandas 数据框上应用自定义函数 https://stackoverflow.com/questions/30806838/apply-custom-function-on-pandas-dataframe-on-a-rolling-window- 这个有rolling.apply...但它不显示语法。

两者似乎都不对劲。任何指向正确语法的指示将不胜感激。


我通过重用滚动窗口解决了这个问题。

import numpy as np

WINDOW_SIZE = 3

rw = df.groupby('Product').rolling(WINDOW_SIZE)

df = df.assign(delta_sum=rw['Delta'].agg(np.sum).reset_index()['Delta'],
               ib_first=rw['IB'].apply(lambda xs: xs[0]).reset_index()['IB'],
               ob_last=rw['OB'].apply(lambda xs: xs[-1]).reset_index()['OB'])

df['ln_rate'] = df['delta_sum']*np.log(df['ob_last']/df['ib_first']) / (WINDOW_SIZE * (df['ob_last'] - df['ib_first']))

其结果是:

  Product  Year  IB  OB  Delta  delta_sum  ib_first  ob_last   ln_rate
0       A  2015   2   5      2        NaN       NaN      NaN       NaN
1       A  2016   5   8      2        NaN       NaN      NaN       NaN
2       A  2017   8  10      1        5.0       2.0     10.0  0.335300
3       A  2018  10  12      3        6.0       5.0     12.0  0.250134
4       B  2015   7   5     -1        NaN       NaN      NaN       NaN
5       B  2016   5  10      3        NaN       NaN      NaN       NaN
6       B  2017  10  14      2        4.0       7.0     14.0  0.132028
7       B  2018  14  20      4        9.0       5.0     20.0  0.277259

重置索引是必要的,以便将分组的 DataFrame 转换回其初始形状。

希望有帮助。

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

在具有多个参数的 pandas 数据帧上应用滚动函数 的相关文章

随机推荐

  • ggplot:向现有分组箱线图添加新数据

    我用 ggplot2 创建了一个分组箱线图 现在我想通过以下方式向现有绘图添加附加数据 我每个月都有one 最佳 值应显示为点 并且这些点应通过线连接 这是期望的状态 我如何将这些点和线添加到我的绘图中 我可以将连接线放在箱线图后面吗 这是
  • IIS SSL 错误“ssl_error_rx_record_too_long”

    我使用以下 SSL 命令创建了一个证书 makecert r pe n CN www yourserver com b 01 01 2000 e 01 01 2036 eku 1 3 6 1 5 5 7 3 1 ss my sr local
  • 我在哪里可以了解“shell:”URI?

    我刚刚意识到有一个shell URI 但每个搜索引擎似乎都认为shell and shell是同一件事 我唯一发现的是你可以输入shell startup直接在资源管理器中 XP 和 7 测试过 可以看到明显的效果 这已经很好了 因为没有
  • 强制 JTable 在仍处于编辑模式时将数据“提交”到模型

    我有一个 JTable 如下 因此 当 JTable 仍处于编辑模式时 在 Dividend 列处有键盘光标闪烁 直接单击 确定 不会将数据提交到表模型中 单击 确定 仅关闭对话框 我需要明确按 ENTER 键 以便将数据提交到表模型中 当
  • SNMP:创建自定义 OID

    我需要自定义 OID 来监控我的一些软件状态 但我就是不明白 如何在Windows XP系统中创建自定义OID 如 1 3 6 1 4 1 30891 100 103 我需要其中一些人在那里写一些信息并在需要时阅读它 但我不知道如何在系统中
  • Java/LWJGL:OpenGL 中的 Z 轴表现得像左手坐标系

    最近 我寻求帮助 https stackoverflow com q 18836484 1530508关于 OpenGL 中的 3D 相机旋转 这个答案 https stackoverflow com a 18836618 1530508接
  • PyTorch:如何使用 DataLoaders 自定义数据集

    如何利用torch utils data Dataset and torch utils data DataLoader根据您自己的数据 不仅仅是torchvision datasets 有没有办法使用内置的DataLoaders他们使用的
  • 我可以使用 *.tlb 文件而不使用 Regasm 在计算机上注册它吗

    我们正在支持老化的 VB6 系统 我们已在 Net 中为其编写了新代码 将代码放入程序集中 然后导出 tlb 文件以与 VB6 代码库一起使用 我的问题是 在我希望运行代码的每台计算机上 我是否必须使用 Regasm 来注册类型库 我之所以
  • WCF 最大消息大小配额

    我正在尝试调用 WCF 服务 托管在 Windows 服务中 而不是 IIS 但收到以下错误 最大消息大小配额 传入消息已超出 对于远程通道 请参阅 服务器日志以获取更多详细信息 我尝试将 MaxReceivedMessageSize 和
  • 有序 logit R polr 的聚类标准误差 - 估计中删除的值

    我对 R 很陌生 并且习惯了非常基本的应用程序 现在我遇到了一个问题需要帮助 我正在寻找一种方法聚类标准误 for an 有序逻辑回归 my estimation is similar to this https stats idre uc
  • app.component.css 中的 CSS 样式未应用于选项卡正文内容

    你能告诉我为什么这里没有应用填充 即使我在 app component css 文件中将 padding top 设置为 20px 如果我在 styles css 文件中设置它 它将起作用 不知道为什么当我将 css 属性移动到 app c
  • 使用 Ramda 镜头更改对象中的值属性

    我想知道如何使用 Ramda 镜头更改对象属性 目前 我有一个深层状态 buckets blocks messages replies id 0 text text 0 value simple value 0 id 1 text text
  • 在 Spring 中获取 FileNotFoundException

    我想使用 BeanFactory 创建 bean 但出现异常 java io FileNotFoundException WEB INF businesscaliber servlet xml Resource res new FileSy
  • 将 Java 2d 图形图像保存为 .png 文件

    我正在绘制模拟生成的信息的图形表示 我显示了图表 但我遇到的问题是如何将其保存为 png 当它保存 png 时 文件是全黑的 所以它不是保存我的图形 而是创建一些空白 png 文件 问题是我很难弄清楚如何转换为 BufferedImage
  • TypeScript 中的 function 和 => 有什么区别? [复制]

    这个问题在这里已经有答案了 目前 我正在学习 TypeScript 我对关键字函数和 gt 粗箭头 之间的区别感到非常困惑 请看下面的代码 interface Counter start number interval number res
  • Qt BLE For Android:特性更新不会触发characteristicChanged信号

    这是我们拥有的设备传输自定义服务的自定义特征的定期更新的东西 该设备中的服务和特征是通过 XML 文件定义的 当然 这是指蓝牙BLE协议 我想做的是创建一个简单的 Qt Android 应用程序 连接到设备并监控更新 我已经发现了该服务并将
  • C++ Windows 线程池(非升压/c++11)

    有没有办法仅使用 C 或 Windows C 函数创建线程池 我无法访问 boost 或任何库 我可以访问代码项目 但找不到任何非 UNIX 的内容 并且我发现很难找到实现线程池的方法 我使用的是 VS2010 它还不支持 C 11 线程
  • Android JUnit 测试因 java.lang.VerifyError 失败

    Aloha 我一直遵循这里的指导方针 http developer android com resources tutorials testing helloandroid test html http developer android
  • 替换从 javascript 获取的字符

    我正在制作一个程序 从 flickr 集中提取所有图片 我在代码中发现每个图片链接都有一个大字符串 问题是这样的 链接具有以下格式 https c2 staticflickr com 4 3925 14562233192 3fe2b8fe1
  • 在具有多个参数的 pandas 数据帧上应用滚动函数

    我正在尝试在 pandas 数据帧上应用具有 3 年窗口的滚动函数 import pandas as pd Dummy data df pd DataFrame Product A A A A B B B B Year 2015 2016