【发布时间】: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]
)
filter 和 filter2 都给出完全相同的预期输出。我只是忍不住想有比我的自定义函数更好的方法,func()
解释代码:
series 指的是随时间变化的随机游走数据。 1 是一个台阶,-1 是一个台阶,0 是保持不变。我写了func() 以便能够找到数据何时上升或下降。我希望能够在尽可能少的代码中进行选择、查找、升级或降级。
【问题讨论】:
-
func中的版本对我来说可读性差很多!在不知道为什么要这样做的情况下,我觉得建议任何“更好”的东西都是过早的优化 -
版本..?所以,
series是随时间随机游走的数据,1是上一级,-1是下一级,0是否保持不变。我将func()作为一个通用函数来查看数据何时上升或数据何时下降。然后,我尝试将其尽可能概括,以备将来不相关的项目需要时使用。
标签: python pandas dynamic comparator series