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-我接受吗?非常感谢你的帮助。