如何使用 pandas 获取分类变量相关矩阵?
How to get categorical variable correlation matrix using pandas?
我有一个如下所示的数据框。您只需按原样 运行 下面的代码片段,您就会知道错误是什么。猜测错误在for循环中
df = pd.DataFrame(
{'sub_code' : ['CSE01', 'CSE01', 'CSE01',
'CSE02', 'CSE03', 'CSE04',
'CSE05', 'CSE06'],
'stud_level' : [101, 101, 101, 101,
101, 101, 101, 101],
'grade' : ['STA','STA','PSA','STA','STA','SSA','PSA','QSA']})
我正在尝试使用以下代码(从 here 找到)找到分类相关性。
生成的相关值是正确的,但是使用 for 循环的矩阵收缩出错了。我的结果重复并出现 4 行而不是 2 行。我是处理大数据的,所以也欢迎任何有效的方法
可以帮我解决这个问题吗?
from sklearn import preprocessing
label = preprocessing.LabelEncoder()
data_encoded = pd.DataFrame()
for i in df.columns:
data_encoded[i]=label.fit_transform(df[i])
from scipy.stats import chi2_contingency
import numpy as np
def cramers_V(var1,var2) :
crosstab =np.array(pd.crosstab(var1,var2, rownames=None, colnames=None)) # Cross table building
stat = chi2_contingency(crosstab)[0] # Keeping of the test statistic of the Chi2 test
obs = np.sum(crosstab) # Number of observations
mini = min(crosstab.shape)-1 # Take the minimum value between the columns and the rows of the cross table
return (stat/(obs*mini))
rows=[]
for var1 in data_encoded.columns.tolist(): #guess am making mistake here
col=[]
for var2 in data_encoded.columns.tolist(): #guess am making mistake here
cramers =cramers_V(data_encoded[var1], data_encoded[var2])
col.append(round(cramers,2))
rows.append(col)
cramers_results = np.array(rows) # issue could be here as well
df = pd.DataFrame(cramers_results,columns = data_encoded.columns, index=data_encoded.columns) # issue is here
我希望我的输出如下所示,但我在构建相关矩阵时犯了一些错误。我的值在上面的代码中计算正确,但问题在于矩阵构造
我设法通过修复以下语句的对齐方式解决了这个问题
rows.append(col)
for循环代码如下
for var2 in data_encoded.columns.tolist():
cramers =cramers_V(data_encoded[var1], data_encoded[var2])
col.append(round(cramers,2))
rows.append(col) # fixed the alignment issue
rows
stmt 必须在 for 循环之外(不像我的问题 post 那样在 for 循环内)
其余代码没问题并产生完美的输出
我有一个如下所示的数据框。您只需按原样 运行 下面的代码片段,您就会知道错误是什么。猜测错误在for循环中
df = pd.DataFrame(
{'sub_code' : ['CSE01', 'CSE01', 'CSE01',
'CSE02', 'CSE03', 'CSE04',
'CSE05', 'CSE06'],
'stud_level' : [101, 101, 101, 101,
101, 101, 101, 101],
'grade' : ['STA','STA','PSA','STA','STA','SSA','PSA','QSA']})
我正在尝试使用以下代码(从 here 找到)找到分类相关性。 生成的相关值是正确的,但是使用 for 循环的矩阵收缩出错了。我的结果重复并出现 4 行而不是 2 行。我是处理大数据的,所以也欢迎任何有效的方法
可以帮我解决这个问题吗?
from sklearn import preprocessing
label = preprocessing.LabelEncoder()
data_encoded = pd.DataFrame()
for i in df.columns:
data_encoded[i]=label.fit_transform(df[i])
from scipy.stats import chi2_contingency
import numpy as np
def cramers_V(var1,var2) :
crosstab =np.array(pd.crosstab(var1,var2, rownames=None, colnames=None)) # Cross table building
stat = chi2_contingency(crosstab)[0] # Keeping of the test statistic of the Chi2 test
obs = np.sum(crosstab) # Number of observations
mini = min(crosstab.shape)-1 # Take the minimum value between the columns and the rows of the cross table
return (stat/(obs*mini))
rows=[]
for var1 in data_encoded.columns.tolist(): #guess am making mistake here
col=[]
for var2 in data_encoded.columns.tolist(): #guess am making mistake here
cramers =cramers_V(data_encoded[var1], data_encoded[var2])
col.append(round(cramers,2))
rows.append(col)
cramers_results = np.array(rows) # issue could be here as well
df = pd.DataFrame(cramers_results,columns = data_encoded.columns, index=data_encoded.columns) # issue is here
我希望我的输出如下所示,但我在构建相关矩阵时犯了一些错误。我的值在上面的代码中计算正确,但问题在于矩阵构造
我设法通过修复以下语句的对齐方式解决了这个问题
rows.append(col)
for循环代码如下
for var2 in data_encoded.columns.tolist():
cramers =cramers_V(data_encoded[var1], data_encoded[var2])
col.append(round(cramers,2))
rows.append(col) # fixed the alignment issue
rows
stmt 必须在 for 循环之外(不像我的问题 post 那样在 for 循环内)
其余代码没问题并产生完美的输出