【问题标题】:Implementing pandas function to numpy functions将pandas函数实现为numpy函数
【发布时间】:2021-04-28 04:55:00
【问题描述】:

有没有一种方法可以将xy_mean 函数转换为使用pandas 库进行计算,就像y_mean 函数一样。我发现 pandas 函数 Y_mean = pd.Series(PC_list).rolling(number).mean().dropna().to_numpy() 比 numpy 版本 ym = (np.convolve(PC_list, np.ones(shape=(number)), mode='valid')/number)[:-1] 快​​得多。 xy_mean 的等式将是 ((index of value)*value + (index of value)*value)/number 索引号将取决于变量 numbers 的值。因此,下面示例的第一组计算将是(457.334015*1 + 424.440002*2 +394.795990*3)/number,下一组数字将是 (424.440002*2 +394.795990*3 + 408.903992*4)/number,依此类推。如果number = 4 则第一组计算将是(457.334015*1 + 424.440002*2 +394.795990*3 +408.903992*4)/number。设置的平均值计算将一直持续到 PC_list 数组的末尾。

变量:

number = 3
PC_list= np.array([457.334015,424.440002,394.795990,408.903992,398.821014,402.152008,435.790985,423.204987,411.574005,
404.424988,399.519989,377.181000,375.467010,386.944000,383.614990,375.071991,359.511993,328.865997,
320.510010,330.079010,336.187012,352.940002,365.026001,361.562012,362.299011,378.549011,390.414001,
400.869995,394.773010,382.556000])

香草python版本:

y_mean = sum(PC_list[i:i+number])/number
xy_mean = sum([x * (i + 1) for i, x in enumerate(PC_list[i:i+number])])/number

Numpy 版本:

y_mean = (np.convolve(PC_list, np.ones(shape=(number)), mode='valid')/number)[:-1]
xy_mean = (np.convolve(PC_list, np.arange(number, 0, -1), mode='valid'))[:-1]

熊猫版

Y_mean = pd.Series(PC_list).rolling(number).mean().dropna().to_numpy()
xy_mean = ? 

【问题讨论】:

    标签: python pandas function numpy iterator


    【解决方案1】:

    您需要为此定义一个自定义函数,并将其传递给rolling.apply

    >>> multiplier = np.arange(0, number)
    
    >>> def xymean(series):
            return series.mul(multiplier).sum()
    
    >>> pd.Series(PC_list).rolling(number).apply(xymean).dropna().to_numpy()[:-1]
    
    array([2490.601989, 2440.743958, 2409.067016, 2413.002044, 2510.497985,
           2543.348939, 2516.922974, 2459.627961, 2418.983948, 2335.007966,
           2280.283019, 2288.94702 , 2300.19998 , 2279.389953, 2212.294951,
           2080.693968, 1978.774017, 1960.123047, 1989.229066, 2061.27304 ,
           2137.145019, 2167.67804 , 2175.047058, 2221.807067, 2290.639036,
           2361.986998, 2376.473021])
    
    >>> (np.convolve(PC_list, np.arange(number, 0, -1), mode='valid'))[:-1]
     
    array([2490.601989, 2440.743958, 2409.067016, 2413.002044, 2510.497985,
           2543.348939, 2516.922974, 2459.627961, 2418.983948, 2335.007966,
           2280.283019, 2288.94702 , 2300.19998 , 2279.389953, 2212.294951,
           2080.693968, 1978.774017, 1960.123047, 1989.229066, 2061.27304 ,
           2137.145019, 2167.67804 , 2175.047058, 2221.807067, 2290.639036,
           2361.986998, 2376.473021])
    

    但是,由于apply,这会慢一些。此外,您的numpy 版本似乎创建了xy_sum 而不是xy_mean,以使其计算您需要的mean

    >>> (np.convolve(PC_list, np.arange(number, 0, -1), mode='valid')/number)[:-1]
    
    array([830.200663  , 813.58131933, 803.02233867, 804.33401467,
           836.83266167, 847.78297967, 838.97432467, 819.875987  ,
           806.32798267, 778.33598867, 760.09433967, 762.98234   ,
           766.73332667, 759.796651  , 737.43165033, 693.564656  ,
           659.591339  , 653.374349  , 663.07635533, 687.09101333,
           712.381673  , 722.55934667, 725.015686  , 740.60235567,
           763.54634533, 787.32899933, 792.15767367])
    
    >>> def xymean(series):
            return series.mul(multiplier).mean()
    
    >>> pd.Series(PC_list).rolling(number).apply(xymean).dropna().to_numpy()[:-1]
    
    array([830.200663  , 813.58131933, 803.02233867, 804.33401467,
           836.83266167, 847.78297967, 838.97432467, 819.875987  ,
           806.32798267, 778.33598867, 760.09433967, 762.98234   ,
           766.73332667, 759.796651  , 737.43165033, 693.564656  ,
           659.591339  , 653.374349  , 663.07635533, 687.09101333,
           712.381673  , 722.55934667, 725.015686  , 740.60235567,
           763.54634533, 787.32899933, 792.15767367])
    

    【讨论】:

    • 感谢您的实施,没有办法让程序更快正确。改成pandas系列的目的是为了让函数运行速度比numpy函数快。
    • 嗯,使用np.lib.stride_tricks.as_strided,但是内存会出现问题,正如您之前所见。可能还有其他方法,但目前想不到。
    • 好的,谢谢兄弟的帮助。
    猜你喜欢
    • 2010-11-08
    • 2018-10-29
    • 2015-11-13
    • 2020-08-04
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2020-10-10
    • 2020-07-15
    相关资源
    最近更新 更多