ValueError:输入包含NaN,无穷大或使用df.drop命令后对于dtype('float64')而言太大的值

时间:2019-05-31 04:08:29

标签: python-3.x scikit-learn

我知道该错误是因为我的csv中有NaN个值,但是我的代码在很多地方都有命令df.dropna,所以我不明白为什么它解释了代码仍然具有NaN值。

现在由于我的长代码使我写的更多,您可以忽略它,这简直是胡言乱语,请参考上面的句子询问我的问题,非常感谢您为我提供的帮助,谢谢! / p>

import numpy as np
import pandas as pd
import pickle
from collections import Counter
from sklearn import svm, model_selection as cross_validation, neighbors
from sklearn.ensemble import RandomForestClassifier, VotingClassifier

def process_data_for_lables(ticker):
    hm_days = 7
    df = pd.read_csv('sp500_joined_closes.csv', index_col=0)
    df.dropna(inplace=True)
    tickers = df.columns.values.tolist()
    df.fillna(0)

    for i in range (1,hm_days+1):
        df['{}_{}d'.format(ticker, i)] = (df[ticker].shift(-i)-df[ticker])/ df[ticker]

    df.fillna(0)
    return tickers, df
#process_data_for_lables('XOM')

def buy_sell_hold(*args):
    cols = [c for c in args]
    requirement = 0.02
    for col in cols:
        if col > requirement:
            return 1
        if col < -requirement:
            return-1
    return 0

def extract_featuresets(ticker):
    tickers, df = process_data_for_lables(ticker)
    df.dropna(inplace=True)
    df['{}_target'.format(ticker)] = list(map(buy_sell_hold, 
                                              df['{}_1d'.format(ticker)], 
                                              df['{}_2d'.format(ticker)],
                                              df['{}_3d'.format(ticker)], 
                                              df['{}_4d'.format(ticker)], 
                                              df['{}_5d'.format(ticker)], 
                                              df['{}_6d'.format(ticker)], 
                                              df['{}_7d'.format(ticker)]))

    vals = df['{}_target'.format(ticker)].values.tolist()
    str_vals = [str(i) for i in vals]
    print('Data spread:', Counter(str_vals))
    df.fillna(0)

    df = df.replace([np.inf, -np.inf], np.nan)
    df.dropna(inplace=True)

    df_vals = df[[ticker for ticker in tickers]].pct_change()
    df_vals = df_vals.replace([np.inf, -np.inf], 0)
    df_vals.fillna(0)

    X = df_vals.values
    y = df['{}_target'.format(ticker)].values
    np.nan_to_num(X)
    return X, y, df
#extract_featuresets('XOM')  

def do_ml(ticker):

    X, y, df = extract_featuresets(ticker)
    X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,
                                                                    y,
                                                                    test_size = 0.25)
    clf = neighbors.KNeighborsClassifier()
    clf.fit(X_train, y_train)
    confidence = clf.score(X_test, y_test)
    predictions = clf.predict(X_test)
    print('Predicted spread:', Counter(predictions))

    return confidence

do_ml('BAC')
  

ValueError:输入包含NaN,无穷大或值对于   dtype('float64')。

2 个答案:

答案 0 :(得分:0)

NaN可能在几个地方传播。您可以尝试:

df_vals = df_vals.fillna(0)
...
X = np.nan_to_num(X)

答案 1 :(得分:0)

解决任何问题的第一步就是要认识到一个问题。

  

ValueError:输入包含NaN,无穷大或对于dtype('float64')而言太大的值。

您确定已处理的数据框仅包含NaN吗?可能存在无限的情况。 您可以检查数据框是否包含无穷大或NaN。 要检查是否存在NaN,请使用:

df.isnull().any().any()

如果输出为true,则您仍然存在NaN。

要检查是否存在无穷大,请使用:

df.isinfinity().any().any()

如果发现命令的任何输出为true,则也许应该尝试从数据框中删除该类型的值。否则,请确保所有值都在dtype float64的范围内。

请分享您的发现!