Ошибка с датами в датафреймах, concat занимает слишком много времени, неправильный вывод графика - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть вопрос, который я не могу решить, и я действительно не понимаю, что происходит.

У меня есть оригинальный набор данных lrdata4

	year	total_vehicles
0	2000	419587299
1	2001	425832533
2	2002	430480581
3	2003	434270003
4	2004	442680113

from statsmodels.tools.eval_measures import rmse
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dropout
import warnings

warnings.filterwarnings('ignore')

Когда я делаю это

lrdata4.year = pd.to_datetime(lrdata4.year)
lrdata4 = lrdata4.set_index('year')
lrdata4.tail(10)

Годы меняются, и я не знаю почему. Любая помощь?

total_vehicles
year	
1970-01-01 00:00:00.000002009	443333980
1970-01-01 00:00:00.000002010	438827716
1970-01-01 00:00:00.000002011	440461505
1970-01-01 00:00:00.000002012	440073277
1970-01-01 00:00:00.000002013	441751395
1970-01-01 00:00:00.000002014	451394270
1970-01-01 00:00:00.000002015	460050397
1970-01-01 00:00:00.000002016	470256985
1970-01-01 00:00:00.000002017	474693803
1970-01-01 00:00:00.000002018	473765568

Итак, я готовлю модель к прогнозу временного ряда

train, test = lrdata4[:-12], lrdata4[-12:]

enter code herescaler = MinMaxScaler()
scaler.fit(train)
train = scaler.transform(train)
test = scaler.transform(test)


n_input = 24
n_features = 1

generator = TimeseriesGenerator(train, train, length = n_input, batch_size =1000)

model = Sequential()
model.add(LSTM(200, activation= 'relu', input_shape=(n_input, n_features)))
model.add(Dropout(0.15))
model.add(Dense(1))
model.compile(optimizer='adam', loss ='mse')

model.fit_generator(generator, epochs=20)

Я получаю прогнозы и добавляю их в список

pred_list = []

batch = train[-n_input:].reshape((1 ,n_input, n_features))

for i in range(n_input):
    pred_list.append(model.predict(batch)[0])
    batch = np.append(batch[:, 1:,:],[[pred_list[i]]], axis=1)

И я пытаюсь объединить мой исходный кадр данных lrdata4 и новый кадр данных df_predict

df_predict = pd.DataFrame(scaler.inverse_transform(pred_list), index= lrdata4[-n_input:].index,columns=['Predictions'])
df_test = pd.concat([lrdata4, df_predict], axis = 1)

Но конкат длится вечно. Я оставил это в течение 4 часов, и это все еще продолжалось. Это потому, что в моем исходном наборе данных содержится 200 тыс. Данных? Есть ли другой способ сделать это?

Я пытался построить их по-другому, как это

plt.figure(figsize= (20,5))
plt.plot(lrdata4.index, lrdata4['total_vehicles'])
plt.plot(df_predict.index, df_predict['Predictions'], color ='r')
plt.show()

, но график не является линейным графиком с исходными данными и прогнозными данными в виде непрерывного линейного графика, а годы неверны, что я не понимаю, почему Так выглядит график

1 Ответ

0 голосов
/ 28 апреля 2020

Здесь год является целым числом - поэтому попытка преобразования в дату не будет работать. Если вы действительно хотите, чтобы это было время даты, вы можете попытаться преобразовать год, используя что-то вроде:

df['year'] = df['year'].apply(lambda x: '{}-01-01'.format(x))

, а затем преобразовать время в дату, используя pd.to_datetime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...