Rolling difference in Pandas

前端 未结 4 1676
忘了有多久
忘了有多久 2020-12-10 13:39

Does anyone know an efficient function/method such as pandas.rolling_mean, that would calculate the rolling difference of an array

This is my closest so

相关标签:
4条回答
  • 2020-12-10 13:54

    This should work:

    import numpy as np
    
    x = np.array([1, 3, 6, 1, -5, 6, 4, 1, 6])
    
    def running_diff(arr, N):
        return np.array([arr[i] - arr[i-N] for i in range(N, len(arr))])
    
    running_diff(x, 4)  # array([-6,  3, -2,  0, 11])
    

    For a given pd.Series, you will have to define what you want for the first few items. The below example just returns the initial series values.

    s_roll_diff = np.hstack((s.values[:4], running_diff(s.values, 4)))
    

    This works because you can assign a np.array directly to a pd.DataFrame, e.g. for a column s, df.s_roll_diff = np.hstack((df.s.values[:4], running_diff(df.s.values, 4)))

    0 讨论(0)
  • 2020-12-10 14:01

    You can do the same thing as in https://stackoverflow.com/a/48345749/1011724 if you work directly on the underlying numpy array:

    import numpy as np
    diff_kernel = np.array([1,-1])
    np.convolve(rs,diff_kernel ,'same')
    

    where rs is your pandas series

    0 讨论(0)
  • 2020-12-10 14:03

    If you got KeyError: 0, try with iloc:

    import pandas
    
    x = pandas.DataFrame({
        'x_1': [0, 1, 2, 3, 0, 1, 2, 500, ],},
        index=[0, 1, 2, 3, 4, 5, 6, 7])
    
    x['x_1'].rolling(window=2).apply(lambda x: x.iloc[1] - x.iloc[0])
    
    0 讨论(0)
  • 2020-12-10 14:04

    What about:

    import pandas
    
    x = pandas.DataFrame({
        'x_1': [0, 1, 2, 3, 0, 1, 2, 500, ],},
        index=[0, 1, 2, 3, 4, 5, 6, 7])
    
    x['x_1'].rolling(window=2).apply(lambda x: x.iloc[1] - x.iloc[0])
    

    in general you can replace the lambda function with your own function. Note that in this case the first item will be NaN.

    Update

    Defining the following:

    n_steps = 2
    def my_fun(x):
        return x.iloc[-1] - x.iloc[0]
    
    x['x_1'].rolling(window=n_steps).apply(my_fun)
    

    you can compute the differences between values at n_steps.

    0 讨论(0)
提交回复
热议问题