- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 pandas.rolling_apply
函数在滚动窗口的基础上应用我自己的自定义函数。
但是我的函数需要两个参数,并且还有两个输出。这可能吗?
下面是一个最小的可重现示例...
import pandas as pd
import numpy as np
import random
tmp = pd.DataFrame(np.random.randn(2000,2)/10000,
index=pd.date_range('2001-01-01',periods=2000),
columns=['A','B'])
def gm(df,p):
v =(((df+1).cumprod())-1)*p
return v.iloc[-1]
# an example output when subsetting for just 2001
gm(tmp['2001'],5)
# the aim is to do it on a rolling basis over a 50 day window
# whilst also getting both outputs and also allows me to add in the parameter p=5
# or any other number I want p to be...
pd.rolling_apply(tmp,50,gm)
这会导致错误...因为 gm 有两个参数...
任何帮助将不胜感激...
编辑
根据 Jeff 的评论,我取得了进步,但我仍在为两列或更多列输出而苦苦挣扎,所以如果我改为创建一个新函数(如下),它只返回两个随机数(与之前的计算无关)而不是最后一个v 的行,我收到错误 TypeError: only length-1 arrays can be converted to Python scalars
。如果
def gm2(df,p):
df = pd.DataFrame(df)
v =(((df+1).cumprod())-1)*p
return np.random.rand(2)
pd.rolling_apply(tmp,50,lambda x: gm2(x,5)).tail(20)
如果将 2 更改为 1,则此功能有效...
最佳答案
rolling_apply
将 numpy 数组传递给应用函数(此时),到 0.14 它应该传递一个帧。问题是 here
因此重新定义您的函数以处理 numpy 数组。 (您当然可以在此处构建一个 DataFrame,但您的索引/列名称不会相同)。
In [9]: def gm(df,p):
...: v = ((np.cumprod(df+1))-1)*p
...: return v[-1]
...:
如果您想在自定义函数中使用更多 pandas 函数,请执行此操作(请注意,调用框架的指标未通过 ATM)。
def gm(arr,p):
df = DataFrame(arr)
v =(((df+1).cumprod())-1)*p
return v.iloc[-1]
通过 lambda 传递它
In [11]: pd.rolling_apply(tmp,50,lambda x: gm(x,5)).tail(20)
Out[11]:
A B
2006-06-04 0.004207 -0.002112
2006-06-05 0.003880 -0.001598
2006-06-06 0.003809 -0.002228
2006-06-07 0.002840 -0.003938
2006-06-08 0.002855 -0.004921
2006-06-09 0.002450 -0.004614
2006-06-10 0.001809 -0.004409
2006-06-11 0.001445 -0.005959
2006-06-12 0.001297 -0.006831
2006-06-13 0.000869 -0.007878
2006-06-14 0.000359 -0.008102
2006-06-15 -0.000885 -0.007996
2006-06-16 -0.001838 -0.008230
2006-06-17 -0.003036 -0.008658
2006-06-18 -0.002280 -0.008552
2006-06-19 -0.001398 -0.007831
2006-06-20 -0.000648 -0.007828
2006-06-21 -0.000799 -0.007616
2006-06-22 -0.001096 -0.006740
2006-06-23 -0.001160 -0.006004
[20 rows x 2 columns]
关于使用 rolling_apply 的 Python 自定义函数用于 pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21025821/
我有一个数据框,其中有许多受试者完成了一些试验 (1:800),我想添加一个“ block ”列……每个 block 有 80 个试验。我觉得 rolling_apply 可能是解决方案,但我似乎无法
从这个问题开始 Python custom function using rolling_apply for pandas , 关于使用 rolling_apply。尽管我的函数取得了进展,但我仍在努
这个问题在这里已经有了答案: module 'pandas' has no attribute 'rolling_mean' (3 个答案) 关闭 2 年前。 我正在使用版本为 0.23.4 的 p
我有一个日期间隔不规则的 Pandas 数据框。有没有办法用7天作为移动窗口来计算median absolute deviation ,中位数等..?我觉得我可以以某种方式使用 pandas.roll
我正在尝试滚动计算成交量加权平均价格。 为此,我有一个函数 vwap 可以为我执行此操作,如下所示: def vwap(bars): return ((bars.Close*bars.Volu
我正在使用 pandas.rolling_apply 将数据拟合到分布并从中获取值,但我还需要它报告滚动拟合优度(特别是 p 值)。目前我是这样做的: def func(sample): fi
改进 this question它为在 DataFrame 中的多个列上应用函数提供了一个聪明的解决方案,我想知道是否可以进一步优化该解决方案以提高速度。 环境:Python 2.7.8、Pandas
我想使用 pandas.rolling_apply 函数在滚动窗口的基础上应用我自己的自定义函数。 但是我的函数需要两个参数,并且还有两个输出。这可能吗? 下面是一个最小的可重现示例... impor
设置 我有一个包含三列的 DataFrame: “Category”包含 True 和 False,我已完成 df.groupby('Category') 按这些值进行分组。 “时间”包含记录值的时间
我有一个 pandas 数据框,我想计算列的滚动平均值(在 groupby 子句之后)。但是,我想排除 NaN。 例如,如果 groupby 返回 [2, NaN, 1],则结果应为 1.5,而当前它
我正在尝试将 rollapply 与需要 2 个参数的公式一起使用。据我所知,计算 kendall tau 相关性(包括标准关系校正)的唯一方法(除非您从头开始创建公式)是: >>> import s
我是一名优秀的程序员,十分优秀!