【问题标题】:Python pandas most common value over rolling windowPython pandas 在滚动窗口上最常见的值
【发布时间】:2022-01-02 05:02:53
【问题描述】:

这是Python pandas most common value over rolling date window 帖子的后续问题。我有一个类似的问题,给定的解决方案不起作用。任何人都可以评论!谢谢

我正在尝试为我的电源状态数据获取滚动窗口多数类,以便忽略一次性读数。在这篇文章Apply mode operation on categorical data in SQL 的帮助下,我在 SQL 中实现了类似的功能。可重现的数据和代码如下。

熊猫系列:

x = pd.Series(['EDC','EDC','EDC','DG','DWN','DWN','EDC','DWN','DWN','DWN','EDC','DWN'],name='Power_State')
x

0     EDC
1     EDC
2     EDC
3      DG
4     DWN
5     DWN
6     EDC
7     DWN
8     DWN
9     DWN
10    EDC
11    DWN
Name: Power_State, dtype: object

代码:

from scipy.stats import mode
x.rolling(window=7).apply(lambda x: mode(x)[0])

错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\window\rolling.py in         _prep_values(self, values)
    322             try:
--> 323                 values = ensure_float64(values)
    324             except (ValueError, TypeError) as err:

pandas\_libs\algos_common_helper.pxi in pandas._libs.algos.ensure_float64()

ValueError: could not convert string to float: 'EDC'

The above exception was the direct cause of the following exception:

TypeError                                 Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\window\rolling.py in _apply_series(self, homogeneous_func, name)
    403         try:
--> 404             values = self._prep_values(obj._values)
    405         except (TypeError, NotImplementedError) as err:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\window\rolling.py in     _prep_values(self, values)
    324             except (ValueError, TypeError) as err:
--> 325                 raise TypeError(f"cannot handle this type ->     {values.dtype}") from err
    326 

TypeError: cannot handle this type -> object

The above exception was the direct cause of the following exception:

DataError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_6220/2483769170.py in <module>
      1 from scipy.stats import mode
      2 
----> 3 x.rolling(window=7).apply(lambda x: mode(x)[0])

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这里的问题是 scipy 的 mode() 函数只支持数值数据。但是,如果您能找到将字符串转换为整数并再次转换回来的方法,则可以解决此问题。有一种方法可以做到这一点,称为factorization。本质上,每个唯一的字符串都被分配了一个唯一的整数。然后,您找到最常见的整数。最常见的整数将对应最常见的字符串。

    以下是分解级数和进行众数计算的方法:

    from scipy.stats import mode
    import pandas as pd
    x = pd.Series(['EDC','EDC','EDC','DG','DWN','DWN','EDC','DWN','DWN','DWN','EDC','DWN'],name='Power_State')
    
    def remove_noise(x):
        # Factorize
        y, label = pd.factorize(x)
        y = pd.Series(y)
        label = pd.Series(label)
        # Correct values
        y = y.rolling(window=7, min_periods=1).apply(lambda x: mode(x)[0])
        # Unfactorize
        y = y.map(label)
        return y
    
    remove_noise(x)
    

    (此代码基于this answer。)

    这给了我这个结果:

    0     EDC
    1     EDC
    2     EDC
    3     EDC
    4     EDC
    5     EDC
    6     EDC
    7     EDC
    8     DWN
    9     DWN
    10    DWN
    11    DWN
    dtype: object
    

    【讨论】:

    • 我目前正在使用一些类似的有效转换概念:x.map({'EDC':1.0, 'DG':2.0, 'SLR':3.0, 'BAT':4.0, 'DWN ':5.0, 'UNDEF':6.0}).rolling(3, center=True).apply(lambda x: x.mode()[0]).map({1.0:'EDC', 2.0:'DG' , 3.0:'SLR', 4.0:'BAT', 5.0:'DWN', 6.0:'UNDEF'}) 但是我有数百万个数据条目,这种双重转换产生了巨大的损失并且非常耗时(尽管我没有'还没有计时)。我尝试使用 groupby() 创建自己的自定义“模式”功能,但仍然没有希望。
    • mode() 运算符仅基于数字数据是否合乎逻辑?是包装限制还是有一些根本原因?
    • @AamirM.Khan 我再看一遍,结果发现 Scipy mode() 没有数字限制 - 它实际上是 Pandas rolling() 的限制。见这里:stackoverflow.com/questions/52657429/…
    • 在速度方面:你为什么不计时并检查一下?
    • 当我使用 list(df.Power_State.rolling(3, center=True)) 时,它会从我的数据中显示正确的窗口元素列表。那么为什么滚动是问题呢?对于时间,我可以为 pandas 执行此操作,但备用 SQL 查询是针对 Google bigquery 数据的,我不知道如何在那边计时。会努力寻找出路。
    猜你喜欢
    • 2018-08-08
    • 2018-05-11
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    相关资源
    最近更新 更多