Я пытаюсь построить модель прогнозирования, но в настоящее время продолжаю получать сообщение об ошибке: raise ValueError("Input contains NaN") ValueError: Input contains NaN
. Я пытался использовать np.any(np.isnan(dataframe))
и np.any(np.isnan(dataframe))
, но постоянно получаю новые ошибки. Например, TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
.
Вот код на данный момент:
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import numpy as np
dataframe = pd.read_csv('file.csv', delimiter=',')
le = LabelEncoder()
dfle = dataframe
dfle2 = dfle.apply(lambda col: le.fit_transform(col.astype(str)), axis=0, result_type='expand')
newdf = dfle2[['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7']]
X = dataframe[['column1', 'column2', 'column4', 'column5', 'column6', 'column7']].values
y = dfle.column3
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
ohe = OneHotEncoder()
ColumnTransformer([('encoder', OneHotEncoder(), [0])], remainder='passthrough')
# np.all(np.isfinite(dfle))
# np.any(np.isnan(dfle))
X = ohe.fit_transform(X).toarray()
Вы можете сделать несколько вещей, чтобы справиться с этой ошибкой
во-первых, вы можете заполнить значения Nan на 0 dataframe = pd.read_csv('file.csv', delimiter=',').fillna(0)
или вы можете использовать методы вменения sklearn
, чтобы заполнить значение Nan.
https://scikit-learn.org/stable/modules/classes.html#module-sklearn.impute
Доступны несколько методов вменения, но вы должны использовать KNNImputer
.
Ошибка
TypeError: ufunc 'isfinite' not supported for the input types,
and the inputs could not be safely coerced to any supported types
according to the casting rule ''safe''
вероятно, потому что вы конвертируете в str
, когда делаете col.astype(str)
. Вместо этого используйте что-то вроде astype(float)
.
Что касается ошибки NaN
, вам нужно выяснить, можно ли ее решить, просто заменив ее нулями (fillna(0)
), или нужно использовать что-то более сложное, например, фильтр Калмана.
Вы также можете использовать df.dropna(), но я полагаю, что это менее полезно.