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.1b = 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_DISC
和 PERCENTILE_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 分数