Ошибка: «Можно сравнивать только идентично помеченные объекты Series» - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь сравнить объекты двух временного ряда, используя 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"]
)
...