Python 熊猫0.25.3';在某些情况下,s剪辑在重采样创建的块上崩溃

Python 熊猫0.25.3';在某些情况下,s剪辑在重采样创建的块上崩溃,python,pandas,debugging,time-series,pandas-groupby,Python,Pandas,Debugging,Time Series,Pandas Groupby,关于熊猫0.25.3中基于时间的groupby的结果,我有一个非常狭隘的问题 我正在编写一个库来执行各种基于时间的聚合,并在非常特定的情况下遇到了可能的bug。它不会出现在pandas>=1中,但如果可能的话,我仍然希望能够支持pandas 0.25.3(它仍然与我们的用户相关) 我缩小的以下案例导致“pandas/core/internals/blocks.py in where”中异常捕获的无限循环,最终导致python崩溃,退出代码为134: import pandas as pd da

关于熊猫0.25.3中基于时间的groupby的结果,我有一个非常狭隘的问题

我正在编写一个库来执行各种基于时间的聚合,并在非常特定的情况下遇到了可能的bug。它不会出现在pandas>=1中,但如果可能的话,我仍然希望能够支持pandas 0.25.3(它仍然与我们的用户相关)

我缩小的以下案例导致“pandas/core/internals/blocks.py in where”中异常捕获的无限循环,最终导致python崩溃,退出代码为134:

import pandas as pd

data = pd.DataFrame(
    data=[15.0, 0.0, 0.0, -10.0,  0.0],
    index=pd.to_datetime(
        [
            "2018-01-01 00:00:00.000000",
            "2018-01-01 00:25:00.000000",
            "2018-01-01 00:30:00.000000",
            "2018-01-01 00:31:00.000000",
            "2018-01-01 00:47:00.000000",
        ]
    )
)


def clip_low_at_0(x):
    return x.clip(lower=0).sum()


data.resample("30min").agg(clip_low_at_0)
我的Python版本是3.7.6、0.25.3

作为补充说明,它可以很好地与迭代器配合使用:

for entry, group in data.resample("30min"):
    clip_low_at_0(x=group)
data.groupby(pd.Grouper(freq=“30min”)
也有同样的问题

导致问题的组是这一组(第二组):

据我所知,这似乎发生了:

  • 只有一定数量的值,即2个值没有问题,3和4有问题,7个
  • 只有特定的值组合。这一个触发了它,有些不触发,有些触发
  • 与任何索引值都不相关
  • 集团的立场很重要
实际上,再进一步挖掘,似乎导致
.clip()
上出现错误的组生成的序列已损坏。尝试
.copy()
失败,其他一些方法(如序列化方法)以错误告终。也许我没有正确地使用group和agg,但是有没有另一种好的方法使用pandas来计算呢

让我烦恼的是,它似乎在很多情况下都有效,而熊猫>=1.0.0就是这样

如果它碰巧是一只真正的虫子,我当然会在一期中向熊猫队报告。(编辑:熊猫似乎并不鼓励对旧版本的bug报告)

编辑:为了澄清,我想:

1) 知道这是误用还是groupby/agg端的实际错误


2) 如果有比自己做剪辑更好的解决方法(x.loc[x<0]=0)。因为此组将来可能会导致其他问题,而其他函数用于聚合。我想保留重采样方法,不必自己处理索引。如果可能的话,我实际上使用相同的结构进行了一些其他聚合。

我可以重现您的问题,但似乎仅限于使用
clip()
,不是吗?其他函数如
round()
等似乎运行良好。所以在我看来,这绝对像一只熊猫虫

作为一种常规解决方法您可以直接在聚合函数中使用numpy函数而不是Pandas函数:

def clip_low_at_0(x):
    return numpy.clip(x, a_min=0, a_max=None).sum()
尽管如此,为了完整性:对于熊猫的
clip()
的bug行为,一个特定的解决方案(也是一个奇怪的解决方案)是明确设置一个上限。虽然我还没有弄明白为什么会这样,但事实上确实如此(至少在这里):

最后(您已经知道):不需要在聚合函数中剪裁值,您可以预先将其应用于整个数据帧:

data.clip(lower=0).resample("30min").sum()

你能说出你的确切问题吗?你在寻找解决办法吗?为什么你不能使用迭代器方法?@amain我刚刚更新了这个问题,明显的解决方法是手动制作剪辑,但我想知道我是否做得对,并且希望保留组方法在索引管理中的优势。谢谢你的回答。它并不完全局限于
剪辑
,因为创建的
系列
对象不是正确的对象(例如
x.copy()
失败),因此其他方法可能会出现其他问题。但这似乎是一个棘手的错误,所以我对提供的解决方法没有意见:)(我以前不能剪辑,因为我实际上在程序中以编程方式应用了几个聚合函数,但numpy、手动剪辑或更高的限制就可以了)
def clip_low_at_0(x):
    # using numpy's 'double' dtype max value here, but this could
    # be replaced with sys.maxsize or any other sensible constant
    maxval = numpy.finfo('d').max
    return x.clip(lower=0, upper=maxval).sum()
data.clip(lower=0).resample("30min").sum()