Есть два аспекта вашего алгоритма, которые можно оптимизировать сразу:
- Заменить цикл
for
на понимание списка. - Вместо повторных вызовов
iloc
,создайте список кортежей и подайте на pd.DataFrame
напрямую.
Вот некоторый псевдокод:
def return_values(data):
return sp.mean(data), len(data.index)
L = [return_values(dataSet[dataSet >= truncValue]) for truncValue in truncValue_arr]
df = pd.DataFrame(data=L, index=truncValue_arr, columns=['mean', 'NumObs'])
Вы можете оптимизировать дальнейшее путем рефакторинга dataSet >= truncValue
, который происходит в каждомпетля.Рассмотрим следующее:
s = pd.Series([1, 2, 3, 4, 5])
vals = np.array([2, 4])
s[:, None] > vals
array([[False, False],
[False, False],
[ True, False],
[ True, False],
[ True, True]], dtype=bool)
Поэтому вы можете сделать что-то вроде:
mask = np.array(dataset)[:, None] >= np.array(truncValue_arr)
L = [return_values(dataset.loc[mask[:, i]]) \
for i, truncValue in enumerate(truncValue_arr)]