Python 错误:';只能比较标签相同的系列对象';

Python 错误:';只能比较标签相同的系列对象';,python,pandas,numpy,anomaly-detection,Python,Pandas,Numpy,Anomaly Detection,我试图使用numpy.where比较两个时间序列对象。但每次都会出错。我尝试了不同的堆栈溢出答案中提到的许多解决方案,但没有任何帮助 以下是我的时间序列对象: 一, 二, 比较这两个时间序列对象的代码是: return np.where( ( ((value_df1["y"] >= value_df2["yhat_upper"])) | (value_df1["y"] <= value_df2["yhat_lower"]

我试图使用
numpy.where
比较两个时间序列对象。但每次都会出错。我尝试了不同的堆栈溢出答案中提到的许多解决方案,但没有任何帮助

以下是我的时间序列对象:

一,

二,

比较这两个时间序列对象的代码是:

return np.where(
        (
            ((value_df1["y"] >= value_df2["yhat_upper"]))
            | (value_df1["y"] <= value_df2["yhat_lower"])
        ),
        1,
        0,
    )
我尝试了
sort_index
以及
reset_index
,使用了不同的选项(如inplace-true/false、drop-true/false),但没有任何效果,这些值也出现了不同的错误

当我尝试使用以下时间序列重置_索引(drop=True)时:

ds                             y                                      
2020-02-21 12:22:56.013000011  80.828597

它返回以下值

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
我不知道到底什么是根本原因在这里,任何帮助将不胜感激。谢谢

~

编辑:这是我的代码片段

我正在尝试从以下位置执行异常检测代码: 及

def计算(预测,真):
“”“计算预测值和真实值之间的均方根误差(RMSE)。”
返回值(((预测-真)**2.mean())**0.5
def计算精度(预测、真实):
“”“计算预测的准确性。”“”
返回值(1-总和(绝对值(预测值-真))/len(真))*100
def标签真实异常(真实值、阈值):
“”“标记真正的异常。”“”
#根据简单的线性阈值标记真实异常,
#可以替换为基于度量数据的更复杂的计算
返回np.where(真值\u df[“y”]>阈值,1,0)
def标签预测异常(真值、预测值):
“”“标记预测的异常。”“”
_LOGGER.info(“#############在标签中预测的#异常,真值#df[y]:%s”,真值#df[“y”]))
_LOGGER.info(“标签中的预测异常,预测值df[yhat\u上限]:%s”,预测值df[“yhat\u上限])
返回np.where(
(
((真实值[y]>=预测值[y上方])

|(true_value_df[“y”]hmmm,
返回np。其中(…
始终返回
0
1
,您的完整代码是什么?因为
np.where
不返回任何数据帧。您还需要比较所有相同的索引数据帧吗?
值\u df1索引::范围索引(开始=0,停止=1,步骤=1)值\u df2索引:范围索引(start=0,stop=1,step=1)
?@jezrael,谢谢你的回复,我添加了我的代码片段
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
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"]
)