web-dev-qa-db-fra.com

TypeError: l'argument float () doit être une chaîne ou un nombre, pas 'fonction' - Python/Sklearn

J'ai l'extrait de code suivant d'un programme appelé Flights.py

...
#Load the Dataset
df = dataset
df.isnull().any()
df = df.fillna(lambda x: x.median())

# Define X and Y
X = df.iloc[:, 2:124].values
y = df.iloc[:, 136].values
X_tolist = X.tolist()

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

L'avant-dernière ligne génère l'erreur suivante:

Traceback (most recent call last):

  File "<ipython-input-14-d4add2ccf5ab>", line 3, in <module>
    X_train = sc.fit_transform(X_train)

  File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/base.py", line 494, in fit_transform
    return self.fit(X, **fit_params).transform(X)

  File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 560, in fit
    return self.partial_fit(X, y)

  File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 583, in partial_fit
    estimator=self, dtype=FLOAT_DTYPES)

  File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/utils/validation.py", line 382, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)

TypeError: float() argument must be a string or a number, not 'function'

Ma base de données df est de taille (22587, 138)

Je cherchais de l'inspiration à la question suivante:

TypeError: l'argument float () doit être une chaîne ou un nombre, et non pas "méthode" dans Geocoder

J'ai essayé l'ajustement suivant:

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train.as_matrix)
X_test = sc.transform(X_test.as_matrix)

Ce qui a entraîné l'erreur suivante:

AttributeError: 'numpy.ndarray' object has no attribute 'as_matrix'

Je ne sais pas comment analyser l'ensemble de données et rechercher/convertir les entrées incriminées. 

5
HMLDude

Comme cette réponse explique, fillna n'est pas conçu pour fonctionner avec un rappel. Si vous en passez une, elle sera considérée comme la valeur de remplissage littérale, ce qui signifie que votre NaNs sera remplacé par lambdas:

df

      col1  col2  col3  col4
row1  65.0    24  47.0   NaN
row2  33.0    48   NaN  89.0
row3   NaN    34  67.0   NaN
row4  24.0    12  52.0  17.0

df4.fillna(lambda x: x.median())

                                    col1  col2  \
row1                                  65    24   
row2                                  33    48   
row3  <function <lambda> at 0x10bc47730>    34   
row4                                  24    12   

                                    col3                                col4  
row1                                  47  <function <lambda> at 0x10bc47730>  
row2  <function <lambda> at 0x10bc47730>                                  89  
row3                                  67  <function <lambda> at 0x10bc47730>  
row4                                  52                                  17 

Si vous essayez de remplir par médiane, la solution serait de créer une trame de données de médian basée sur la colonne et de la transmettre à fillna.

df
      col1  col2  col3  col4
row1  65.0    24  47.0   NaN
row2  33.0    48   NaN  89.0
row3   NaN    34  67.0   NaN
row4  24.0    12  52.0  17.0

df.fillna(df.median())
df 
      col1  col2  col3  col4
row1  65.0    24  47.0  53.0
row2  33.0    48  52.0  89.0
row3  33.0    34  67.0  53.0
row4  24.0    12  52.0  17.0
2
coldspeed
df = df.fillna(lambda x: x.median())

Ce n'est pas vraiment un moyen valide d'utiliser fillna. Il attend ici des valeurs littérales ou un mappage de valeurs de colonne à littérales. Cela n’appliquera pas la fonction que vous avez fournie; au lieu de cela, la valeur des cellules NA sera simplement définie sur la fonction elle-même. C’est la fonction que votre estimateur tente de transformer en float.

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html

0
Mark Whitfield

J'ai eu les mêmes problèmes en utilisant df = df.fillna(lambda x: x.median())Voici ma solution pour obtenir de vraies valeurs plutôt que 'fonction' dans le cadre de données:

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np

Je crée une base de données 10 lignes, 3 colonnes avec nan 

df = pd.DataFrame(np.random.randint(100,size=(10,3)))
df.iloc[3:5,0] = np.nan
df.iloc[4:6,1] = np.nan
df.iloc[5:8,2] = np.nan

Attribuer des étiquettes de colonne stupides pour plus de commodité par la suite

df.columns=['Number_of_Holy_Hand_Grenades_of_Antioch', 'Number_of_knight_fleeings', 'Number_of_rabbits_of_Caerbannog']

print df.isnull().any()  # tell if nan per column

Pour chaque colonne à travers leurs étiquettes, nous remplissons toute la valeur nan par la valeur médiane calculée sur la colonne elle-même. Peut être utilisé avec mean (), etc.

for i in df.columns:     #df.columns[w:] if you have w column of line description 
    df[i] = df[i].fillna(df[i].median() )
print df.isnull().any()

Maintenant df contient nan remplacé par valeur médiane

print df

tu peux faire par exemple 

X = df.ix[:,:].values
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

qui ne fonctionne pas avec df = df.fillna(lambda x: x.median()) Nous pouvons maintenant utiliser df dans la méthode forward car toutes les valeurs sont des valeurs vraies, pas une fonction; contrairement à la méthode utilisant lambda dans dataframe.fillna () comme par exemple, toutes les propositions utilisant fillna combinées à lambda

0
sol