Python - 数据科学之关系数据库

  • 简述

    我们可以连接到关系数据库以使用pandas库以及另一个用于实现数据库连接的附加库。这个包被命名为sqlalchemy它提供了在 python 中使用的完整 SQL 语言功能。
  • 安装 SQLAlchemy

    使用我们在数据科学环境一章中讨论过的 Anaconda 进行安装非常简单。假设您已按照本章所述安装 Anaconda,请在 Anaconda 提示窗口中运行以下命令来安装 SQLAlchemy 包。
    
    conda install sqlalchemy
    
  • 阅读关系表

    我们将使用 Sqlite3 作为我们的关系数据库,因为它重量轻且易于使用。虽然 SQLAlchemy 库可以连接到各种关系源,包括 MySql、Oracle 和 Postgresql 和 Mssql。我们首先创建一个数据库引擎,然后使用to_sqlSQLAlchemy 库的函数。
    在下面的示例中,我们使用to_sql通过读取 csv 文件已经创建的数据帧中的函数。然后我们使用read_sql_querypandas 的函数来执行和捕获各种 SQL 查询的结果。
    
    from sqlalchemy import create_engine
    import pandas as pd
    data = pd.read_csv('/path/input.csv')
    # Create the db engine
    engine = create_engine('sqlite:///:memory:')
    # Store the dataframe as a table
    data.to_sql('data_table', engine)
    # Query 1 on the relational table
    res1 = pd.read_sql_query('SELECT * FROM data_table', engine)
    print('Result 1')
    print(res1)
    print('')
    # Query 2 on the relational table
    res2 = pd.read_sql_query('SELECT dept,sum(salary) FROM data_table group by dept', engine)
    print('Result 2')
    print(res2)
    
    当我们执行上面的代码时,它会产生以下结果。
    
    Result 1
       index  id    name  salary  start_date        dept
    0      0   1    Rick  623.30  2012-01-01          IT
    1      1   2     Dan  515.20  2013-09-23  Operations
    2      2   3   Tusar  611.00  2014-11-15          IT
    3      3   4    Ryan  729.00  2014-05-11          HR
    4      4   5    Gary  843.25  2015-03-27     Finance
    5      5   6   Rasmi  578.00  2013-05-21          IT
    6      6   7  Pranab  632.80  2013-07-30  Operations
    7      7   8    Guru  722.50  2014-06-17     Finance
    Result 2
             dept  sum(salary)
    0     Finance      1565.75
    1          HR       729.00
    2          IT      1812.30
    3  Operations      1148.00
    
  • 将数据插入关系表

    我们还可以使用 pandas 中提供的 sql.execute 函数将数据插入到关系表中。在下面的代码中,我们将之前的 csv 文件作为输入数据集,将其存储在关系表中,然后使用 sql.execute 插入另一条记录。
    
    from sqlalchemy import create_engine
    from pandas.io import sql
    import pandas as pd
    data = pd.read_csv('C:/Users/Rasmi/Documents/pydatasci/input.csv')
    engine = create_engine('sqlite:///:memory:')
    # Store the Data in a relational table
    data.to_sql('data_table', engine)
    # Insert another row
    sql.execute('INSERT INTO data_table VALUES(?,?,?,?,?,?)', engine, params=[('id',9,'Ruby',711.20,'2015-03-27','IT')])
    # Read from the relational table
    res = pd.read_sql_query('SELECT ID,Dept,Name,Salary,start_date FROM data_table', engine)
    print(res)
    
    当我们执行上面的代码时,它会产生以下结果。
    
       id        dept    name  salary  start_date
    0   1          IT    Rick  623.30  2012-01-01
    1   2  Operations     Dan  515.20  2013-09-23
    2   3          IT   Tusar  611.00  2014-11-15
    3   4          HR    Ryan  729.00  2014-05-11
    4   5     Finance    Gary  843.25  2015-03-27
    5   6          IT   Rasmi  578.00  2013-05-21
    6   7  Operations  Pranab  632.80  2013-07-30
    7   8     Finance    Guru  722.50  2014-06-17
    8   9          IT    Ruby  711.20  2015-03-27
    
  • 从关系表中删除数据

    我们还可以使用 pandas 中提供的 sql.execute 函数将数据删除到关系表中。下面的代码根据给定的输入条件删除一行。
    
    from sqlalchemy import create_engine
    from pandas.io import sql
    import pandas as pd
    data = pd.read_csv('C:/Users/Rasmi/Documents/pydatasci/input.csv')
    engine = create_engine('sqlite:///:memory:')
    data.to_sql('data_table', engine)
    sql.execute('Delete from data_table where name = (?) ', engine,  params=[('Gary')])
    res = pd.read_sql_query('SELECT ID,Dept,Name,Salary,start_date FROM data_table', engine)
    print(res)
    
    当我们执行上面的代码时,它会产生以下结果。
    
       id        dept    name  salary  start_date
    0   1          IT    Rick   623.3  2012-01-01
    1   2  Operations     Dan   515.2  2013-09-23
    2   3          IT   Tusar   611.0  2014-11-15
    3   4          HR    Ryan   729.0  2014-05-11
    4   6          IT   Rasmi   578.0  2013-05-21
    5   7  Operations  Pranab   632.8  2013-07-30
    6   8     Finance    Guru   722.5  2014-06-17