Выполнил Бибик Денис, ММП.
Оптимизация кода для препроцессинга данных
import pandas as pd
import numpy as np
Часть 1.Корректировка данных, слайд 13
num_elenments = 3000000
measures = [str(np.random.choice(range(100, 200))) + '/' + str(np.random.choice(range(80, 100)))
for i in range(num_elenments)]
df_ = pd.DataFrame(measures, columns = ['Давление'])
df_.head()
Перед каждым экспирементом будем копировать датасет
df = df_.copy()
%%time
#Оригинальный код
tmp = df['Давление'].str.split('/')
df['в.давл.'] = tmp.apply(lambda x: x[0])
df['н.давл.'] = tmp.apply(lambda x: x[1])
df = df_.copy()
%%time
#Попробуем избавится от apply
tmp = df['Давление'].str.split('/').str
df['в.давл.'] = tmp.get(0)
df['н.давл.'] = tmp.get(1)
df = df_.copy()
%%time
#Теперь импользуем встроенную параметр expand
df[['в.давл.', 'н.давл.']] = df['Давление'].str.split('/', expand=True)
Ускорение почти в два раза
df = df_.copy()
%%time
#Попробуем такой вариант, он не будет работать если будут ошибки в формате
st = '/'.join(df['Давление'])
df[['в.давл.', 'н.давл.']] = pd.DataFrame(np.array(st.split('/')).reshape(-1, 2))
Ускоорение в 8 раз
Часть 2. Заполнение данных, слайд 19
num_elements = 5000000
train_len = int(0.75 * num_elements)
num_nan = 300000
df_ = pd.DataFrame(np.random.choice(a = range(60, 100), size = (num_elements, 1)), columns = ['площадь'])
df_['data'] = ['train'] * train_len + ['test'] * (num_elements - train_len)
nan_positions = np.random.choice(num_elements, num_nan, replace=False)
df_.loc[nan_positions, 'площадь'] = np.nan
df_.head()
df = df_.copy()
%%time
#Оригинальный код
df.loc[df['data'] == 'train', 'площадь'] =\
df[df['data'] == 'train']['площадь'].fillna(df[df['data'] == 'train']['площадь'].mean())
df.loc[df['data'] == 'test', 'площадь'] =\
df[df['data'] == 'test']['площадь'].fillna(df[df['data'] == 'test']['площадь'].mean())
df = df_.copy()
%%time
#Используем transform
gb = df.groupby('data')
df['площадь'] = gb.transform(lambda x: x.fillna(x.mean()))
Ускорение более чем в два раза
df = df_.copy()
Разберемся что сколько времени занимает в коде выше
%%time
gb = df.groupby('data')
iterate = list(gb)
del iterate
%%time
m = gb.mean()
%%time
df['площадь'] = gb.transform(lambda x: x.fillna(0))
Получается что transform занимает значимую часть времени
df = df_.copy()
%%time
gb = df.groupby('data')
mean = gb.mean()
for gn, x in gb:
x['площадь'].fillna(mean.loc[gn])
Ускорили еще на 250 мс