实验报告

第一次写博客

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder

data = pd.read_excel('C:\\Users\\456\\Desktop\\train_test.xlsx')

data = data.dropna(how='any')
data = data.iloc[:, [1, 2, 5]]
data.loc[(data.age_range==7)|(data.age_range==8),'age_range']=7

ohe = OneHotEncoder(n_values=[8,3])
data1 = ohe.fit_transform(data.iloc[:, :-1]).toarray()

def convert_log(row):
    log = row[-1]
    items = log.split('#')
    click, card, purchase, favour = 0, 0, 0, 0  # click点击数,card加入购物车数,purchase购买数,favar收藏夹数
    for t in items:
        click += 1
        ts = t.split(':')[4]
        if ts == '1':
            card += 1
        if ts == '2':
            purchase += 1
        if ts == '3':
            favour += 1
    return [float(click), float(round(purchase / click, 3)), float(card), float(favour)]

data2 = np.apply_along_axis(convert_log, 1, data)

data = np.hstack([data1, data2])
print(data[0])
 
 
pandas从表中读取数据,是Excel数据的复制版本,增删改数据都不会影响的Excel里面的数据,需要操作生效则需要在最后操作完成后将数据保存回Excel。
import pandas as pd
df = pd.read_excel('文件路径名.xlsx') #文件读取,文件路径名最好用全路径,D:\****\**.xlsx,下同
writer =  pd.ExcelWriter('文件路径名.xlsx')
#文件保存,注意文件路径名,如果文件不存在则会创建,文件存在则会覆盖
DataFrame.to_excel(writer)
#有时候df.to_excel(filepath)就可以了不会报错,有时候会报错。
writer.save
 
 
 
 
  
 
实验源码 徐开益(上)老师(下)


import numpy as np
import xlrd
#from sklearn import preprocessing #进行标准化数据时,需要引入这个包
from sklearn.model_selection import train_test_split

def open_excel(file):
    try:
        data = xlrd.open_workbook(file)
        return data
    except Exception as e:
        print(str(e))

def split_age_range(age):
    """
    将特征值年龄进行离散化为8个特征值
    :param age: 年龄区间值
    :return: 离散化后的特征
    """
    if age == 0:
        return [1,0,0,0,0,0,0,0,0]
    elif age == 1:
        return [0,1,0,0,0,0,0,0,0]
    elif age == 2:
        return [0,0,1,0,0,0,0,0,0]
    elif age == 3:
        return [0,0,0,1,0,0,0,0,0]
    elif age == 4:
        return [0,0,0,0,1,0,0,0,0]
    elif age == 5:
        return [0,0,0,0,0,1,0,0,0]
    elif age == 6:
        return [0,0,0,0,0,0,1,0,0]
    elif age == 7 or age == 8:
        return [0,0,0,0,0,0,0,1,0]
    # elif age == 8:
    #     return [0,0,0,0,0,0,0,0,1]

def split_gender(gender):
    """
    将特征值性别进行离散化
    :param gender:
    :return: 返回离散化的特征
    """
    if gender == 0:
        return [1,0,0]
    elif gender == 1:
        return [0,1,0]
    elif gender == 2:
        return [0,0,1]

def split_log(Log):
    """
    分割数据文件中的Log数据
    :param Log: Log数据
    :return: 处理后的特征值
    """
    items = Log.strip().split('#')
    purchase = 0;total = 0
    click = 0;add_to_card = 0;add_to_favourite = 0
    for i in range(len(items)):
        total += 1
        item = items[i].strip().split(':')
        if item[4] == '2':
            purchase += 1
        if item[4] == '1':
            add_to_card += 1
        if item[4] == '3':
            add_to_favourite += 1
    return [float(total),float(round(purchase/total,3)),float(add_to_card),float(add_to_favourite)]

def loadDataSet(path, training_sample,colnameindex=0,by_name=u'Sheet1'):
    """
    加载数据
    :param path: 数据文件存放路径
    :param training_sample: 数据文件名
    :param colnameindex: 文件列名下标
    :param by_name: 表名
    :return: 数据集和类别标签
    """
    dataMat = [];
    labelMat = []  # 定义列表
    filename = path + training_sample
    data = open_excel(filename)
    table = data.sheet_by_name(by_name)  # 获得表格
    nrows = table.nrows  # 拿到总共行数
    colnames = table.row_values(colnameindex)  # 某一行数据 ['user_id', 'age_range', 'gender', 'merchant_id','label']
    for rownum in range(1, nrows):  # 也就是从Excel第二行开始,第一行表头不算
        row = table.row_values(rownum)
        if row[1] == '' or row[2] == '' or row[5] == '':
            continue
        if row:
            app = []
            app = split_age_range(row[1])+split_gender(row[2]) + split_log(row[5]) #将Log转化为特征值
            dataMat.append(app)
            labelMat.append(float(row[4])) #获取类别标签
    return dataMat, labelMat

def main():
    """
    主函数
    :return: null
    """
    path = "C:\\Users\\456\\Desktop\\"
    training_sample = 'train_test.xlsx' #训练数据文件
    trainingSet, trainingLabels = loadDataSet(path, training_sample)  # 取训练数据
    print(trainingSet)
    print(trainingLabels)

if __name__ == '__main__':
    """
    程序入口
    """
    main()
♦python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。
data = xlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个r拜师原生字符。
table = data.sheets()[0]          #通过索引顺序获取

table = data.sheet_by_index(sheet_indx)) #通过索引顺序获取

table = data.sheet_by_name(sheet_name)#通过名称获取

以上三个函数都会返回一个xlrd.sheet.Sheet()对象

names = data.sheet_names()    #返回book中所有工作表的名字

data.sheet_loaded(sheet_name or indx)   # 检查某个sheet是否导入完毕
际上strip是删除的意思;而split则是分割的意思。因此也表示了这两个功能是完全不一样的,strip可以删除字符串的某些字符,而split则是根据规定的字符将字符串进行分割。
2)按某一个字符分割,且分割n次。如按‘.'分割1次
1
2
3	>>> str_split = str.split('.',1) 
>>> print str_split 
['www', 'google.com'] 
python 使用分号的时候
>>> num1 = 1; num2 =2;
>>> print(num1+num2);
3
>>> 
  就是在一行 写多条代码句时,加上 分号;
round() 方法返回浮点数x的四舍五入值。
1、导入模块
      import xlrd
   2、打开Excel文件读取数据
       data = xlrd.open_workbook('excelFile.xls')
   3、使用技巧
        获取一个工作表
 
        table = data.sheets()[0]          #通过索引顺序获取
 
        table = data.sheet_by_index(0) #通过索引顺序获取
 
        table = data.sheet_by_name(u'Sheet1')#通过名称获取
 
        获取整行和整列的值(数组)
   
         table.row_values(i)
 
         table.col_values(i)
 
        获取行数和列数
  
        nrows = table.nrows
 
        ncols = table.ncols
       
        循环行列表数据
        for i in range(nrows ):
      print table.row_values(i)
 
单元格
cell_A1 = table.cell(0,0).value
 
cell_C4 = table.cell(2,3).value
 
使用行列索引
cell_A1 = table.row(0)[0].value
 
cell_A2 = table.col(1)[0].value
 
简单的写入
row = 0
 
col = 0
 
# 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
ctype = 1 value = '单元格的值'
 
xf = 0 # 扩展的格式化
 
table.put_cell(row, col, ctype, value, xf)
 
table.cell(0,0)  #单元格的值'
 
table.cell(0,0).value #单元格的值'
numpy提供了numpy.concatenate((a1,a2,...), axis=0)函数。能够一次完成多个数组的拼接。其中a1,a2,...是数组类型的参数
示例3:
>>> a=np.array([1,2,3])
>>> b=np.array([11,22,33])
>>> c=np.array([44,55,66])
>>> np.concatenate((a,b,c),axis=0)  # 默认情况下,axis=0可以不写
array([ 1,  2,  3, 11, 22, 33, 44, 55, 66]) #对于一维数组拼接,axis的值不影响最后的结果
 
>>> a=np.array([[1,2,3],[4,5,6]])
>>> b=np.array([[11,21,31],[7,8,9]])
>>> np.concatenate((a,b),axis=0)
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [11, 21, 31],
       [ 7,  8,  9]])
>>> np.concatenate((a,b),axis=1)  #axis=1表示对应行的数组进行拼接
array([[ 1,  2,  3, 11, 21, 31],
       [ 4,  5,  6,  7,  8,  9]])
 
对numpy.append()和numpy.concatenate()两个函数的运行时间进行比较
示例4:
>>> from time import clock as now
>>> a=np.arange(9999)
>>> b=np.arange(9999)
>>> time1=now()
>>> c=np.append(a,b)
>>> time2=now()
>>> print time2-time1
28.2316728446
>>> a=np.arange(9999)
>>> b=np.arange(9999)
>>> time1=now()
>>> c=np.concatenate((a,b),axis=0)
>>> time2=now()
>>> print time2-time1
20.3934997107
可知,concatenate()效率更高,适合大规模的数据拼接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值