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

2020-11-04  本文已影响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)
上一篇下一篇

猜你喜欢

热点阅读