【问题标题】:How to compare panda.Series with a dynamic comparator?如何将 pandas.Series 与动态比较器进行比较?
【发布时间】:2019-07-14 16:32:16
【问题描述】:

我确实有一个可行的解决方案。我很高兴自己真的找到了一个。但是,似乎应该有更好的方法,我目前不知道?

在将 panda.Series 与另一个 panda.Series 或标量进行比较时,我希望能够动态指定要使用的比较器。

我目前的解决方案

    import numpy as np
    import pandas as pd

    def func(data, values, shifts, comparator):
        _if   = comparator[0]( data.shift( shifts[0] ), values[0] )
        _then = comparator[1]( data.shift( shifts[1] ), values[1] )
        _else = comparator[2]( data.shift( shifts[2] ), values[2] )

        return data[ np.where(_if, _then, _else) ]

    if __name__ == '__main__':
        series = pd.Series([1, 1, 0, 1, 1, 1, -1, -1, 0, -1, 1, 1, 1])

        filter = series[ np.where(series == 0, series.shift(1) > 0, series > 0) ]

        filter2 = func(
                     data=series, 
                     values=[0,0,0], 
                     shifts=[0,1,0], 
                     comparator=[pd.Series.eq, pd.Series.gt, pd.Series.gt]
                       )

filterfilter2 都给出完全相同的预期输出。我只是忍不住想有比我的自定义函数更好的方法,func()

解释代码:

series 指的是随时间变化的随机游走数据。 1 是一个台阶,-1 是一个台阶,0 是保持不变。我写了func() 以便能够找到数据何时上升或下降。我希望能够在尽可能少的代码中进行选择、查找、升级或降级。

【问题讨论】:

  • func 中的版本对我来说可读性差很多!在不知道为什么要这样做的情况下,我觉得建议任何“更好”的东西都是过早的优化
  • 版本..?所以,series 是随时间随机游走的数据,1 是上一级,-1 是下一级,0 是否保持不变。我将func() 作为一个通用函数来查看数据何时上升或数据何时下降。然后,我尝试将其尽可能概括,以备将来不相关的项目需要时使用。

标签: python pandas dynamic comparator series


【解决方案1】:

当我说“版本”时,我指的是获得有用结果并将其放入 filterfilter2 的代码,在我看来,它们分别是版本 1 和 2。为了扩展我的“可读性”评论,请注意每个代码中有多少代码:

  1. 第一个版本只有一行代码,很明显它的每个部分在做什么以及为什么
  2. 使用func的版本涉及10行代码,认知负荷要高得多。我,代码的读者,必须将大量状态线程化进出函数

例如,如果我想获得两个连续值 > 0 的值,那么简单的解决方案是:

series[(series > 0) & (series.shift(1) > 0)]

但是使用func,虽然我认为应该可以,但我肯定不能像上面那样简单地写出来。我想用蒙特卡洛链做的更复杂的事情当然不能用它来表达

一般来说,我不鼓励您尝试编写“尽可能通用”的代码,尤其是因为“将来”事情往往不会发生,或者至少发生的方式不同,以至于您的“通用”代码不通用足够的。也就是说,尝试通过这样的练习来思考/工作确实有一个有用的目的,你肯定会找到应用你发现/学到的东西的方法。尝试编写最通用的东西几乎总是一个错误,确定正确的抽象级别很难,需要大量的实践和经验

这种事情发生得足够多,甚至有一个术语:"You aren't gonna need it"。有很多blog articles说类似的话

希望对你有用,抱歉有点啰嗦!

【讨论】:

  • 如果我总是做简单的解决方案,那么我必须尽快完成我的项目!!但实际上,这很有意义。我以为我很聪明,没有意识到 YAGNI 是一个东西。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2013-11-20
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多