Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:计算固定时间窗口移动平均值的有效方法(现在不是固定时间)_Python_Numpy_Tensorflow_Time_Moving Average - Fatal编程技术网

Python:计算固定时间窗口移动平均值的有效方法(现在不是固定时间)

Python:计算固定时间窗口移动平均值的有效方法(现在不是固定时间),python,numpy,tensorflow,time,moving-average,Python,Numpy,Tensorflow,Time,Moving Average,问题描述 假设我有: 时间的向量,数据类型为numpydatetime64 参数的向量,数据类型为numpyfloat 时间horizon,数据类型为numpytimedelta64 和time.shape==parameters.shape。time的值是唯一的,元素之间的距离不是均匀的 我的目标是:对于时间的每一时刻,计算从time[t-horizon]到time[t]的时间段的参数向量的一些统计信息(例如,平均值、最小值、最大值、总和等) 新手的方法是使用循环(出于性能原因,我不想使用循环

问题描述

假设我有:

  • 时间的向量,数据类型为numpy
    datetime64
  • 参数的向量
    ,数据类型为numpy
    float
  • 时间
    horizon
    ,数据类型为numpy
    timedelta64
  • time.shape==parameters.shape
    time
    的值是唯一的,元素之间的距离不是均匀的

    我的目标是:对于时间的每一时刻,计算从
    time[t-horizon]
    time[t]
    的时间段的参数向量的一些统计信息(例如,平均值、最小值、最大值、总和等)

    新手的方法是使用循环(出于性能原因,我不想使用循环))或一些聚合/重采样(但这并不理想,因为我不想聚合-这会创建一个新的时间向量,而我想保留我的
    时间

    我目前的做法

    我创建了以下矩阵。矩阵可视化是在真实数据上设置的,显示了为什么我需要不同的范围来分别计算每个观测值的统计数据-有时15分钟的历史有5000个观测值,有时大约几百个。这也是我测量的东西-在固定的时间范围内发生了多少事件

    过去=(时间<时间[:,无])和(时间>(时间范围)[:,无]

    plt.imshow(过去)

    第一个问题-为长观测向量创建上述矩阵非常耗时。有没有更好的方法来创建这样的矩阵?呈现的矩阵表示一天的真实数据,但也可能更长(最多50000个唯一观测值,但我的目标也是可伸缩性)

    之后,我使用TensorFlow计算所需的统计数据(首先将矩阵本身相乘-然后我只有
    过去的
    为真的数据,然后计算所需的统计数据(生成矩阵行的平均值、计数或我想要的任何值)。返回的是shape==parameters.shape的向量

    第二个问题-有更好的方法吗?当然,更好是指更快。

    编辑 示例代码

    import datetime
    import matplotlib.pyplot as plt
    
    
    def multiply_time(param, time):
        if param.shape[0] == 1 or param.ndim == 1:
            _temp_param = np.ma.masked_equal(param * time, 0).data
        else:
            _temp_param = np.ma.masked_equal(np.sum(param, axis=1) * time, 0).data
    
        return_param = np.nanmean( np.where(_temp_param != 0, _temp_param, np.nan), axis=1)
    
        return return_param
    
    
    horizon = np.timedelta64(10,'s')
    increment = np.timedelta64(1,'s')
    
    vector_len = 100
    parameters = np.random.rand(vector_len)
    # create time vector where distances between elements are not even
    increment_vec = np.cumsum(np.random.randint(0,10,vector_len)*increment)
    time = np.datetime64(datetime.datetime.now()) + increment_vec
    
    past = (time < time[:, None]) & (time > (time - horizon )[:, None])
    plt.imshow(past)
    result = multiply_time(parameters, past)
    
    import pandas as pd
    pd_result = pd.DataFrame(parameters).rolling(10,1).mean()
    plt.plot(time,result, c='r', label='desired')
    plt.plot(time,parameters,c='g', label='original')
    plt.plot(time,pd_result,c='b', label='pandas')
    plt.legend()
    plt.show()```
    
    
    EDI2:
    
    I guess we can close as answer with pandas rolling gives best results.
    
    导入日期时间
    将matplotlib.pyplot作为plt导入
    def倍增时间(参数,时间):
    如果param.shape[0]==1或param.ndim==1:
    _温度参数=np.ma屏蔽等于(参数*时间,0)。数据
    其他:
    _温度参数=np.ma屏蔽等于(np.sum(参数,轴=1)*时间,0)。数据
    返回参数=np.nanmean(np.where(_temp_param!=0,_temp_param,np.nan),轴=1)
    返回参数
    地平线=np.timedelta64(10,'s')
    增量=np.timedelta64(1,'s')
    向量_len=100
    参数=np.random.rand(向量)
    #创建元素之间距离不均匀的时间向量
    增量向量=np.cumsum(np.random.randint(0,10,向量向量)*增量)
    time=np.datetime64(datetime.datetime.now())+increment\u vec
    过去=(时间<时间[:,无])和(时间>(时间范围)[:,无])
    plt.imshow(过去)
    结果=乘以时间(参数,过去)
    作为pd进口熊猫
    pd_结果=pd.数据帧(参数).滚动(10,1).平均值()
    plt.plot(时间、结果、c='r',标签='所需')
    plt.plot(时间、参数、c='g',标签='original')
    plt.plot(时间、pd_结果、c='b',标签='pandas')
    plt.legend()
    plt.show()```
    EDI2:
    我想我们可以接近答案,因为熊猫滚动会产生最好的结果。
    
    pandas的
    滚动
    功能不能完全做到这一点吗?您可以将时间范围传递给它(pandas行话中的“偏移”):地平线是一个单一的数字还是与时间相同的形状?意思是你的地平线每次都是一个常量还是一个变量?参数的作用是什么?
    ?你还可以提供我们使用的样本数据和预期输出吗?我想你可以比上面的计算更快。@kevinsa5-不,滚动按“行”移动固定窗口。我想按时间移动。因此,滚动100可能滚动3分钟或4,5分钟。我希望它是固定的。@Ehsan-是的,
    horizon
    是一个标量,可以描述为
    horizon=np.timedelta64(15,'m')
    。向量
    参数
    是我想要计算的一个参数(例如,计算每个点的
    参数
    的15分钟平均值),是的,我明天会提供一个例子。@Stefan请检查熊猫滚动的“窗口”参数的文档。是的,它可以“按行”移动正如您所描述的,但您也可以传递一个偏移字符串,如“15min”,以在15分钟的窗口中滚动,而不管有多少行落在该地平线内。文档:“如果它是一个偏移量,那么这将是每个窗口的时间段。每个窗口的大小将根据时间段中包含的观察值而变化。这仅对datetimelike索引有效。”pandas的
    滚动
    函数不完全是这样做的吗?您可以给它一个时间范围(pandas行话中的“偏移量”):地平线是一个单一的数字还是与时间相同的形状?意思是你的地平线每次都是一个常量还是一个变量?参数的作用是什么?
    ?你还可以提供我们使用的样本数据和预期输出吗?我想你可以比上面的计算更快。@kevinsa5-不,滚动按“行”移动固定窗口。我想按时间移动。因此,滚动100可能滚动3分钟或4,5分钟。我希望它是固定的。@Ehsan-是的,
    horizon
    是一个标量,可以描述为
    horizon=np.timedelta64(15,'m')
    。向量
    参数
    是我想要计算的一个参数(例如,计算每个点的
    参数
    的15分钟平均值),是的,我明天会提供一个例子。@Stefan请检查文档