python中如何计算百分数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中如何计算百分数相关的知识,希望对你有一定的参考价值。

#小智的智商从去年的100分提升到今年的132分,请计算小智智商提升的百分比,并用字符串格式化显示出“xx.x%”的形式,保留一位小数

lastYearIQ = 100
thisYearIQ = 132
growthRateIQ = (thisYearIQ-lastYearIQ)/lastYearIQ
print('小智智商今年比去年提高了%.1f%%'%(growthRateIQ*100))
#输出:小智智商今年比去年提高了32.0%

参考技术A

不知道你是不是这个意思?

>>> a = float(5.69875)
>>> b = float(8.49385)
>>> print a/b
0.670926611607
>>> print "%.2f%%" % (a/b*100)
67.09%
>>> print "%.4f%%" % (a/b*100)
67.0927%

本回答被提问者和网友采纳
参考技术B 回答

亲亲您好,根据您的问题描述,这边经过查询并经过审慎分析,得出答案如下哦亲亲:a = 5.1b = 4.2print a/bprint "%.3f" % (a/b)如果只是获得普通的百分数,就直接a/b如果是要保留小数点后面几位,就要用下面的那种,比如保留小数点三位,就是"%.3f"

参考技术C a = 5.1
b = 4.2
print a/b
print "%.3f" % (a/b)

如果只是获得普通的百分数,就直接a/b

如果是要保留小数点后面几位,就要用下面的那种,比如保留小数点三位,就是"%.3f"

在 MySQL 中计算百分位排名

【中文标题】在 MySQL 中计算百分位排名【英文标题】:Calculating percentile rank in MySQL 【发布时间】:2010-11-06 14:54:06 【问题描述】:

我在 MySQL 中有一个非常大的测量数据表,我需要为这些值中的每一个计算百分位等级。 Oracle 似乎有一个名为 percent_rank 的函数,但我找不到与 MySQL 类似的任何东西。当然,我可以在 Python 中对它进行暴力破解,无论如何我都会使用它来填充表格,但我怀疑这会非常低效,因为一个样本可能有 200.000 个观察值。

【问题讨论】:

你能解释一下你所说的百分位数是什么意思吗? @AssafLavie : en.wikipedia.org/wiki/Percentile_rank 我创建了一个适用于任何百分位数的 Mysql 函数:***.com/a/40266115/1662956 【参考方案1】:

MySQL 8 终于引入了窗口函数,其中就有你要找的PERCENT_RANK() 函数。所以,就写吧:

SELECT col, percent_rank() OVER (ORDER BY col)
FROM t
ORDER BY col

您的问题提到了“百分位数”,这是一个略有不同的东西。为了完整起见,在 SQL 标准和一些 RBDMS(Oracle、PostgreSQL、SQL Server、Teradata)中有 PERCENTILE_DISCPERCENTILE_CONT 逆分布函数,但在 MySQL 中没有。使用 MySQL 8 和窗口函数,you can emulate PERCENTILE_DISC, however, again using the PERCENT_RANK and FIRST_VALUE window functions。

【讨论】:

【参考方案2】:

假设我们有一个这样的销售表:

user_id,单位

然后以下查询将给出每个用户的百分位数:

select a.user_id,a.units,
(sum(case when a.units >= b.units then 1 else 0 end )*100)/count(1) percentile
from sales a join sales b ;

请注意,这将用于交叉连接,因此会导致 O(n2) 复杂度,因此可以视为未优化的解决方案,但鉴于我们在 mysql 版本中没有任何功能,这似乎很简单。

【讨论】:

【参考方案3】:
SELECT 
    c.id, c.score, ROUND(((@rank - rank) / @rank) * 100, 2) AS percentile_rank
FROM
    (SELECT 
    *,
        @prev:=@curr,
        @curr:=a.score,
        @rank:=IF(@prev = @curr, @rank, @rank + 1) AS rank
    FROM
        (SELECT id, score FROM mytable) AS a,
        (SELECT @curr:= null, @prev:= null, @rank:= 0) AS b
ORDER BY score DESC) AS c;

【讨论】:

【参考方案4】:

如果您将 SQL 与 PHP 等过程语言相结合,您可以执行以下操作。此示例将多余的航班阻塞时间分解为机场的百分位数。将 MySQL 中的 LIMIT x,y 子句与ORDER BY 结合使用。不是很漂亮,但可以完成工作(对不起,格式问题):

$startDt = "2011-01-01";
$endDt = "2011-02-28";
$arrPort= 'JFK';

$strSQL = "SELECT COUNT(*) as TotFlights FROM FIDS where depdt >= '$startDt' And depdt <= '$endDt' and ArrPort='$arrPort'";
if (!($queryResult = mysql_query($strSQL, $con)) ) 
    echo $strSQL . " FAILED\n"; echo mysql_error();
    exit(0);

$totFlights=0;
while($fltRow=mysql_fetch_array($queryResult)) 
    echo "Total Flights into " . $arrPort . " = " . $fltRow['TotFlights'];
    $totFlights = $fltRow['TotFlights'];

    /* 1906 flights. Percentile 90 = int(0.9 * 1906). */
    for ($x = 1; $x<=10; $x++) 
        $pctlPosn = $totFlights - intval( ($x/10) * $totFlights);
        echo "PCTL POSN for " . $x * 10 . " IS " . $pctlPosn . "\t";
        $pctlSQL = "SELECT  (ablk-sblk) as ExcessBlk from FIDS where ArrPort='" . $arrPort . "' order by ExcessBlk DESC limit " . $pctlPosn . ",1;";
        if (!($query2Result = mysql_query($pctlSQL, $con)) ) 
            echo $pctlSQL  . " FAILED\n";
            echo mysql_error();
            exit(0);
        
        while ($pctlRow = mysql_fetch_array($query2Result)) 
            echo "Excess Block is :" . $pctlRow['ExcessBlk'] . "\n";
        
    

【讨论】:

【参考方案5】:

这是一种不需要加入的不同方法。在我的情况下(一个超过 15,000 行的表),它运行大约 3 秒。 (JOIN 方法花费的时间要长一个数量级)。

在示例中,假设 measure 是您计算排名百分比的列,而 id 只是一个行标识符(不是必需的):

SELECT
    id,
    @prev := @curr as prev,
    @curr := measure as curr,
    @rank := IF(@prev > @curr, @rank+@ties, @rank) AS rank,
    @ties := IF(@prev = @curr, @ties+1, 1) AS ties,
    (1-@rank/@total) as percentrank
FROM
    mytable,
    (SELECT
        @curr := null,
        @prev := null,
        @rank := 0,
        @ties := 1,
        @total := count(*) from mytable where measure is not null
    ) b
WHERE
    measure is not null
ORDER BY
    measure DESC

这种方法的功劳归于 Shlomi Noach。他在这里详细描述了它:

http://code.openark.org/blog/mysql/sql-ranking-without-self-join

我在 MySQL 中对此进行了测试,效果很好;对 Oracle、SQLServer 等一无所知。

【讨论】:

不幸的是,这取决于用户变量的评估顺序,这是未定义的行为。该链接中的第一条评论引用了 MySQL 手册:“用户变量的评估顺序未定义,可能会根据给定查询中包含的元素而改变......一般规则是永远不要为用户变量赋值在语句的一部分中,并在同一语句的其他部分中使用相同的变量。您可能会得到预期的结果,但这不能保证。参考:dev.mysql.com/doc/refman/5.1/en/user-variables.html【参考方案6】:

这是一个比较难看的答案,说出来我很内疚。也就是说,它可能会帮助您解决问题。

确定百分比的一种方法是计算所有行数,并计算大于您提供的数字的行数。您可以计算大于或小于,并根据需要取逆。

为您的号码创建索引。 总计 = 选择计数(); less_equal = select count() where value > indexed_number;

百分比类似于:less_equal / total 或 (total - less_equal)/total

确保它们都在使用您创建的索引。如果不是,请调整它们直到它们是。解释查询应该在右侧列中有“使用索引”。在 select count(*) 的情况下,它应该使用 InnoDB 的 index 和 MyISAM 之类的东西。 MyISAM 将随时知道这个值,而无需计算。

如果您需要将百分比存储在数据库中,您可以使用上面的设置来提高性能,然后使用第二个查询作为内部选择来计算每一行的值。第一个查询的值可以设置为常量。

这有帮助吗?

雅各布

【讨论】:

我实际上是在几周前尝试过的,它非常慢,所以我最终在 python 中计算百分位数并将值放入数据库中。 您尝试使用 select count() 和 select count() @TheJacobTaylor 正确答案但缺少代码。如果你提出一个功能性的“选择不同”类型的查询,你会得到我的 +1。此外,如果你能解决这个问题,你会得到一个漂亮的闪亮 +1 并检查! ;)) ***.com/questions/13689434/…【参考方案7】:

要获得排名,我想说你需要(左)外部加入表格本身,例如:

select t1.name, t1.value, count(distinct isnull(t2.value,0))  
from table t1  
left join table t2  
on t1.value>t2.value  
group by t1.name, t1.value 

对于每一行,您将计算同一张表中有多少(如果有)行具有较低的值。

请注意,我更熟悉 sqlserver,因此语法可能不正确。此外,不同的可能没有您想要实现的正确行为。但这是一般的想法。 然后,要获得真正的百分位排名,您需要首先获取变量中值的数量(或不同的值,具体取决于您要采用的约定),并使用上面给出的实际排名计算百分位排名。

【讨论】:

【参考方案8】:

没有简单的方法可以做到这一点。见http://rpbouman.blogspot.com/2008/07/calculating-nth-percentile-in-mysql.html

【讨论】:

我正在寻找的实际上是它的倒数,即给定一个数字,它应该告诉我它的排名。我有点相信这在 Oracle 中会更容易,但不幸的是这是不可能的。

以上是关于python中如何计算百分数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中使用 libSVM 计算精度、召回率和 F 分数

如何使用 Python (scikit-learn) 计算 FactorAnalysis 分数?

如何使用 python 打印精度、召回率、f 分数?

Python 计算总分数和平均分

oracle如何查询分数最高同学的信息并且计算记录的条数

一次性计算精度、召回率和 F 分数 - python