窗口函数在 pd.read_sql 中不起作用;它显示错误

Posted

技术标签:

【中文标题】窗口函数在 pd.read_sql 中不起作用;它显示错误【英文标题】:Window functions not working in pd.read_sql; Its shows error 【发布时间】:2020-08-11 02:21:31 【问题描述】:

我目前正在使用欧洲足球 SQLite 数据库在 Google Collab(Jupyter 笔记本)中进行数据分析。

分析目的;对于特定球队,例如:切尔西,获取每场比赛的胜负标签(使用 CASE 语句完成),然后按赛季和 win_loss 结果划分比赛计数。 这都是在 google collab(Jupyter notebook)中的 pd.read_sql() 语句中完成的。

在引入窗口函数之前,该语句运行良好。但是查询在 SQLite DB 浏览器中运行良好(附图片)。我得到的主要错误是OperationalError: near "(": syntax error

这里是代码

    Home_Perf = pd.read_sql(""" --- CTE to get the wins and loss as a home team
                            WITH Homes AS (
                            SELECT season, team_long_name AS HomeTeam,
                                   home_team_goal, away_team_goal,
                                   CASE 
                                       WHEN home_team_goal > away_team_goal THEN 'win'
                                       WHEN home_team_goal < away_team_goal THEN 'loss'
                                       ELSE 'Tie' END AS Win_Loss                                                
                            FROM match
                            ---Inner JOIN for getting the team name
                            INNER JOIN team 
                            ON team_api_id = home_team_api_id
                            WHERE home_team_api_id = 8455)

                            SELECT season, HomeTeam,
                                   COUNT(Win_Loss) OVER(PARTITION BY season) AS counts
                            FROM homes""", conn)
Home_Perf

这是错误

ERROR:root:An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line string', (1, 38))

---------------------------------------------------------------------------

OperationalError                          Traceback (most recent call last)

/usr/local/lib/python3.6/dist-packages/pandas/io/sql.py in execute(self, *args, **kwargs)
   1585         try:
-> 1586             cur.execute(*args, **kwargs)
   1587             return cur

OperationalError: near "(": syntax error


The above exception was the direct cause of the following exception:

DatabaseError                             Traceback (most recent call last)

3 frames

<ipython-input-17-9b1c924dbbdd> in <module>()
     15                             SELECT season, HomeTeam,
     16                                    COUNT(Win_Loss) OVER(PARTITION BY season) AS counts
---> 17                             FROM homes""", conn)
     18 Home_Perf

/usr/local/lib/python3.6/dist-packages/pandas/io/sql.py in read_sql(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)
    410             coerce_float=coerce_float,
    411             parse_dates=parse_dates,
--> 412             chunksize=chunksize,
    413         )
    414 

/usr/local/lib/python3.6/dist-packages/pandas/io/sql.py in read_query(self, sql, index_col, coerce_float, params, parse_dates, chunksize)
   1631 
   1632         args = _convert_params(sql, params)
-> 1633         cursor = self.execute(*args)
   1634         columns = [col_desc[0] for col_desc in cursor.description]
   1635 

/usr/local/lib/python3.6/dist-packages/pandas/io/sql.py in execute(self, *args, **kwargs)
   1596 
   1597             ex = DatabaseError(f"Execution failed on sql 'args[0]': exc")
-> 1598             raise ex from exc
   1599 
   1600     @staticmethod

DatabaseError: Execution failed on sql ' --- CTE to get the wins and loss as a home team
                            WITH Homes AS (
                            SELECT season, team_long_name AS HomeTeam,
                                   home_team_goal, away_team_goal,
                                   CASE 
                                       WHEN home_team_goal > away_team_goal THEN 'win'
                                       WHEN home_team_goal < away_team_goal THEN 'loss'
                                       ELSE 'Tie' END AS Win_Loss                                                
                            FROM match
                            ---Inner JOIN for getting the team name
                            INNER JOIN team 
                            ON team_api_id = home_team_api_id
                            WHERE home_team_api_id = 8455)

                            SELECT season, HomeTeam,
                                   COUNT(Win_Loss) OVER(PARTITION BY season) AS counts
                            FROM homes': near "(": syntax error

【问题讨论】:

能否提供输入和输出?请看:***.com/questions/20109391/…? 听起来 SQL 查询本身存在问题。如果您可以提供一些示例代码,则不是 100% 熟悉所有错误。 我已经添加了所有内容;请立即查看 相同的代码在 SQLite DB 浏览器中运行良好;我已经检查过了 尝试在不使用任何选项卡的情况下将所有数据移到左侧 【参考方案1】:

tl;dr Google Colab 使用 SQLite 3.22 版,但 SQLite 仅支持 Window Functions after 3.25 版。


我认为问题在于 Google Colab 使用了不支持窗口函数的过时版本的 SQLlite。谷歌必须更新这个!我写的是 2022 年 3 月 6 日。

你的意思,更具体地说:

2018 年 9 月 15 日,SQLite 发布了 3.25 版本,正如你在发布日志here 中看到的,他们在这个版本中做的第一件事是:

    添加对窗口函数的支持

这是我以前遇到过的问题,诀窍是更新您的 SQLite3 库,但是,您不是在本地设备上,而是在 Google Colab 上。

所以接下来您要做的是检查您拥有的 SQLlite 版本。您可以通过运行以下 SQL 代码行来做到这一点:SELECT sqlite_version(); 我从here 那里得到了那个好东西。

而且由于您是在 Pandas 中查询,因此您需要运行:

pd.read_sql_query("""
SELECT sqlite_version();
""", conn)

所以我今天(22 年 3 月 6 日)正好跑了,我在我的 Google Colab 中得到了以下信息:

而且这个版本太旧了。我不知道如何在 Google Colab 中更新 sqlite 库。所以这就是我所得到的,我认为我们目前还没有那个功能。 This post 可以帮助更新 Notebook 中的 sqlite。

【讨论】:

以上是关于窗口函数在 pd.read_sql 中不起作用;它显示错误的主要内容,如果未能解决你的问题,请参考以下文章

使用属性更改简单绑定到用户控件在 vs 扩展工具窗口中不起作用

外部点击在angularjs中不起作用

mailto 链接在 chrome 扩展弹出窗口中不起作用

preferredContentSize更改窗口大小在osx 10.12.6中不起作用

您可以并行或异步运行“pd.read_sql”吗?

窗口挂钩在 Windows 7 中不起作用,但在 Windows xp 中不起作用