SQLite3 数学函数 Python

Posted

技术标签:

【中文标题】SQLite3 数学函数 Python【英文标题】:SQLite3 math functions Python 【发布时间】:2022-01-23 19:16:15 【问题描述】:

更新 SQLite 版本 3.5.0 后。可以使用 SQL 数学函数。 如果我在 pycharm 查询中使用它,它工作得很好,但我无法在 python 代码中执行查询。

然后我收到以下错误消息:

pandas.io.sql.DatabaseError: sql 'Select log(increase.s1) From increase'执行失败:没有这样的功能:log。

我使用以下代码执行它:

import pandas as pd

conn = sqlite3.connect('p1_database.db')

sql = "Select log(increase.s1) from increase"
pd.read_sql_query(sql, con=conn)

我的错误是什么?没看到。

【问题讨论】:

来自sqlite.org/lang_mathfunc.html:“下面显示的数学函数是 SQLite 合并源文件的一部分,但只有在使用 -DSQLITE_ENABLE_MATH_FUNCTIONS 编译时选项编译合并时才有效。” 在哪里/如何设置选项? 数学函数是编译时间,所以需要内置二进制文件或者可以从源代码编译。 我可以确认 Windows 上 Python 3.7 的 sqlite3 模块不支持 log 【参考方案1】:

如果 sqlite3 模块中没有启用数学函数,那么您可以将日志函数应用于列并返回一个系列。

import sqlite3
import pandas as pd
import math

with sqlite3.connect(":memory:") as conn:
    cur = conn.cursor()
    
    cur.execute("CREATE TABLE increase(s1 integer)")
    cur.execute("INSERT INTO increase (s1) values (1)")
    cur.execute("INSERT INTO increase (s1) values (2)")
    cur.execute("INSERT INTO increase (s1) values (100)")

    df = pd.read_sql_query('SELECT s1 FROM increase', conn)
    logseries = df['s1'].map(lambda x: math.log(x))
    log10series = df['s1'].map(lambda x: math.log10(x))
    for r in zip(df['s1'], logseries, log10series):
        print(f"r[0]:3d r[1]:.3f r[2]:.3f")

输出:

  1 0.000 0.000
  2 0.693 0.301
100 4.605 2.000

【讨论】:

【参考方案2】:

标准 Python 库中的 sqlite3 模块不支持数学函数。但它允许轻松创建新功能:

...
import math

conn = sqlite3.connect('p1_database.db')
conn.create_function('log', 1, math.log10)

sql = "Select log(increase.s1) from increase"
pd.read_sql_query(sql, con=conn)

应该做的工作(我使用math.log10,因为来自Sqlite3的日志函数实际上是一个log10)。

【讨论】:

以上是关于SQLite3 数学函数 Python的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习(四十四)NumPy 数学函数

Python函数:内置函数(数学运算函数类型转换函数)

python之数学函数篇

python之数学函数篇

Python 基础学习之: Python math 模块cmath 模块 区别是 cmath 模块运算的是复数,math 模块运算的是数学运算 Python数学函数列表及解释 Python

python中有数学nCr函数吗? [复制]