1
votes

'ValueError: impossible de convertir la chaîne en float' en python sklearn

J'ai un Pandas DataFrame avec des colonnes de date. Les données sont importées à partir d'un fichier csv. Lorsque j'essaye d'adapter le modèle de régression, j'obtiens l'erreur ValueError: could not convert string to float: '2019-08-30 07:51:21 . .

Comment puis-je m'en débarrasser?

Voici dataframe.

source.csv

ValueError                                Traceback (most recent call last)
<ipython-input-28-bc774a9d8239> in <module>
      4 rf = RandomForestRegressor(n_estimators = 1000, random_state = 42)
      5 # Train the model on training data
----> 6 rf.fit(train_features, train_labels);

~/ml/env/lib/python3.7/site-packages/sklearn/ensemble/forest.py in fit(self, X, y, sample_weight)
    247 
    248         # Validate or convert input data
--> 249         X = check_array(X, accept_sparse="csc", dtype=DTYPE)
    250         y = check_array(y, accept_sparse='csc', ensure_2d=False, dtype=None)
    251         if sample_weight is not None:

~/ml/env/lib/python3.7/site-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    494             try:
    495                 warnings.simplefilter('error', ComplexWarning)
--> 496                 array = np.asarray(array, dtype=dtype, order=order)
    497             except ComplexWarning:
    498                 raise ValueError("Complex data not supported\n"

~/ml/env/lib/python3.7/site-packages/numpy/core/numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

ValueError: could not convert string to float: '2019-08-30 07:51:21'


0 commentaires

3 Réponses :


0
votes

Essayez une chose comme celle-ci, après avoir lu le modèle

import datetime
to_timestamp_fct = lambda x: datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S').timestamp()

model['rssi_ts'] = model['rssi_ts'].apply(to_timestamp_fct)


1 commentaires

sa soulevant la même erreur. bien que vous appliquez ici à une seule fonctionnalité, j'ai 3 fonctionnalités avec horodatage.



0
votes

Vous devez convertir la date de l'heure de la chaîne en horodatage pandas. Cela peut être fait avec la ligne suivante (tout le reste est conservé pendant que vous écrivez):

model = (
    pd.read_csv("source.csv", parse_dates=['rssi_ts', 'batl_ts'], date_parser=lambda x: pd.to_datetime(x))
    .assign(
        rssi_ts=lambda x: x.loc[:, 'rssi_ts'].astype(int) / 10 ** 9,
        batl_ts=lambda x: x.loc[:, 'batl_ts'].astype(int) / 10 ** 9,
        ts_diff=lambda x: pd.to_timedelta(x.loc[:, 'ts_diff']).astype(int) / 10 ** 9
    )
)

Timestamp Les objets créés par les arguments parse_dates peuvent être convertis en float. p>

Modifier : il manquait un crochet.

Edit2 : pour un autre horodatage et l'heure delta.

p >


0 commentaires

0
votes

Il lit votre valeur sous forme de chaîne ... Pour que le modèle fonctionne, il doit lire qu'il a un entier ou un flottant, utilisez donc cette fonction:

model = (
    pd.read_csv("source.csv", parse_dates=['rssi_ts', 'batl_ts'], date_parser=lambda x: pd.to_datetime(x))
    .assign(rssi_ts=lambda x: x.loc[:, 'rssi_ts'].astype(int) / 10 ** 9)


2 commentaires

Merci pour la réponse. Bien que cela donne maintenant l'erreur 'TypeError: float () argument doit être une chaîne ou un nombre, pas' Timestamp ''


ce sont des types: event_id int64 tsm_tuid int64 rssi_ts float64 rssi int64 batl float64 batl_ts datetime64 [ns] ts_diff object dtype: object