Ситуация: Я работаю с большим фреймом данных, около 100 столбцов и около 2 миллионов строк. Цель состоит в том, чтобы найти корреляцию между каждым столбцом. Но в наборе данных есть много значений 0 в каждой строке, поэтому, когда я использую df.corr()
, результат будет неправильным, потому что корреляция между двумя строками, допустим, A и B, с большим количеством (0, 0)
, имеет другую форму (x, y)
, для x != 0 | y != 0
.
Примерно так:
#dataframe without zeros for both columns
df = pd.Dataframe([(.2, .3), (.1, .2), (.3, .6), (.6, .9),
(.5, .0), (.0, .5)], columns = ['dogs', 'cats'])
ρ = corr(dogs,cats) = 0.2482
#dataframe with lots of zeros for both columns
df = pd.Dataframe([(.2, .3), (.1, .2), (.3, .6), (.6, .9),
(.5, .0), (.0, .5), (.0, .0), (.0, .0), (.0, .0), (.0, .0)],
columns = ['dogs', 'cats'])
ρ = corr(dogs,cats) = 0.5743
#dataframe with np.NaN instead of every zero
df = pd.Dataframe([(.2, .3), (.1, .2), (.3, .6), (.6, .9),
(.5, .0), (.0, .5), (.0, .0), (.0, .0), (.0, .0), (.0, .0)],
columns = ['dogs', 'cats'])
df = df.replace(0, np.NaN)
ρ = corr(dogs,cats) = 0.9759
Основная проблема: Использование NaN при расчете корреляции в pandas df подразумевает, что он будет игнорировать все наборы, которые имеютхотя бы один ноль, поэтому df становится: [(.2, .3), (.1, .2), (.3, .6), (.6, .9)]
. Мне нужно вычислить корреляцию без (0, 0), но с (0,y) & (x, 0)
, и в настоящее время единственный возможный способ, который я могу изобразить, - построить два цикла for и выполнить итерации по каждому столбцу ...
Например:
results = []
for (col_name_1, col_data_1) in df.iteritems():
for (col_name_2, col_data_2) in df.iteritems():
res = pd.concat([col_data_1, col_data_2])
#only get the rows that aren't (0,0)
res = res[!((res[col_name_1] == 0) & (res[col_name_2] == 0))]
#get the value from the correlation and save it
corr = result.corr().stack()[1]
results.append((col_name_1, col_data_2, corr,))
РЕДАКТИРОВАТЬ Просто чтобы прояснить ситуацию, теперь, когда я использую df.corr () без циклов for, это занимает 1 минуту. С помощью цикла for, представленного выше, процесс начался более 30 минут назад и все еще выполняется. Может быть, я должен перейти к пустому столбцу каждого столбца df, чтобы выполнить операцию ...