Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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_Pandas_Datetime - Fatal编程技术网

Python加速函数,用于分配与时间相关的元素

Python加速函数,用于分配与时间相关的元素,python,pandas,datetime,Python,Pandas,Datetime,我有以下问题:下面的代码相对较慢,我打赌有一种更快的方法来完成适当的工作 我有两个熊猫时间序列。数据Y为每日频率,数据X为每月频率。它们在时间上重叠。我想创建一个矩阵newX,它有len(dataY)行和lags列,其中lags是从dataX返回的每月观察数。因此,对于dataY中的每一天,我希望在newX中有一行记录到该天的过去滞后观测值 下面是我的函数和运行函数的示例 import pandas as pd import numpy as np def get_X(dataY, dataX,

我有以下问题:下面的代码相对较慢,我打赌有一种更快的方法来完成适当的工作

我有两个熊猫时间序列。数据Y为每日频率,数据X为每月频率。它们在时间上重叠。我想创建一个矩阵newX,它有len(dataY)行和lags列,其中lags是从dataX返回的每月观察数。因此,对于dataY中的每一天,我希望在newX中有一行记录到该天的过去滞后观测值

下面是我的函数和运行函数的示例

import pandas as pd
import numpy as np
def get_X(dataY, dataX, freq, lags):
    # provide dataY and dataX with datetime index

    # monthly data
    if freq == 'm':
        firstday = dataY.index[0]
        firstmonth = dataX.index[0]
        # which Series starts first
        if firstday < firstmonth:
            startingday = firstmonth + pd.DateOffset(months=lags)
        else:
            startingday = firstday + pd.DateOffset(months=lags)

        # initialize adjusted Series
        newY = dataY[startingday:]
        newX = np.zeros((len(newY),lags))
        for i in range(len(newY)):
            iday = newY.index[i]
            # allocate the laged values of dataX per timestamp in dataY
            for l in range(0,lags):
                newX[i,l] = np.array(dataX[(iday + pd.DateOffset(months=-l)).strftime('%Y-%m')])[0]
        newX = pd.DataFrame(newX, index = newY.index)
    return [newX, newY]
此示例导致以下结果

每个回路1.42 s±113 ms(5次运行的平均值±标准偏差,每个回路1次)

然而,实际设置包括nobs=5000和lags=24,这更慢

每个回路1min 30s±2.25s(5次运行的平均值±标准偏差,每个回路1次)


非常感谢您的帮助。

您好。我希望这不会给人留下负面印象,但我首先建议您升级正在使用的机器。在我的机器上,运行第一个示例是
472 ms±1.13 ms/循环
,第二个示例是
29.5 s±185 ms/循环
,而不修改任何代码。因此,您的机器比我的机器快3倍;-)不管怎么说,既然我要运行这个函数一百次,即使是你的,也要花半个多小时……哈哈,我猜。不过,我使用的是另一个版本的numpy,它有一个非标准的BLAS库。我知道也有一个有英特尔的MKL库浮动在某处。
nobs = 500
dataY = pd.DataFrame(range(0,nobs), index=pd.date_range(start='1/1/2018', periods=nobs))
indexX = pd.date_range(start='1/1/2016', end=dataY.index[len(dataY)-1], freq='M') + pd.DateOffset(days=1)
dataX = pd.DataFrame(range(0,len(indexX)), index=indexX)

%timeit -r5 get_X(dataY, dataX, freq='m', lags=12)