Я пытаюсь сравнить объекты двух временного ряда, используя numpy.where
. Но каждый раз получаю ошибку. Я пробовал много решений, упомянутых в разных ответах на переполнение стека, но ничего не помогло мне.
Вот мои объекты временных рядов:
1.
ds y
2020-02-21 13:57:57.615000010 80.828597
2.
timestamp yhat yhat_lower yhat_upper
2020-02-21 13:58:56.430000067 1.477117 -1.029354 4.137891
Код для сравнения этих объектов двухвременного ряда:
return np.where(
(
((value_df1["y"] >= value_df2["yhat_upper"]))
| (value_df1["y"] <= value_df2["yhat_lower"])
),
1,
0,
)
Это индексы вышеуказанного временного ряда:
value_df1 index:: DatetimeIndex(['2020-02-21 13:57:57.615000010'], dtype='datetime64[ns]', name='ds', freq=None)
value_df2 index: DatetimeIndex(['2020-02-21 13:58:56.430000067'], dtype='datetime64[ns]', name='timestamp', freq=None)
Я пытался sort_index
а также reset_index
с различными опциями (например, inplace-true / false, drop-true / false), но ничего не работает, и я получаю разные ошибки для этих значений
Когда я пытался выполнить reset_index (drop = True) со следующими временными рядами:
ds y
2020-02-21 12:22:56.013000011 80.828597
И
timestamp yhat yhat_lower yhat_upper
2020-02-21 12:23:54.905999899 1.444405 -1.178725 4.267591
Возвращены следующие значения
value_df1 index:: RangeIndex(start=0, stop=1, step=1)
value_df2 index: RangeIndex(start=0, stop=1, step=1)
И результат сравнения был :
Фреймы данных прогноза:
timestamp anomaly yhat yhat_lower yhat_upper
2020-02-21 12:23:04.249000072 NaN NaN NaN NaN
2020-02-21 12:23:54.905999899 NaN NaN NaN NaN
Количество истинных аномалий:
ds y anomaly
2020-02-21 12:22:54.905999899 NaN NaN
Я не понимаю точно, что является причиной root здесь, любая помощь будет высоко ценится. Спасибо
~
РЕДАКТИРОВАТЬ: Вот мой код Фрагмент
Я пытаюсь освободить код обнаружения аномалии из: https://github.com/AICoE/prometheus-anomaly-detector и https://github.com/AICoE/prometheus-anomaly-detector/blob/master/test_model.py
def calculate_rmse(predicted, true):
"""Calculate the Root Mean Squared Error (RMSE) between the predicted and true values."""
return (((predicted - true) ** 2).mean()) ** 0.5
def calculate_accuracy(predicted, true):
"""Calculate the accuracy of the predictions."""
return (1 - sum(abs(predicted - true)) / len(true)) * 100
def label_true_anomalies(true_value_df, threshold_value):
"""Label the true anomalies."""
# label true anomalies based on a simple linear threshold,
# can be replaced with a more complex calculation based on metric data
return np.where(true_value_df["y"] > threshold_value, 1, 0)
def label_predicted_anomalies(true_value_df, predicted_value_df):
"""Label the predicted anomalies."""
_LOGGER.info("############ in label_predicted_anomalies, true_value_df[y]: %s", true_value_df["y"])
_LOGGER.info("############ in label_predicted_anomalies, predicted_value_df[yhat_upper]): %s", predicted_value_df["yhat_upper"])
return np.where(
(
((true_value_df["y"] >= predicted_value_df["yhat_upper"]))
| (true_value_df["y"] <= predicted_value_df["yhat_lower"])
),
1,
0,
)
def compute_true_positive_rate(forecasted_anomalies, labeled_anomalies):
"""Calculate the true positive rate."""
num_true_positive = sum(
(forecasted_anomalies.values == 1) & (labeled_anomalies.values == 1)
)
true_postive_rate = num_true_positive / sum(labeled_anomalies.values)
return true_postive_rate
true_values = Metric(test_data_list[item + 1])
true_values.metric_values = true_values.metric_values.set_index("ds")
true_df += true_values.metric_values
# for each item in the test_data list, update the model (append new data and train it)
model_mp.train(test_data_list[item], len(true_values.metric_values))
# get the timestamp for the median value in the df
metric_timestamp = true_values.metric_values.index.values[
int(len(true_values.metric_values) / 2)
]
metric_timestamp = int(metric_timestamp.astype("uint64") / 1e6)
# calculate predicted anomaly
_LOGGER.info("##############################################################################")
_LOGGER.info("true metric values: \n %s", true_values.metric_values)
_LOGGER.info("############################################")
_LOGGER.info("predicted Data frames: \n %s", model_mp.predicted_df)
_LOGGER.info("##############################################################################")
model_mp.predicted_df["anomaly"] = label_predicted_anomalies(
true_values.metric_values, model_mp.predicted_df
)
# store the prediction df for every interval
predicted_df = predicted_df + model_mp.predicted_df
_LOGGER.info("##########################################################################################")
_LOGGER.info("############### the prediction data frames: %s", predicted_df)
# Label True Anomalies
true_values.metric_values["anomaly"] = label_true_anomalies(
true_values.metric_values, Configuration.true_anomaly_threshold
)
true_df += true_values.metric_values
_LOGGER.info("True Anomalies: %s", true_df)
# Total number of predicted and ground truth anomalies
sum_predicted_anomalies = sum(model_mp.predicted_df["anomaly"])
sum_ground_truth_anomalies = sum(true_values.metric_values["anomaly"])
_LOGGER.info("Total number of predicted anomalies: %d", sum_predicted_anomalies)
_LOGGER.info("Total number of ground truth anomalies: %d", sum_ground_truth_anomalies)
num_true_positives += sum(
(model_mp.predicted_df["anomaly"] == 1)
& (true_values.metric_values["anomaly"] == 1)
)
num_ground_truth_anomalies += sum_ground_truth_anomalies
# Calculate accuracy
accuracy = calculate_accuracy(
model_mp.predicted_df["anomaly"].values,
true_values.metric_values["anomaly"].values,
)
# Calculate RMSE
rmse = calculate_rmse(model_mp.predicted_df.yhat, true_values.metric_values.y)
_LOGGER.info("accuracy: %s", accuracy)
_LOGGER.info("rmse: %s", rmse)
_LOGGER.info("##########################################################################################")
# Calculate True positive rate for anomalies
true_positive_rate = compute_true_positive_rate(
model_mp.predicted_df["anomaly"], true_values.metric_values["anomaly"]
)