我是ML的初学者。我正在帮助我的数学专业的朋友基于他提供的.csv
文件使用TensorFlow创建一个股票预测器。
我有几个问题。第一个是他的.csv
文件。该文件只有日期和结束值,它们没有分开,因此我不得不手动分开日期和值。我已经设法做到了这一点,现在我在使用MinMaxScaler时遇到了问题()。我被告知我几乎可以忽略日期,只测试收盘值,将其归一化,并根据它们进行预测。
我不断收到此错误:
ValueError: Found array with 0 sample(s) (shape=(0, 1)) while a
minimum of 1 is required by MinMaxScaler()
老实说,我从来没有使用过SKLearn
或TensorFlow,这是我第一次做这样的项目。我看到的所有关于这个主题的指南都使用了panda,但在我的例子中,.csv
文件是一个烂摊子,我不相信我可以使用panda。
我正在关注this DataCamp tutorial:
但不幸的是,由于我缺乏经验,有些事情对我并不真正起作用,我希望能更清楚地说明我应该如何处理我的情况。
下面附上的是我的(杂乱的)代码:
import pandas as pd
import numpy as np
import tensorflow as tf
import sklearn
from sklearn.model_selection import KFold
from sklearn.preprocessing import scale
from sklearn.preprocessing import MinMaxScaler
import matplotlib
import matplotlib.pyplot as plt
from dateutil.parser import parse
from datetime import datetime, timedelta
from collections import deque
stock_data = []
stock_date = []
stock_value = []
f = open("s&p500closing.csv","r")
data = f.read()
rows = data.split("\n")
rows_noheader = rows[1:len(rows)]
#Separating values from messy `.csv`, putting each value to it's list and also a combined list of both
for row in rows_noheader:
[date, value] = row[1:len(row)-1].split('\t')
stock_date.append(date)
stock_value.append((value))
stock_data.append((date, value))
#Numpy array of all closing values converted to floats and normalized against the maximum
stock_value = np.array(stock_value, dtype=np.float32)
normvalue = [i/max(stock_value) for i in stock_value]
#Number of closing values and days. Since there is one closing value for each, they both match and there are 4528 of them (each)
nclose_and_days = 0
for i in range(len(stock_data)):
nclose_and_days+=1
train_data = stock_value[:2264]
test_data = stock_value[2264:]
scaler = MinMaxScaler()
train_data = train_data.reshape(-1,1)
test_data = test_data.reshape(-1,1)
# Train the Scaler with training data and smooth data
smoothing_window_size = 1100
for di in range(0,4400,smoothing_window_size):
#error occurs here
scaler.fit(train_data[di:di+smoothing_window_size,:])
train_data[di:di+smoothing_window_size,:] = scaler.transform(train_data[di:di+smoothing_window_size,:])
# You normalize the last bit of remaining data
scaler.fit(train_data[di+smoothing_window_size:,:])
train_data[di+smoothing_window_size:,:] = scaler.transform(train_data[di+smoothing_window_size:,:])
# Reshape both train and test data
train_data = train_data.reshape(-1)
# Normalize test data
test_data = scaler.transform(test_data).reshape(-1)
# Now perform exponential moving average smoothing
# So the data will have a smoother curve than the original ragged data
EMA = 0.0
gamma = 0.1
for ti in range(1100):
EMA = gamma*train_data[ti] + (1-gamma)*EMA
train_data[ti] = EMA
# Used for visualization and test purposes
all_mid_data = np.concatenate([train_data,test_data],axis=0)
window_size = 100
N = train_data.size
std_avg_predictions = []
std_avg_x = []
mse_errors = []
for pred_idx in range(window_size,N):
std_avg_predictions.append(np.mean(train_data[pred_idx-window_size:pred_idx]))
mse_errors.append((std_avg_predictions[-1]-train_data[pred_idx])**2)
std_avg_x.append(date)
print('MSE error for standard averaging: %.5f'%(0.5*np.mean(mse_errors)))
8条答案
按热度按时间col17t5w1#
我知道这篇文章是旧的,但当我在这里绊倒,其他人会..在运行相同的问题和谷歌相当多,我发现了一个职位https://github.com/llSourcell/Make_Money_with_Tensorflow_2.0/issues/7
所以如果你下载一个太小的数据集,它会抛出这个错误。下载1962年的.csv文件,它会足够大;).
现在,我只需要为我的数据集找到正确的参数..因为我正在将其调整为另一种类型的预测..希望它能有所帮助
z8dt9xmd2#
train_data
变量的长度为2264:然后,当你去拟合定标器时,你在for循环的第三次迭代中超出了
train_data
的边界:注意教程中数据集的大小。训练和测试块的长度都是11,000,而
smoothing_window_size
是2500,所以它永远不会超过train_data
的边界。kpbpu0083#
您的数据中有一个全为0的列。如果您尝试缩放该列,MinMaxScaler将无法分配缩放比例,并且会出错。您需要在缩放数据之前筛选出空/0列。请尝试:
筛选出数据中的nan列
hyrbngr74#
我得道歉,因为你们一直在试图找出一个解决我的问题的办法,我最终找到了一个体面的指南,并采取了一个不那么复杂的方法(因为这是我第一次尝到人工智能和统计学的味道)有趣的是,我为此头疼了好几个月,直到去年11月我去佛罗里达参加一个会议,凌晨3点在酒店房间里不到两个小时就完成了。
下面是我当时编写的代码,最后作为一个工作示例提交给我的同事
请随时进行修改,并在您认为合适的情况下进行试验。我要感谢大家花时间研究我的问题并提供各种解决方案,并期待着在未来了解更多:)
qacovj5a5#
我第一次评论Stackoverflow,请如果你发现错误对我如何回答,或者如果你发现错误,请纠正我
所以对于以上的误差要使计算简单化,以及如何才能避免以上的数值误差。
上面的代码可以工作我的
mid_prices
变量的长度为2024,所以我的被分成两个大小为1012的块
现在,如果您查看tutorial提供的代码
他的总大小是22000,他将它们分成两个11000的块用于测试和训练,然后对于定标器,他在for循环中使用从0到10000的范围和2500的平滑窗口大小,如果我错了,请纠正我,通过该10k集合进行5次迭代。
用作者用的这个逻辑我做了这个
它与我的数据集和所提供的示例完美地结合在一起。
我希望这个答案足以解决这个问题
vq8itlhq6#
你的问题不是你的CSV或Pandas。你实际上可以直接把带有Pandas的CSV读到 Dataframe 中,这是我建议你做的。
df = pd.read_csv(path)
同样的代码我也遇到了同样的问题。发生的是
Scaler = MinMaxScaler
,然后在范围部分中的for di,你正在拟合训练集中的数据,然后转换它,并重新分配给它自己。问题是,它试图在训练集中找到更多的数据来适应定标器,结果数据用完了。这很奇怪,因为你所遵循的教程是这样呈现的。
5us2dqdw7#
我看到Window是1100,在for循环中,从0到4400,间隔为1100,余数为0,剩下0项需要规范化,所以
您不需要这些代码行,只需注解掉这些代码行即可。
dxpyg8gm8#
我在为一个基于逻辑回归的文本分类软件包编写单元测试时遇到了同样的错误信息,我意识到这是由于试图将一个模型应用于一个空df。
在我的例子中,这是可能发生的,因为我的模型实际上是一个模型树,它反映了我的(巨大的)训练数据中的类别树,但只有少数子案例实际上发生在我的单元测试中的小测试df中。
长话短说:我认为错误的发生可能是因为
循环中的长度为0。