美文网首页人工智能技术圈
《利用Python进行数据分析》-读取数据及数据库连接

《利用Python进行数据分析》-读取数据及数据库连接

作者: 皮皮大 | 来源:发表于2019-07-30 15:38 被阅读30次
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    

    读取文件

    • 将表格型数据读取为DF对象的函数
    • read_csv:默认分隔符是逗号
    • read_table:默认分隔符是制表符('\t')
    • read_excel:读取Excel文件
    • read_sql:读取SQL数据文件


      image.png
    # 查看文件内容window用type
    # linuxz中cat命令 
    !type example1.csv  
    
    image.png
    # 默认将第一行作为列属性columns
    # 索引(行属性index)默认是从0开始
    df = pd.read_csv("example1.csv")
    df
    
    image.png

    重点:自己创建列属性

    # 通过header默认列名
    # 使用names自定义列名
    print(pd.read_csv("example2.csv", header=None))
    pd.read_csv("example2.csv", names=["a", "b", "c" ,"d"])
    
    image.png
    # index_col参数指定为索引值
    names=["a", "b", "c" ,"d", "message"]  # 指定行属性
    pd.read_csv("example2.csv", names=names, index_col="message")  # 指定message为索引
    # index_col中传入多个值,列表形式:parsed = pd.read_csv('examples/csv_mindex.csv',index_col=['key1', 'key2'])
    
    image.png
    • 非固定分隔符去分隔字段的表格处理:

    • 空白符或者其他模式来分隔字段,通过seq指定分隔字段

    • 列名比数据行少,read_table将第一列作为DF的索引


      image.png
    • pd.read_csv("example2.csv",skiprows=[0, 2, 4])

    • 打开文件时:跳过索引为0,2,4的行数据


    缺失值处理

    • 数据不存在或者为空字符串
    • 数据使用某个标记值表示
    • pandas通过标记值识别,NA或NULL
    # 指定分隔符:sep
    result = pd.read_csv("example1.csv", sep=",") 
    result
    
    image.png
    # 判断元素是否为NaN
    pd.isnull(result)
    

    按块读取文件

    • 读取文件小部分
    • 逐块读取文件进行迭代
    # pandas显示更紧些
    pd.options.display.max_rows = 15
    result = pd.read_csv(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv", encoding="gb18030")
    result.head()
    
    result = pd.read_csv(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv", 
                         nrows=6, encoding="gb18030")  # 指定读取6行数据
    result
    
    # chunksize 按照块读取数据
    # get_chunk  读取任意块的大小
    chunker = pd.read_csv(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv", encoding="gb18030", chunksize=1000)
    tot = pd.Series([])
    for piece in chunker:
        tot = tot.add(piece['得分'].value_counts(), fill_value=0)
        
    tot = tot.sort_values(ascending=False)
    
    image.png
    # to_csv :将数据写入到以逗号分隔的文件中
    # 通过type进行显示
    result.to_csv(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv", encoding="gb18030")
    !type D:\Python\datalearning\PandasLearning\NBA_Data.csv
    
    # 使用其他分隔符,比如|
    # 缺失值在输出结果中会被表示为空字符串
    import sys
    result.to_csv(sys.stdout, sep="|", na_rep="NULL")
    
    # 默认会写出行和列标签,也可以被禁用 
    
    # 全部的行和列标签都不显示
    result.to_csv(sys.stdout, index=False, columns=False)  
    # 指定显示部分的列
    # result.to_csv(sys.stdout, index=False, columns=["总得分", "失误数"])
    
    # Series的to_csv方法
    dates = pd.date_range("1/1/2019", periods=8)
    ts = pd.Series(np.arange(8), inde
    

    处理分隔字符

    • 存储在磁盘上的表格型数据都能用pd.read_table进行加载
    • 对于任何单字符分隔符文件,直接用Python内置的csv模块
    • 将文件对象传给csv.reader()
    import csv
    f = open(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv")
    # 处理单字符分隔符文件:文件传给模块
    reader = csv.reader(f)
    # 迭代为每行产生一个列表数据
    for line in reader: 
        print(line)
    
    # 通过with方式打开文件,读取到多行的列表中
    with open(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv") as f:
        lines = list(csv.reader(f))
    
    # 标题header取自line[0];其余取自line[1:]剩下全部
    header, values = line[0], line[1:]
    
    # dict{}字典构造式,zip(*values)反解压
    data_dict = {h:v for h, v in zip(header,zip(*values))}
    data_dict
    
    image.png

    json数据

    • import json
    • loads():将json格式转换成Python字典形式
    • dumps():将Python对象转成json格式
    # json格式数据
    obj = """
    {"name": "Wes",
    "places_lived": ["United States", "Spain", "Germany"],
    "pet": null,
    "siblings": [{"name": "Scott", "age": 30, "pets": ["Zeus", "Zuko"]},
    {"name": "Katie", "age": 38,
    "pets": ["Sixes", "Stache", "Cisco"]}]
    }
    """
    obj
    
    image.png

    如何将json格式数据转成DF数据

    • 先将json转成Python对象格式
    • DF构造器中传入一个字典的列表
    • result['siblings']:取出siblings键中的值
    • columns=['name', 'age', "pets"] :定义列属性
    image.png
    # 读取json数据
    data = pd.read_json(r'D:\\Python\\datalearning\\example.json')
    data
    
    # 将pandas数据导出到json格式
    print(data.to_json())
    
    # 结果
    {"a":{"0":1,"1":4,"2":7},"b":{"0":2,"1":5,"2":8},"c":{"0":3,"1":6,"2":9}}
    
    # 转换成json格式
    print(data.to_json(orient='records'))
    
    # 结果
    [{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6},{"a":7,"b":8,"c":9}]
    

    二进制数据格式

    • 使用Python内置的模块pickle序列化
    • to_pickle将数据以pickle格式保存到磁盘上
    • pandas内置⽀持两个⼆进制数据格式:HDF5和MessagePack。

    HDF5格式

    • 用PyTable\h5py\pandas可以读取
    • HDF5是⼀种存储⼤规模科学数组数据
    • HDF5中的HDF指的是层次型数据格式(hierarchical data format)
    • 每个HDF5⽂件都含有⼀个⽂件系统式的节点结构
    • 及时压缩、高效存储重复模式数据
    • 分块读写数据;不是数据库
    image.png

    读取Microsoft Excel文件

    读取Excel文件有两种方式:

    • pandas的ExcelFile类
    • pd.read_excel函数
    • 扩展包xlrd--->XLS;openyxl--->XLSX
    image.png

    获取web api

    • 通过requests库直接获取api
    • 发送HTTP请求,获取requests库
    import requests
    url = 'https://api.github.com/repos/pandas-dev/pandas/issues'
    resp = requests.get(url)
    data = resp.json()
    # print(data)
    data[0]["title"]
    
    issues = pd.DataFrame(data, columns=['number', 'title',
                                         'labels', 'state'])
    issues        
    
    image.png

    数据库交互

    • 商业场景下数据一般不会放在Excel中
    • 放在基于SQL的数据库中:MySQL、SQL server、PostgreSQL
    • PYTHON内置的sqlite3驱动器
    # connect--->execute--->commit()
    import sqlite3
    query = """
    create table test
    (a varchar(20), b varchar(20),
    c real, d integer);
    """
    con = sqlite3.connect("mydata.sqlite")
    con.execute(query)
    
    # 执行excute之后必须commit()才会生效
    con.commit()
    
    # 插入数据
    data = [('Atlanta', 'Georgia', 1.25, 6),
            ('Tallahassee', 'Florida', 2.6, 3),
            ('Sacramento', 'California', 1.7, 5)]
    
    stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"
    con.executemany(stmt, data)
    con.commit()
    
    cursor = con.execute("select * from test")
    rows = cursor.fetchall()
    rows
    
    image.png

    将数据库中的数据传递给DF中

    • 生成上面的元组列表文件
    • 列名:光标cursor的description属性中
    • 属性是元组形式,取出属性的第一个值
    • 传给DF的属性columns
    # 元组形式
    cursor.description
    # 结果
    (('a', None, None, None, None, None, None),
     ('b', None, None, None, None, None, None),
     ('c', None, None, None, None, None, None),
     ('d', None, None, None, None, None, None))
    
    pd.DataFrame(rows, columns=[x[0] for x in cursor.description])
    
    image.png

    关于SQLAlchemy

    • 流行的Python SQL工具
    • pandas的read_sql函数允许从SQLAlchemy连接读取数据
    • 导入:import sqlalchemy as sqla
    import sqlalchemy as sqla
    # 默认是:///
    db = sqla.create_engine('sqlite:///mydata.sqlite')
    pd.read_sql("select * from test", db)
    
    image.png

    相关文章

      网友评论

        本文标题:《利用Python进行数据分析》-读取数据及数据库连接

        本文链接:https://www.haomeiwen.com/subject/pfsnrctx.html