У меня есть функция, которая получает кадр данных pandas и число с плавающей точкой между 0 и 1. Что мне нужно сделать, это вычислить корреляцию Пирсона между двумя столбцами (i, j) кадра данных попарно, и если эта корреляция достигает значениябольше 0,9, удалите один из этих столбцов (j).
Мой информационный фрейм pandas содержит 111 строк и ~ 2 миллиона столбцов. Я хочу добиться набора данных с тем же количеством строк, но с меньшим количеством столбцов. В другом наборе данных с формой 2278x111 я смог получить новые данные с формой 512x111. Все данные - float64.
def apply_pearson_feature_selection(samples, max_value=0.99):
# https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.pearsonr.html
columns_names = samples.columns
features_to_delete = []
for i in range(0, samples.shape[1]):
feature_i = samples[columns_names[i]].to_numpy()
for j in range(i+1, samples.shape[1]):
feature_j = samples[columns_names[j]].to_numpy()
pearson, pvalue = stats.pearsonr(feature_i, feature_j)
if pearson > max_value and columns_names[j] not in features_to_delete:
features_to_delete.append(columns_names[j])
return samples.drop(features_to_delete, axis=1).values
Проблема в том, что это занимает слишком много времени ... у кадра данных, который я пытаюсь применить, есть ~ 2 миллиона функций.
Так как я неВ любом случае, я не знаю, как удалить столбцы, итерируя по ним, я понятия не имею, как это сделать лучше