2015-08-20 97 views
1

我在高性能计算中使用熊猫数据帧。这个函数是一个显著时间片:熊猫群加速由

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 

这里是更大范围内的功能:https://github.com/tardis-sn/tardis/blob/master/tardis/plasma/properties/ion_population.py#L151

任何帮助,将不胜感激!

回答

1

不知道数据是什么样子的,这是不太可能的,这是完全可行的,但希望给你一些想法 - 基本的方法是避免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 
+0

我会尝试 - 感谢@chrisb –

+0

我增加了一个问题,附带数据,将采取的主要性能瓶颈的照顾(我用线分析来发现你的执行速度更快,但不是很多更快,但):http://stackoverflow.com/questions/32138067/quick-pandas-groupby-calculations –

+0

这个答案是有帮助的,但不是解决方案(因为你不知道数据是什么样子)。什么是礼节 - 我接受它吗?非常感谢您的帮助。 –