Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cci 计算很慢,有办法提高效率吗?谢谢 #29

Open
shenmufeng opened this issue May 3, 2022 · 2 comments
Open

cci 计算很慢,有办法提高效率吗?谢谢 #29

shenmufeng opened this issue May 3, 2022 · 2 comments

Comments

@shenmufeng
Copy link

如题

@mpquant
Copy link
Owner

mpquant commented May 4, 2022

能优化AVEDEV就能提高效率

def AVEDEV(S, N):         #平均绝对偏差  (序列与其平均值的绝对差的平均值)   
    return pd.Series(S).rolling(N).apply(lambda x: (np.abs(x - x.mean())).mean()).values 

@jxxplzwakeup
Copy link

import numpy as np
import numba


def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
                                           

def AVEDEV2(arr, N):
    res = np.empty(len(arr))
    res[: N-1] = np.nan
    tmp = rolling_window(arr, N)
    
    # for i, arr in enumerate(tmp):
    #     res[N+i-1] = np.mean(np.abs(arr - np.mean(arr)))
        
    return _avedev(tmp, res, N)

@numba.jit
def _avedev(rolling_arr, res, N):
    i = 0
    for arr in rolling_arr:
        res[N+i-1] = np.mean(np.abs(arr - np.mean(arr)))
        i += 1
    return res

Test

arr = np.random.randn(10000)

In [63]: %timeit AVEDEV2(arr, 20) # My version
Out [63]: 1.06 ms ± 1.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [64]: %timeit AVEDEV(arr, 20) # original version
Out [64]: 2.29 s ± 12.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants