Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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 如何使用pandas.groupby.nth()加速循环?_Python_Pandas_Numpy_Dataframe_Pandas Groupby - Fatal编程技术网

Python 如何使用pandas.groupby.nth()加速循环?

Python 如何使用pandas.groupby.nth()加速循环?,python,pandas,numpy,dataframe,pandas-groupby,Python,Pandas,Numpy,Dataframe,Pandas Groupby,我想加速一个循环,该循环在每次迭代时在数据帧上使用groupby.nth()。 下面是对我的代码的快速解释: 假设我要执行蒙特卡罗模拟: ->假设我有一个数据帧df1,其权重为10*20。(10项资产的权重随时间而变化,即20年,每列总和=1) ->和df2(见图),另一个是200.000*20。(第一列是Nan,因为它是返回的数据帧) 200.000是我的10项资产的数据,一行放置(每个20.000行) 我的代码: -通过模拟次数循环(0

我想加速一个循环,该循环在每次迭代时在数据帧上使用
groupby.nth()
。 下面是对我的代码的快速解释: 假设我要执行蒙特卡罗模拟:

->假设我有一个数据帧df1,其权重为10*20。(10项资产的权重随时间而变化,即20年,每列总和=1)

->和df2(见图),另一个是200.000*20。(第一列是Nan,因为它是返回的数据帧)

200.000是我的10项资产的数据,一行放置(每个20.000行)

我的代码: -通过模拟次数循环(0 -按资产分组的df2

-创建一个dftemp=df2.groupby('asset').nth(i)并通过乘以df1*dftemp并对轴=0上的结果求和来计算返回值(i)

Returns = np.zeros((nbsimulations,nbyears))
Capital = np.zeros((nbsimulations,nbyears))

    gb = datafilereturns.groupby('Asset')
    for i in range(0, nbsimulations):
        path = gb.nth(i)

        retsum = (TranspGrilleT.values * path.values).sum(axis=0)
        Returns[i,:] = retsum[1:]
    Capital[:,0] = Capital[:,0] * (1 + Returns[:,0])
我的问题是,对于大量模拟(20.000,即最大值,因为每个资产的数据不超过20.000),代码速度非常慢,因为它需要在循环中使用第n(i)个值,将df1和dftemp的值相乘,然后在每一步求和

我试着看Cython和Numba来加速代码,但没有成功。Numpy能加速这个循环吗?但在这种情况下,如何替换熊猫的第n(i)个功能

谢谢你的帮助


为什么不使用
groupby('Asset').head()
groupby('Asset').nlargest()
?@QuangHoang,因为如果我将groupby('Asset').head(i)放在一个循环中,我有一个递增的数组,因为head(3)将为每个资产提供三行。n(i)为每个资产提供一行,但第三行除外。你认为我们可以在numpy中使它更快吗?不,我的意思是你使用
head(n)
,忘记循环的
。但是如何在每一步替换矩阵值的乘法呢?例如
retsum=(TranspGrilleT.values*path.values).sum(axis=0)
为什么不使用
groupby('Asset').head()
groupby('Asset').nlargest()
?@QuangHoang,因为如果我把groupby('Asset').head(i)放在一个循环中,我有一个递增的数组,因为head(3)会为每个资产给我三行。n(i)为每个资产提供一行,但第三行除外。你认为我们可以在numpy中使它更快吗?不,我的意思是你使用
head(n)
,忘记循环的
。但是如何在每一步替换矩阵值的乘法呢?即
retsum=(TranspGrilleT.values*path.values).sum(axis=0)