Pandas的Sqlite的NTILE给出了操作错误

2024-04-26 23:10:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用NTILE函数从pandas查询SQLite数据库,但是我没有成功,尽管我已经多次重新检查了语法。在

以下是自包含的示例。 设置:

import pandas as pd
from sqlalchemy import create_engine
disk_engine = create_engine('sqlite:///test.db')

marks = pd.DataFrame({'StudentID': ['S1', 'S2', 'S3', 'S4', 'S5'],
                      'Marks': [75, 83, 91, 83, 93]})
marks.to_sql('marks_sql', disk_engine, if_exists='replace')

现在尝试使用NTILE:

^{pr2}$

回溯很长,但主要部分是:

OperationalError: near "(": syntax error
OperationalError: (sqlite3.OperationalError) near "(": syntax error [SQL: 'select StudentID, Marks, NTILE(2) OVER (ORDER BY Marks DESC)\n        AS groupexample FROM marks_sql']

谢谢!在


Tags: importpandassqlcreateerrorenginepddisk
1条回答
网友
1楼 · 发布于 2024-04-26 23:10:15

SQLITE中没有NTILE () OVER功能

给我同样的错误,需要用更复杂的查询或函数来创建这个

Here is a list of unsupported analytical functions在SQLITE中不可用

NTILE就是其中之一

优化器首先在查询中找到OVER,它认为它是一个列名,并且不希望(跟在列名之后,所以会给出这个错误。在

要复制到之前,请尝试以下操作:

select * ,
case 
  when 
    (select count(*)+0.0 from marks_sql b where table.Marks >= b.Marks)
    /(select count(*) from marks_sql ) >0.5 
  then 1 
  else 2 end
from marks_sql;

为了实现这一点,以使表的大小可以增加,并且该技术仍然适用,我们必须做一些事情:

因此,首先我们按Marks对表排序(本质上创建一个排名)。这将计算具有更高或相等Marks的行数:

^{pr2}$

我们加上0.0使这个数字成为一个浮点数,这样我们的分数就可以在下一步工作了。在

然后取秩并除以总行数

select count(*) from marks_sql   row count

这给了我们一个分数范围的分布,每个学生的百分位数。但是我们不关心每一个精确的百分位数,我们关心的是NTILE(2)或者它们是否在上半部分。在

这就是CASE语句发挥作用的地方。如果学生的百分位数超过50%,他们就属于第1组,即前50个百分位。其他人都属于2组。在

相关问题 更多 >