Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Pandas 熊猫群比的加速_Pandas - Fatal编程技术网

Pandas 熊猫群比的加速

Pandas 熊猫群比的加速,pandas,Pandas,我在高性能计算中使用熊猫数据帧。此功能是一个重要的时间接收器: def calculate_with_n_electron(self, phi, partition_function, number_density, n_electron): ion_populations = pd.DataFrame(data=0.0, index=partition_function.index.copy(),

我在高性能计算中使用熊猫数据帧。此功能是一个重要的时间接收器:

def calculate_with_n_electron(self, phi, partition_function,
                              number_density, n_electron):
    ion_populations = pd.DataFrame(data=0.0,
        index=partition_function.index.copy(),
        columns=partition_function.columns.copy(), dtype=np.float64)

    for atomic_number, groups in phi.groupby(level='atomic_number'):
        current_phis = (groups / n_electron).replace(np.nan, 0.0).values
        phis_product = np.cumproduct(current_phis, axis=0)
        neutral_atom_density = (number_density.ix[atomic_number] /
                                (1 + np.sum(phis_product, axis=0)))
        ion_populations.ix[atomic_number, 0] = (
            neutral_atom_density.values)
        ion_populations.ix[atomic_number].values[1:] = (
            neutral_atom_density.values * phis_product)
        ion_populations[ion_populations < self.ion_zero_threshold] = 0.0
    return ion_populations
def用电子(自、φ、配分函数、,
数量(密度,n电子):
离子布居数=pd.数据帧(数据=0.0,
index=partition\u function.index.copy(),
columns=partition\u function.columns.copy(),dtype=np.float64)
对于原子序数,以phi.groupby(level='atomic_number')表示的组:
当前\u phis=(组/n\u电子)。替换(np.nan,0.0)。值
物理物理系统产品=np.cumproduct(当前物理物理系统,轴=0)
中性原子密度=(数密度.ix[原子数]/
(1+np.和(phis_乘积,轴=0)))
离子布居数.ix[原子序数,0]=(
中性(原子密度值)
ion_populations.ix[原子数].值[1:](
中性_原子_密度.values*phis_乘积)
离子布居【离子布居<自我离子零阈值】=0.0
返回离子群
以下是更大范围内的功能:


任何帮助都将不胜感激

在不知道数据是什么样子的情况下,这不太可能完全有效,但希望能给您一些想法-基本方法是避免
for
循环,并使用矢量化操作完成所有操作

gb = phi.groupby(level='atomic_number')

# do this outside the groupby, use fillna instead of replace
phi = (phi / n_electron).fillna(0.0)
phi['product'] = gb.cumprod()

# assume number_density has one column named 'density`
phi = phi.join(number_density)
phi['density'] = phi['density'] / (1 + gb['product'].transform('sum'))

# bit of a hack to exclude the first element from each group
# from the multiplication
phi['dummy'] = 1
phi['density'] = df['density'] * np.where(gb['dummy'].cumsum() == 1, 1, df['product'])

phi.loc[phi['density'] < self.ion_zero_threshold] = 0.0
gb=phi.groupby(level='atomic_number')
#在groupby之外执行此操作,请使用fillna而不是replace
phi=(phi/n_电子).fillna(0.0)
phi['product']=gb.cumprod()
#假设number_density有一列名为“density”`
φ=φ连接(数量密度)
phi['density']=phi['density']/(1+gb['product'].变换('sum'))
#从每个组中排除第一个元素有点麻烦
#从乘法
φ['dummy']=1
phi['density']=df['density']*np.其中(gb['dummy'].cumsum()==1,1,df['product']
phi.loc[phi['density']<自离子零点阈值]=0.0

我又添加了一个附加数据的问题,它将解决一个主要的性能瓶颈(我使用行分析发现您的实现速度更快,但还没有快很多):这个答案很有帮助,但不完全是解决方案(因为您不知道数据是什么样子)。什么是ettiquette-我接受吗?非常感谢你的帮助。