【问题标题】:Creating A Pandas DataFrame From Two Separate DataFrames从两个单独的 DataFrame 创建 Pandas DataFrame
【发布时间】:2018-04-23 04:10:28
【问题描述】:

尝试编写一个函数来求解给定两个单独的 Pandas DataFrame 的曲线下面积。正如 print 语句所证实的那样,DataFrame 的列已正确解包,但是,我无法从单独的帧中创建新的 Dataframe 或引用 fpr 数据帧的特定索引来进行计算。

def areaUnderCurve(tpr, fpr):
auc = 0.0
for fpr, tpr in zip(tpr['True Positive Rate'], fpr['False Positive Rate']):
    auc += np.trapz(y=fpr['False Positive Rate'], x=tpr['True Positive Rate'])                      
return auc

calcAUC = areaUnderCurve(dataframe, dataframe)
print(calcAUC)

打印语句的示例输出:

0 1.0 0.94
1 1.0 0.8866666666666667
2 1.0 0.8133333333333334
3 1.0 0.7866666666666666
4 1.0 0.78
5 1.0 0.6533333333333333
6 1.0 0.6333333333333333
7 1.0 0.6266666666666667
8 1.0 0.6133333333333333
9 1.0 0.6

***更新代码尝试根据答案计算 AUC,收到以下错误“float object is not subscriptable”

【问题讨论】:

    标签: python pandas dataframe auc


    【解决方案1】:

    numpy 具有数值积分方法,例如,np.trapz 使用梯形规则进行计算。

    import numpy as np
    
    np.trapz(y=fpr['False Positive Rate'], x=tpr['True Positive Rate'])
    

    应该给你面积。

    【讨论】:

    • 确实如此。 Numpy 很强大,我仍然感到惊讶。将在 trapz 上进行更多探索
    【解决方案2】:

    @Jay 派

    要回答您的第一个问题,您绝对可以从两个数据框创建一个数据框

    data=pd.DataFrame(zip(tpr['True Positive Rate'],fpr['False Positive Rate']),columns=['TPR','FPR'])
    

    为了计算 ROC,您可以在这个数据帧上使用以下逻辑

    data['dFPR']=list(np.diff(data['FPR'].values)) + [0]
    data['dTPR']=list(np.diff(data['TPR'].values)) + [0]
    data['sum1']=data.apply(lambda x : x['TPR'] * x['dFPR'],axis=1)
    data['sum2']=data.apply(lambda x : x['dTPR'] * x['dFPR'],axis=1)
    ROC=sum(data['sum1']) + sum(data['sum2'])/2
    

    随机值示例

    tpr=pd.DataFrame(np.random.rand(100,2),columns=['Col1','True Positive Rate'])
    fpr=pd.DataFrame(np.random.rand(100,2),columns=['Col2','False Positive Rate'])
    data=pd.DataFrame(zip(tpr['True Positive Rate'],fpr['False Positive Rate']),columns=['TPR','FPR'])
    data['dFPR']=list(np.diff(data['FPR'].values)) + [0]
    data['dTPR']=list(np.diff(data['TPR'].values)) + [0]
    data['sum1']=data.apply(lambda x : x['TPR'] * x['dFPR'],axis=1)
    data['sum2']=data.apply(lambda x : x['dTPR'] * x['dFPR'],axis=1)
    ROC=sum(data['sum1']) + sum(data['sum2'])/2
    print(ROC)
    

    0.773539521758

    【讨论】:

    • 你重新演绎了这个真的很酷。仅供参考:numpy(pandas 的父包),具有更快、更准确、调试更好的数值积分函数。
    • 无论如何,很好的答案。点赞。
    • @Anant Gupta 感谢您的回答!我已经能够计算 ROC 并且位于单独的数据框中。我的目标是计算 AUC。不确定这是否是答案中的错字。
    • 同样接收数据参数不能是合并数据帧解决方案的迭代器。
    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 2021-11-26
    • 2016-03-05
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多