繁体   English   中英

ORACLE PL / SQL PIVOT过程

[英]ORACLE PL/SQL PIVOT procedure

我试图编写一个Oracle PL / SQL过程来计算一个简单的混淆矩阵表。 我已经准备好标签数据,基本上是两列0和1,实际值与预测值。

我能够用简单的枢轴来计算它(我认为是最简单的选择):

SELECT * FROM 
( SELECT ACTUAL_VALUE, PREDICTED_VALUE
FROM MY_TABLE
)
PIVOT (
COUNT(PREDICTED_VALUE)
FOR PREDICTED_VALUE IN (1, 0))
ORDER BY ACTUAL_VALUE;

现在,我试图将所有这些“插入” DECLARE,BEGIN ...框架,但没有成功。 甚至可以创建程序来计算此枢轴吗?

预先感谢您的任何建议!

我不得不使用游标和循环。 并使我的计算以此方式进行。 因此,关闭这一步骤。最后再加上3个汇总计算。 谢谢

CREATE OR REPLACE PROCEDURE "mydb"."C_MATRIX" 
IS
    CURSOR MY_DATA IS
        SELECT ACTUAL_CARD, PREDICTED_VALUE FROM my_table; 
    my_data_rec my_data%rowtype; 

    fp pls_integer := 0;
    tp pls_integer := 0;
    fn pls_integer := 0;
    tn pls_integer := 0;

BEGIN 
    OPEN my_data; 
    LOOP 
        FETCH my_data INTO my_data_rec; 
        EXIT WHEN my_data%notfound; 
            IF my_data_rec.ACTUAL_CARD = 0 and my_data_rec.PREDICTED_VALUE = 0 then
                tn := tn + 1;
            elsif my_data_rec.ACTUAL_CARD = 0 and my_data_rec.PREDICTED_VALUE = 1 then
                fn := fn + 1;
            elsif my_data_rec.ACTUAL_CARD = 1 and my_data_rec.PREDICTED_VALUE = 1 then
                tp := tp + 1;      
            elsif my_data_rec.ACTUAL_CARD = 1 and my_data_rec.PREDICTED_VALUE = 0 then
                fp := fp + 1;        
            end if;
    END LOOP; 

    dbms_output.put_line
    ('Number of false Positives: ' ||fp || '  Number of true Positives: ' ||tp  || '       Total numbers of records: ' ||(fp + tp) );
    dbms_output.put_line
    ('Number of false Negatives: ' ||fn || '   Number of true Negatives: ' ||tn  || '       Total numbers of records: ' ||(fn + tn ));
    dbms_output.put_line(' ');
    dbms_output.put_line
    (' Incorrect predictions: ' || (fp + fn) || '  Correct predictions: ' || (tp + tn) );
    dbms_output.put_line(' ');
    dbms_output.put_line(' Acurracy: ' || round((((tn + tp) / (tn + tp + fn + fp)) * 100),2) || '%');
    dbms_output.put_line(' Precision: ' || round(((tp / (tp + fp)) * 100),2) || '%');
    dbms_output.put_line(' Recall: ' || round(((tp / (tp + fn)) * 100),2) || '%');
END; 
/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM