我知道该错误是因为我的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')。
答案 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的范围内。
请分享您的发现!