我在尝试在简单DF上生成共线性分析时遇到问题(请参见下文)。我的问题是,每次尝试运行该函数时,都会检索以下错误消息:
KeyError: "None of [Int64Index([0, 1, 2, 3], dtype='int64')] are in the [columns]"
下面是我正在使用的代码
read_training_set = pd.read_csv('C:\\Users\\rapha\\Desktop\\New test\\Classeur1.csv', sep=";")
training_set = pd.DataFrame(read_training_set)
print(training_set)
def calculate_vif_(X):
thresh = 5.0
variables = range(X.shape[1])
for i in np.arange(0, len(variables)):
vif = [variance_inflation_factor(X[variables].values, ix) for ix in range(X[variables].shape[1])]
print(vif)
maxloc = vif.index(max(vif))
if max(vif) > thresh:
print('dropping \'' + X[variables].columns[maxloc] + '\' at index: ' + str(maxloc))
del variables[maxloc]
print('Remaining variables:')
print(X.columns[variables])
return X
X = training_set
X2 = calculate_vif_(X)
我要在其上运行函数的DF看起来像这样。
Year Age Weight Size
0 2020 10 100 170
1 2021 11 101 171
2 2022 12 102 172
3 2023 13 103 173
4 2024 14 104 174
5 2025 15 105 175
6 2026 16 106 176
7 2027 17 107 177
8 2028 18 108 178
我在这里有两个猜测;但不确定如何解决该问题:
-猜测1:np.arrange导致与标题和列的某种冲突,从而阻止了遍历每一列的其余功能
-猜测2:问题来自blankseperators,这阻止了函数正确地从一列跳到另一列。问题是我的CSV文件已经有“;”分隔符(我手动创建文件并将其另存为带有“,”分隔符的常规CSV文件时,我不知道为什么要对此表示敬意)。
目前还不确定如何解决该问题,有人在这里有见识吗?
最佳
答案 0 :(得分:1)
此代码段X[variables].values
引起了错误。将variables
(即range
)转换为list
。
顺便说一句,代码非常混乱。当np.arange
已经是variables
时,为什么要呼叫range
?为什么要使用一定范围的列数来索引行?
从以上评论看来,您认为您正在按列号索引列,但实际上是对行进行索引。如果您使用loc`` or
iloc```来明确说明您要索引的内容,则会消除一些混淆。
答案 1 :(得分:0)
知道了,我修改了整个内容,似乎正在工作。参见下面的外观。
非常感谢您的帮助
variables = list(range(X.shape[1]))
for i in variables:
vif = [variance_inflation_factor(X.iloc[:, variables].values, ix)
for ix in range(X.iloc[:, variables].shape[1])]
maxloc = vif.index(max(vif))
if max(vif) > thresh:
print('dropping \'' + X.iloc[:, variables].columns[maxloc] +
'\' at index: ' + str(maxloc))
del variables[maxloc]
print('Remaining variables:')
print(X.columns[variables])
return X.iloc[:, variables]
X = training_set
X2 = calculate_vif_(X)```