美文网首页
[Python数据挖掘入门与实践]-第二章用scikit-lea

[Python数据挖掘入门与实践]-第二章用scikit-lea

作者: 六千宛 | 来源:发表于2020-11-04 15:35 被阅读0次

    近邻算法分类-找离得近的

    image.png
    缺点1:复杂
    缺点2:对特征取离散值表现差
    

    常用的三种距离

    image.png
    欧氏距离:适用于分类特征距离有明显区别
    曼哈顿距离:如果欧氏距离都相等,那么可以考虑曼哈顿,这种距离更稳定
    余弦距离:适用于特征值多的情况 
    
    python:os.path.expanduser('~')#返回本地账户根目录
    
    image.png
    拓展:# [获取当前目录路径和文件](https://www.cnblogs.com/Jomini/p/8636129.html)
    1-获取路径
    import  os
    print os.getcwd() #获取当前工作目录路径
    print os.path.abspath('.') #获取当前工作目录路径
    print os.path.abspath('test.txt') #获取当前目录文件下的工作目录路径
    print os.path.abspath('..') #获取当前工作的父目录 !注意是父目录路径
    print os.path.abspath(os.curdir) #获取当前工作目录路径
    2-改变当前目录
             1) 使用: os.chdir(path)。
             比如, 如果当前目录在 ‘E:’ 下面, 然后进入E 下面的files 文件 可以使用 os.chdir(E:\files).
             之后,使用比如 test1 = open('file1.txt'),  打开的文件会是在这个 ‘E:\files’ 目录下的文件,而不是 'E' 下的文件。
    3-组合路径返回
             os.path.join('file1','file2','file3')
             合并得到路径 file1/file2/file3
    ................
    
    #enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
    >>>i = 0
    >>> seq = ['one', 'two', 'three']
    >>> for element in seq:
    ...     print i, seq[i]
    ...     i +=1
    ... 
    0 one
    1 two
    2 three
    *****************************************************
    >>>seq = ['one', 'two', 'three']
    >>> for i, element in enumerate(seq):
    ...     print i, element
    ... 
    0 one
    1 two
    2 three
    
    整理文件读取的方式
    1-读取文本文件
    (1)按路径直接读取,一次性读取文本中全部的内容,以字符串的形式返回结果
    >>> f = open('/tmp/test.txt')
    >>> f.read()
    'hello python!\nhello world!\n'
    >>> f.close()
    (2)with open读取
    with open("test.txt", "r") as f:  # 打开文件
        data = f.read()  # 读取文件
        print(data)
    (3)只读取文本第一行的内容,以字符串的形式返回结果
    with open("test.txt", "r") as f:
        data = f.readline()
        print(data)
    (4)读取文本所有内容,并且以列表的格式返回结果,一般配合for in使用
    with open("test.txt", "r") as f:
        data = f.readlines()
        print(data)
    #readlines会读到换行符,可用如下方法去除:
    with open("test.txt", "r") as f:
        for line in f.readlines():
            line = line.strip('\n')  
    #去掉列表中每一个元素的换行符
            print(line)
    2-写入文本文件
    (1)with open
    with open("test.txt","w") as f:
        f.write("这是个测试!")  
    # 自带文件关闭功能,不需要再写f.close()
    3-读取csv文件
    (2)路径+with open,以list形式读取
    # 导包
    import csv
    # 定义文件路径
    csv_path = 'source_file/reg_info.csv'
    # 通过with语句读取,以列表类型读取
    with open(csv_path,'r',encoding='utf8')as fp:
    # 使用列表推导式,将读取到的数据装进列表
        data_list = [i for i in csv.reader(fp)]  
    # csv.reader 读取到的数据是list类型
        print(data_list)
    (2)以字典类型读取
    # 在python3.6版本后,读取到csv文件内容每一行的类型是OrderedDict;可以通过字典的形式取值;
    # 在读取过程中会将csv文件内容映射到OrderedDict中,其中OrderedDict中的键可以由fieldnames 定义;
    # 如果fieldnames 为None,则OrderedDict的键为csv文件首行内容
    with open(csv_path,'r',encoding='utf8')as fp:
    # 使用列表推导式,将读取到的数据装进列表
        data_list = [i for i in csv.DictReader(fp,fieldnames=None)] 
    # csv.DictReader 读取到的数据是list类型
        print(data_list)
    (3)pandas读取
    import pandas as pd                         #导入pandas包
    data = pd.read_csv("train.csv")             #读取csv文件
    print(data)  
    4-写入csv文件
    (1)单行数据写入
    # 单行数据写入文件
    data_list = ['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功']
    with open(csv_path,'a',encoding='utf8')as fp:
        write = csv.writer(fp)
        write.writerow(data_list) # writerow 所接收的是一个列表
    (2)多行数据写入
    # 多行数据写入
    data_list = [
    ['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
    ['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
    ['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
    ['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
    ['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
    ]
    with open(csv_path,'a',encoding='utf8')as fp:
        write = csv.writer(fp)
        write.writerows(data_list) # writerow 所接收的是一个列表
    (3)写入带列名
    import csv
    csvFile = open("csvData.csv", "w")            #创建csv文件
    writer = csv.writer(csvFile)                  #创建写的对象
    #先写入columns_name                             
    writer.writerow(["index","a_name","b_name"])     #写入列的名称
    #写入多行用writerows                                #写入多行
    writer.writerows([[1,a,b],[2,c,d],[3,d,e]])
    csvFile.close()
    5-读取xls/xlsx文件
    (1)利用openpyxl
    #导入
    from openpyxl import workbook
    from openpyxl import load_workbook
    #打开一个工作表
    wb = load_workbook('filenamename.xlsx')
    #获取sheet
    sheet = wb.get_sheet_by_name('sheet1')
    #获取某个值
    print(sheet['A1'].value)
    #获取表最大行数
    print(sheet.max_row)
    #获取表最大列数
    print(sheet.max_column)
    #打印某列值
    for i in sheet['C']:
      print(i.value,'')
    print('')
    #打印某行值
    for i in sheet['1']:
      print(i.value,'')
    print('')
    (2)自定义函数
    读取excel表格数据需要用到xlrd或者openpyxl模块,所以先安装xlrd/openpyxl:直接pip install xird/openpyxl
    xlrd和openpyxl区别:
        (2.1).xlrd能处理的最大行数为65535,超过这个行数的文件就需要用到openpyxl,openpyxl最大支持1048576行
        (2.2).openpyxl不支持xls格式文件
    xlrd模块常用方法介绍:
        打开excl文件:s = xlrd.open_workbook(“文件路径”)
        获取表格:s.sheets()[0] = s.sheet_by_index(0)  获取第一张表格;  注意:下标值是从0开始
                         s.sheet():获取所以表单的索引
                          sheet = s.sheet_by_name("表名") 获取指定表名的表 
        获取表格的总行数:sheet.nrows
        获取表格的总列数:sheet.ncols
        获取指定行的数据:sheet.row_values(下标值),sheet.row_values(0,1,3)表示从去第2,3,4行的值
        获取指定行的数据:sheet.col_values(下标值)
        获取指定单元格数据:sheet.cell(a,b).value  a表示行的下标值,b表示列的下标值;两者可以调换位置;注意:不加.value取出的值前面会带个text的东西
        1.导入xlrd模块
        2.通过open.workbook()方法打开文件
        3.通过sheets()[]方法获取想要的表格
        4.获取总行数和总列数
        5.取第一行的值作为字典的key
        6.通过2个循环来根据行取对应列的值
    代码如下:
    import xlrd
    data = []
    def read_xsls(xlsx_path):
        data_xsls = xlrd.open_workbook(xlsx_path) #打开此地址下的exl文档
        sheet_name = data_xsls.sheets()[0]  #进入第一张表
        print(sheet_name)
        sheet_name1 = data_xsls.sheet_by_index(0)
        print(sheet_name1)
        count_nrows = sheet_name.nrows  #获取总行数
    #    print(count_nrows)
        count_nocls = sheet_name.ncols  #获得总列数
        line_value = sheet_name.row_values(0)
        for i in range(1,count_nrows):
            data_1 = {}
            for j in range(2,count_nocls):
                data_1[line_value[j]]=sheet_name.cell(i,j)  #根据行数来取对应列的值,并添加到字典中
     #           print(data_1)
            data.append(data_1)
    #        print(data)
    (3)自定义函数
    '''
    读取XLS,XLSX文件
    '''
    import xlrd
    def readExcelFile(filename):
        # 打开工作表
        workbook = xlrd.open_workbook(filename=filename)
        # 用索引取第一个工作薄
        booksheet = workbook.sheet_by_index(0)
        # 返回的结果集
        for i in range(booksheet.nrows):
            print(booksheet.row_values(i))
    第6行,xlrd.open_workbook打开一个已经存在的excel文件,文件不存在会造成打开失败。
    第8行,通过索引获取工作薄对象,workbook.sheet_by_index;也可以通过名称获取工作薄,workbook.sheet_by_name
    第10行,booksheet.nrows获取工作薄的总行数,同样的,booksheet.ncols获取工作薄的总列数
    第11行,booksheet.row_values(i)获取一整行的内容
    (4)自定义函数
    import xlrd
    from xlrd import xldate_as_tuple
    import datetime
    #导入需要读取的第一个Excel表格的路径
    data1 = xlrd.open_workbook(r'C:\Users\NHT\Desktop\Data\\test.xlsx')
    table = data1.sheets()[0]
    #创建一个空列表,存储Excel的数据
    tables = []
    #将excel表格内容导入到tables列表中
    def import_excel(excel):
      for rown in range(excel.nrows):
       array = {'road_name':'','bus_plate':'','timeline':'','road_type':'','site':''}
       array['road_name'] = table.cell_value(rown,0)
       array['bus_plate'] = table.cell_value(rown,1)
       if table.cell(rown,2).ctype == 3:
         date = xldate_as_tuple(table.cell(rown,2).value,0)
         array['timeline'] = datetime.datetime(*date)
       array['road_type'] = table.cell_value(rown,3)
       array['site'] = table.cell_value(rown,4)
       tables.append(array)
    if __name__ == '__main__':
      #将excel表格的内容导入到列表中
      import_excel(table)
      for i in tables:
        print(i)
    5-写入xls/xlsx文件
    (1)自定义函数
    import xlwt
    '''
    写XLS,XLSX文件
    @filename 文件名
    @header   列头
    @content  内容
    '''
    def writeExcelFile(filename, header, content):
        # 因为输入都是Unicode字符,这里使用utf-8,免得来回转换
        workbook = xlwt.Workbook(encoding='utf-8')
        booksheet = workbook.add_sheet('Sheet 1', cell_overwrite_ok=True)
        # 写列头
        row = 0
        for col in range(len(header)):
            booksheet.write(row, col, header[col])
        # 写内容
        for lines in content:
            row += 1
            for col in range(len(lines)):
                booksheet.write(row, col, lines[col])
        # 保存文件
        workbook.save(filename)
    写excel文件的大致过程是
        1. xlwt.Workbook 先建一个workbook对象
        2. 添加工作薄 workbook.add_sheet
        3. 写单元格 booksheet.write(row, col, text)
        4. 保存文件 workbook.save
    #excel操作大全:https://blog.csdn.net/qq_34617032/article/details/80433939
    (2)利用pyExcelerator
    #coding=utf-8
    #######################################################
    #filename:test_pyExcelerator.py
    #author:defias
    #date:xxxx-xx-xx
    #function:新建excel文件并写入数据
    #######################################################
    import pyExcelerator
    #创建workbook和sheet对象
    wb = pyExcelerator.Workbook()
    ws = wb.add_sheet(u '第一页' )
    #设置样式
    myfont = pyExcelerator.Font()
    myfont.name = u 'Times New Roman'
    myfont.bold = True
    mystyle = pyExcelerator.XFStyle()
    mystyle.font = myfont
    #写入数据,使用样式
    ws.write( 0 , 0 ,u 'ni hao 帕索!' ,mystyle)
    #保存该excel文件,有同名文件时直接覆盖
    wb.save( 'E:\\Code\\Python\\mini.xls' )
    print( '创建excel文件完成!')
    
    1-操作xls文件
    # coding=UTF-8
    import xlrd
    import xlwt
    from xlutils.copy import copy
    def write_excel_xls(path, sheet_name, value):
        index = len(value)  # 获取需要写入数据的行数
        workbook = xlwt.Workbook()  # 新建一个工作簿
        sheet = workbook.add_sheet(sheet_name)  # 在工作簿中新建一个表格
        for i in range(0, index):
            for j in range(0, len(value[i])):
                sheet.write(i, j, value[i][j])  # 像表格中写入数据(对应的行和列)
        workbook.save(path)  # 保存工作簿
        print("xls格式表格写入数据成功!")
    def write_excel_xls_append(path, value):
        index = len(value)  # 获取需要写入数据的行数
        workbook = xlrd.open_workbook(path)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数
        new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
        new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
        for i in range(0, index):
            for j in range(0, len(value[i])):
                new_worksheet.write(i+rows_old, j, value[i][j])  # 追加写入数据,注意是从i+rows_old行开始写入
        new_workbook.save(path)  # 保存工作簿
        print("xls格式表格【追加】写入数据成功!")
    def read_excel_xls(path):
        workbook = xlrd.open_workbook(path)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        for i in range(0, worksheet.nrows):
            for j in range(0, worksheet.ncols):
                print(worksheet.cell_value(i, j), "\t", end="")  # 逐行逐列读取数据
            print()
    book_name_xls = 'xls格式测试工作簿.xls'
    sheet_name_xls = 'xls格式测试表'
    value_title = [["姓名", "性别", "年龄", "城市", "职业"],]
    value1 = [["张三", "男", "19", "杭州", "研发工程师"],
              ["李四", "男", "22", "北京", "医生"],
              ["王五", "女", "33", "珠海", "出租车司机"],]
    value2 = [["Tom", "男", "21", "西安", "测试工程师"],
              ["Jones", "女", "34", "上海", "产品经理"],
              ["Cat", "女", "56", "上海", "教师"],]
    write_excel_xls(book_name_xls, sheet_name_xls, value_title)
    write_excel_xls_append(book_name_xls, value1)
    write_excel_xls_append(book_name_xls, value2)
    read_excel_xls(book_name_xls)
    2-操作xlsx文件
    # coding=UTF-8
    import openpyxl
    def write_excel_xlsx(path, sheet_name, value):
        index = len(value)
        workbook = openpyxl.Workbook()
        sheet = workbook.active
        sheet.title = sheet_name
        for i in range(0, index):
            for j in range(0, len(value[i])):
                sheet.cell(row=i+1, column=j+1, value=str(value[i][j]))
        workbook.save(path)
        print("xlsx格式表格写入数据成功!")
    def read_excel_xlsx(path, sheet_name):
        workbook = openpyxl.load_workbook(path)
        # sheet = wb.get_sheet_by_name(sheet_name)这种方式已经弃用,不建议使用
        sheet = workbook[sheet_name]
        for row in sheet.rows:
            for cell in row:
                print(cell.value, "\t", end="")
            print()
    book_name_xlsx = 'xlsx格式测试工作簿.xlsx'
    sheet_name_xlsx = 'xlsx格式测试表'
    value3 = [["姓名", "性别", "年龄", "城市", "职业"],
              ["111", "女", "66", "石家庄", "运维工程师"],
              ["222", "男", "55", "南京", "饭店老板"],
              ["333", "女", "27", "苏州", "保安"],]
    write_excel_xlsx(book_name_xlsx, sheet_name_xlsx, value3)
    read_excel_xlsx(book_name_xlsx, sheet_name_xlsx)
    

    相关文章

      网友评论

          本文标题:[Python数据挖掘入门与实践]-第二章用scikit-lea

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