Anonymous
Почему я получаю: sns.lineplot(x=anomaly_df['Date'], y=scaler.inverse_transform(anomaly_df['Close/Last']))
Сообщение
Anonymous » 09 дек 2024, 13:13
Код: Выделить всё
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Input, Dropout
from keras.layers import Dense
from keras.layers import RepeatVector
from keras.layers import TimeDistributed
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from keras.models import Model
import seaborn as sns
dataframe = pd.read_csv('spxMoreData.csv')
df = dataframe[['Date', 'Close/Last']]
df['Date'] = pd.to_datetime(df['Date'])
#print(df['Close/Last'].dtype)
sns.lineplot(x=df['Date'], y=df['Close/Last'])
plt.show()
print("Start date is: ", df['Date'].min())
print("End date is: ", df['Date'].max())
#Change train data from mid 2022....seems to be a jump early 2022
train, test = df.loc[df['Date'] '2022-01-03']
#Scaler
scaler = StandardScaler()
scaler = scaler.fit(train[['Close/Last']])
train['Close/Last'] = scaler.transform(train[['Close/Last']])
test['Close/Last'] = scaler.transform(test[['Close/Last']])
# Number of time steps to look back
# Larger sequences (look further back) may improve forecasting
seq_size = 30
def to_sequences(x, y, seq_size=1):
x_values = []
y_values = []
for i in range(len(x)-seq_size):
#print(i)
x_values.append(x.iloc[i:(i+seq_size)].values)
y_values.append(y.iloc[i+seq_size])
return np.array(x_values), np.array(y_values)
trainX, trainY = to_sequences(train[['Close/Last']], train['Close/Last'], seq_size)
testX, testY = to_sequences(test[['Close/Last']], test['Close/Last'], seq_size)
# Try a model
model = Sequential()
model.add(LSTM(128, input_shape =(trainX.shape[1], trainX.shape[2])))
model.add(Dropout(rate=0.2))
model.add(RepeatVector(trainX.shape[1]))
model.add(LSTM(128, return_sequences=True))
model.add(Dropout(rate=0.2))
model.add(TimeDistributed(Dense(trainX.shape[2])))
model.compile(optimizer='adam', loss='mae')
model.summary()
#fit model
history = model.fit(trainX, trainY, epochs=10, batch_size=32, validation_split=0.1, verbose=1)
plt.plot(history.history['loss'], label='Training loss')
plt.plot(history.history['val_loss'], label='Validation loss')
plt.legend()
plt.show()
# mean absolute error
trainPredict = model.predict(trainX)
trainMAE = np.mean(np.abs(trainPredict - trainX), axis=1)
plt.hist(trainMAE, bins=30)
max_trainMAE = 0.3 # or define 90% value of max as threshold.
plt.show()
testPredict = model.predict(testX)
testMAE = np.mean(np.abs(testPredict - testX), axis=1)
plt.hist(testMAE, bins=30)
# lets capture the anomaly
#Capture all details in a Dataframe for easy plotting
anomaly_df = pd.DataFrame(test[seq_size:])
anomaly_df['testMAE'] = testMAE
anomaly_df['max_trainMAE'] = max_trainMAE
anomaly_df['anomaly'] = anomaly_df['testMAE'] > anomaly_df['max_trainMAE']
anomaly_df['Close/Last'] = test[seq_size:]['Close/Last']
#plot testMAE vs max_trainMAE
sns.lineplot(x=anomaly_df['Date'], y=anomaly_df['testMAE'])
sns.lineplot(x=anomaly_df['Date'], y=anomaly_df['max_trainMAE'])
plt.show()
anomalies = anomaly_df.loc[anomaly_df['anomaly']== True]
#plot anomalies
sns.lineplot(x=anomaly_df['Date'],y=scaler.inverse_transform(anomaly_df['Close/Last']))
sns.scatterplot(x=anomalies['Date'],y=scaler.inverse_transform(anomalies['Close/Last']), color='r')
когда я дохожу до последней части и запускаю код, он выдает ошибку. Я использую Python Spyder.
Код: Выделить всё
#plot anomalies
sns.lineplot(x=anomaly_df['Date'], y=scaler.inverse_transform(anomaly_df['Close/Last']))
sns.scatterplot(x=anomalies['Date'],y=scaler.inverse_transform(anomalies['Close/Last']), color='r')
когда я запускаю последнюю часть кода, я получаю следующую ошибку:
ValueError: Ожидается двумерное значение контейнер, но вместо этого получил . Вместо этого передайте DataFrame, содержащий одну строку (т. е. один образец) или один столбец (т. е. один объект).
Как это исправить?
Как это исправить?
Как это исправить?
Как это исправить?
п>
Подробнее здесь:
https://stackoverflow.com/questions/792 ... er-inverse
1733739239
Anonymous
[code]import numpy as np from keras.models import Sequential from keras.layers import LSTM, Input, Dropout from keras.layers import Dense from keras.layers import RepeatVector from keras.layers import TimeDistributed import pandas as pd from matplotlib import pyplot as plt from sklearn.preprocessing import MinMaxScaler, StandardScaler from keras.models import Model import seaborn as sns dataframe = pd.read_csv('spxMoreData.csv') df = dataframe[['Date', 'Close/Last']] df['Date'] = pd.to_datetime(df['Date']) #print(df['Close/Last'].dtype) sns.lineplot(x=df['Date'], y=df['Close/Last']) plt.show() print("Start date is: ", df['Date'].min()) print("End date is: ", df['Date'].max()) #Change train data from mid 2022....seems to be a jump early 2022 train, test = df.loc[df['Date'] '2022-01-03'] #Scaler scaler = StandardScaler() scaler = scaler.fit(train[['Close/Last']]) train['Close/Last'] = scaler.transform(train[['Close/Last']]) test['Close/Last'] = scaler.transform(test[['Close/Last']]) # Number of time steps to look back # Larger sequences (look further back) may improve forecasting seq_size = 30 def to_sequences(x, y, seq_size=1): x_values = [] y_values = [] for i in range(len(x)-seq_size): #print(i) x_values.append(x.iloc[i:(i+seq_size)].values) y_values.append(y.iloc[i+seq_size]) return np.array(x_values), np.array(y_values) trainX, trainY = to_sequences(train[['Close/Last']], train['Close/Last'], seq_size) testX, testY = to_sequences(test[['Close/Last']], test['Close/Last'], seq_size) # Try a model model = Sequential() model.add(LSTM(128, input_shape =(trainX.shape[1], trainX.shape[2]))) model.add(Dropout(rate=0.2)) model.add(RepeatVector(trainX.shape[1])) model.add(LSTM(128, return_sequences=True)) model.add(Dropout(rate=0.2)) model.add(TimeDistributed(Dense(trainX.shape[2]))) model.compile(optimizer='adam', loss='mae') model.summary() #fit model history = model.fit(trainX, trainY, epochs=10, batch_size=32, validation_split=0.1, verbose=1) plt.plot(history.history['loss'], label='Training loss') plt.plot(history.history['val_loss'], label='Validation loss') plt.legend() plt.show() # mean absolute error trainPredict = model.predict(trainX) trainMAE = np.mean(np.abs(trainPredict - trainX), axis=1) plt.hist(trainMAE, bins=30) max_trainMAE = 0.3 # or define 90% value of max as threshold. plt.show() testPredict = model.predict(testX) testMAE = np.mean(np.abs(testPredict - testX), axis=1) plt.hist(testMAE, bins=30) # lets capture the anomaly #Capture all details in a Dataframe for easy plotting anomaly_df = pd.DataFrame(test[seq_size:]) anomaly_df['testMAE'] = testMAE anomaly_df['max_trainMAE'] = max_trainMAE anomaly_df['anomaly'] = anomaly_df['testMAE'] > anomaly_df['max_trainMAE'] anomaly_df['Close/Last'] = test[seq_size:]['Close/Last'] #plot testMAE vs max_trainMAE sns.lineplot(x=anomaly_df['Date'], y=anomaly_df['testMAE']) sns.lineplot(x=anomaly_df['Date'], y=anomaly_df['max_trainMAE']) plt.show() anomalies = anomaly_df.loc[anomaly_df['anomaly']== True] #plot anomalies sns.lineplot(x=anomaly_df['Date'],y=scaler.inverse_transform(anomaly_df['Close/Last'])) sns.scatterplot(x=anomalies['Date'],y=scaler.inverse_transform(anomalies['Close/Last']), color='r') [/code] когда я дохожу до последней части и запускаю код, он выдает ошибку. Я использую Python Spyder. [code]#plot anomalies sns.lineplot(x=anomaly_df['Date'], y=scaler.inverse_transform(anomaly_df['Close/Last'])) sns.scatterplot(x=anomalies['Date'],y=scaler.inverse_transform(anomalies['Close/Last']), color='r') [/code] когда я запускаю последнюю часть кода, я получаю следующую ошибку: ValueError: Ожидается двумерное значение контейнер, но вместо этого получил . Вместо этого передайте DataFrame, содержащий одну строку (т. е. один образец) или один столбец (т. е. один объект). Как это исправить? Как это исправить? Как это исправить? Как это исправить? п> Подробнее здесь: [url]https://stackoverflow.com/questions/79264457/why-am-i-am-getting-an-the-sns-lineplotx-anomaly-dfdate-y-scaler-inverse[/url]