目录

  • 1 模块一  Python与机器学习概述
    • 1.1 Python与机器学习简介
    • 1.2 发展历程
    • 1.3 基本语法
    • 1.4 帮助
    • 1.5 应用
    • 1.6 示例源代码(食品识别小小专家系统)
    • 1.7 示例代码   蜡笔小新
    • 1.8 小结
    • 1.9 Python基础教程(教&学资料)
      • 1.9.1 安装Python
      • 1.9.2 第一个python程序
      • 1.9.3 Python基础
      • 1.9.4 函数
      • 1.9.5 高级特性
      • 1.9.6 函数式编程
      • 1.9.7 模块
      • 1.9.8 面向对象编程
      • 1.9.9 面向对象高级编程
      • 1.9.10 错误、调试和测试
      • 1.9.11 IO编程
      • 1.9.12 进程和线程
      • 1.9.13 正则表达式
      • 1.9.14 常用内建模块
      • 1.9.15 常用第三方模块
      • 1.9.16 图形界面
      • 1.9.17 网络编程
      • 1.9.18 电子邮件
      • 1.9.19 访问数据库
      • 1.9.20 Web开发
      • 1.9.21 异步IO
      • 1.9.22 使用MicroPython
      • 1.9.23 实战训练(day1~~day10)
        • 1.9.23.1 Day 1 - 搭建开发环境
        • 1.9.23.2 Day 2 - 编写Web App骨架
        • 1.9.23.3 Day 3 - 编写ORM
        • 1.9.23.4 Day 4 - 编写Model
        • 1.9.23.5 Day 5 - 编写Web框架
        • 1.9.23.6 Day 6 - 编写配置文件
        • 1.9.23.7 Day 7 - 编写MVC
        • 1.9.23.8 Day 8 - 构建前端
        • 1.9.23.9 Day 9 - 编写API
        • 1.9.23.10 Day 10 - 用户注册和登录
      • 1.9.24 Day 11 - 编写日志创建页
      • 1.9.25 Day 12 - 编写日志列表页
      • 1.9.26 Day 13 - 提升开发效率
      • 1.9.27 Day 14 - 完成Web App
      • 1.9.28 Day 15 - 部署Web App
      • 1.9.29 Day 16 - 编写移动App
    • 1.10 FAQ
    • 1.11 阶段总结
  • 2 PYthon程序示例
    • 2.1 程序示例(一)初识程序
    • 2.2 程序示例(二)查看今天是今年的第几天
    • 2.3 程序示例(三)if elif else语句
    • 2.4 程序示例(四)元组,列表, 堆栈,队列
    • 2.5 程序示例(五)学玩游戏《学色彩  神魔三龟玩变色》
    • 2.6 程序示例(六)函数
    • 2.7 程序示例(七)字符串
    • 2.8 程序示例(八)文件
    • 2.9 程序示例(九)排序
    • 2.10 程序示例-机器学习中英单词翻译小专家
    • 2.11 程序示例      画花朵  &  画佩奇
    • 2.12 程序示例   华夏时钟
    • 2.13 示例:  显示图片,响声
    • 2.14 播放声音视频文件mp3、wmv、wav、m4a等)
    • 2.15 Python WEB开发技术实战
  • 3 模块2 NumPy数值计算
    • 3.1 ndarray创建与索引
    • 3.2 ndarray的基础操作
    • 3.3 ufunc
    • 3.4 小结
    • 3.5 习题与实训
  • 4 模块3   pandas基础
    • 4.1 pandas常用类
    • 4.2 DataFrame基础操作
    • 4.3 其他数据类型操作
    • 4.4 小结
    • 4.5 习题与实训
    • 4.6 练习题
  • 5 模块4 pandas进阶
    • 5.1 数据读取与写出
    • 5.2 DataFrame进阶
    • 5.3 数据准备
    • 5.4 小结
    • 5.5 习题与实训
    • 5.6 练习习题及解答(参考)
  • 6 模块5 Matplotlib基础绘图
    • 6.1 Matplotlib绘图基础
    • 6.2 分析特征关系常用图形
    • 6.3 分析特征内部数据状态常用图形
    • 6.4 小结
    • 6.5 习题与实训
  • 7 模块6 机器学习库 scikit-learn
    • 7.1 数据准备
    • 7.2 降维
    • 7.3 分类
    • 7.4 回归
    • 7.5 聚类
    • 7.6 模型选择
    • 7.7 小结
    • 7.8 习题与实训
  • 8 模块7 餐饮企业综合分析
    • 8.1 (案例)餐饮企业分析需求
    • 8.2 数据准备
    • 8.3 使用K-means算法进行客户价值分析
    • 8.4 使用决策树算法实现餐饮客户流失预测
    • 8.5 小结
    • 8.6 习题与实训
  • 9 模块8  通信运营商客户流失分析与预测
    • 9.1 通信运营商客户流失分析需求
    • 9.2 数据准备
    • 9.3 特征工程
    • 9.4 使用多层感知器算法实现通信运营商 客户流失预测
    • 9.5 小结
    • 9.6 习题与实训
  • 10 学习参考资源
    • 10.1 机器学习的通俗讲解
    • 10.2 十大机器学习算法及其应用
    • 10.3 常用机器学习算法优缺点及其应用领域
    • 10.4 轻松学会 Python turtle 绘图
    • 10.5 Python 习题库
      • 10.5.1 习题1
    • 10.6 上机操作实训库
    • 10.7 面试准备题
    • 10.8 Python 程序扩展名 及发布程序时的选择
    • 10.9 计算机Python考试大纲
    • 10.10 Python  基础知识点梳理
    • 10.11 Python常用模块大全
    • 10.12 机器学习基本术语
    • 10.13 几个机器学习的成功案例
    • 10.14 60个机器学习算法应用场景实例
  • 11 章节测验(必测)
    • 11.1 测验一
    • 11.2 测验二
    • 11.3 测验三
    • 11.4 测验四
    • 11.5 测验五
    • 11.6 测验六
    • 11.7 测验七
    • 11.8 测验八
    • 11.9 测验九
    • 11.10 测验十
    • 11.11 编程专项测验
    • 11.12 填空题专项测验
    • 11.13 判断题专项测试
    • 11.14 简答题专项测试
    • 11.15 《机器学习技术》总复习
    • 11.16 书本--习题参考解答
  • 12 综合实训项目及展示
    • 12.1 项目(一)作品展示(1)
    • 12.2 项目(一)作品展示(2)
    • 12.3 团队项目实训(必作!)
数据准备

数据准备

# 代码 8-1

import pandas as pd

# 读取数据文件

data = pd.read_csv('../data/USER_INFO_M.csv', index_col=0, encoding='gbk')

data = data.iloc[1:1000,:]

print('原始数据形状为:', data.shape)


# 去除重复记录

data_drop = pd.DataFrame.drop_duplicates(data, subset=None, keep='first', inplace=False)

print('删除重复记录后的数据形状为:', data_drop.shape)



# 查找是否有重复特征

# 定义求取特征是否完全相同的矩阵的函数

def FeatureEquals(df):

    dfEquals = pd.DataFrame([], columns=df.columns, index=df.columns)

    for i in df.columns:

        for j in df.columns:

            dfEquals.loc[i, j] = df.loc[:, i].equals(df.loc[:, j])

    return dfEquals



detEquals = FeatureEquals(data_drop)  # 应用FeatureEquals函数

# 遍历所有数据

lenDet = detEquals.shape[0]

dupCol = []

for k in range(lenDet):

    for l in range(k+1, lenDet):

        if detEquals.iloc[k, l] & \

        (detEquals.columns[l] not in dupCol):

            dupCol.append(detEquals.columns[l])

# 删除重复列

data_drop.drop(dupCol, axis=1, inplace=True)

print('删除重复列后的数据形状:', data_drop.shape)




# 代码 8-2

# 数据降维

del data_drop['MODEL_NAME']  # 手机型号

del data_drop['AGREE_EXP_DATE']  # 删除合约是否到期

del data_drop['CUST_SEX']  # 性别

del data_drop['CONSTELLATION_DESC']  # 星座

del data_drop['CERT_AGE']  # 年龄

print('降维后的数据形状为:', data_drop.shape)




# 代码 8-3

# 统计各个特征的缺失率

naRate = (data_drop.isnull().sum()/

          data_drop.shape[0]*100).astype('str')+'%'

print('data每个特征缺失的率为:\n', naRate)




# 代码 8-4

# VIP等级为nan的补0

data_drop['VIP_LVL'] = data_drop['VIP_LVL'].fillna(0)

# 操作系统缺失的 填补ANDROID

data_drop['OS_DESC'] = data_drop['OS_DESC'].fillna('ANDROID')

print('处理缺失值后数据集的形状为:', data_drop.shape)




# 代码 8-5

# 对列统计分析

data_drop.describe()




# 代码 8-6

# 删除异常数据

data_drop = data_drop[data_drop['INNET_MONTH'] >= 0]

data_drop = data_drop[data_drop['ACCT_FEE'] < 400000]

print('处理异常值后数据集的形状为:', data_drop.shape)

data_drop.to_csv('../tmp/data_drop.csv', index=True, header='infer', encoding='utf8')




# 代码 8-7

import pandas as pd

import numpy as np


data_drop = pd.read_csv('../tmp/data_drop.csv', encoding='utf8')

data_group = data_drop.groupby("USER_ID").agg({

        'ACCT_FEE': [np.median, np.var],\

        'CALL_DURA': [np.median, np.var], 'CDR_NUM': [np.median, np.var],\

                  'NO_ROAM_LOCAL_CALL_DURA': [np.median, np.var],\

                  'NO_ROAM_LOCAL_CDR_NUM': [np.median, np.var],\

                  'NO_ROAM_GN_LONG_CALL_DURA': [np.median, np.var],\

                  'NO_ROAM_GN_LONG_CDR_NUM': [np.median, np.var],\

                  'GN_ROAM_CALL_DURA': [np.median, np.var], \

                  'GN_ROAM_CDR_NUM': [np.median, np.var], \

                  'NO_ROAM_CDR_NUM': [np.median, np.var],\

                  'P2P_SMS_CNT_UP': [np.median, np.var],

                  'TOTAL_FLUX': [np.median, np.var], \

                  'LOCAL_FLUX': [np.median, np.var], \

                  'GN_ROAM_FLUX': [np.median, np.var],\

                  'CALL_DAYS': [np.median, np.var], \

                  'CALLING_DAYS': [np.median, np.var],\

                  'CALLED_DAYS': [np.median, np.var],\

                  'CALL_RING': [np.median, np.var],\

                  'CALLING_RING': [np.median, np.var],\

                  'CALLED_RING': [np.median, np.var],\

                  'INNET_MONTH': [np.median, np.var], })


print('data_group的形状为:', data_group.shape)

data_group.columns = ['ACCT_FEE_median', 'ACCT_FEE_var', 'CALL_DURA_median', 

                      'CALL_DURA_var', 'CDR_NUM_median', 'CDR_NUM_var', 

                      'NO_ROAM_LOCAL_CALL_DURA_median', 

                      'NO_ROAM_LOCAL_CALL_DURA_var', 

                      'NO_ROAM_LOCAL_CDR_NUM_median', 

                      'NO_ROAM_LOCAL_CDR_NUM_var', 

                      'NO_ROAM_GN_LONG_CALL_DURA_median', 

                      'NO_ROAM_GN_LONG_CALL_DURA_var', 

                      'NO_ROAM_GN_LONG_CDR_NUM_median', 

                      'NO_ROAM_GN_LONG_CDR_NUM_var', 

                      'GN_ROAM_CALL_DURA_median', 

                      'GN_ROAM_CALL_DURA_var', 

                      'GN_ROAM_CDR_NUM_median', 

                      'GN_ROAM_CDR_NUM_var', 

                      'NO_ROAM_CDR_NUM_median', 

                      'NO_ROAM_CDR_NUM_var', 

                      'P2P_SMS_CNT_UP_median', 'P2P_SMS_CNT_UP_var', 

                      'TOTAL_FLUX_median', 'TOTAL_FLUX_var', 

                      'LOCAL_FLUX_median', 'LOCAL_FLUX_var', 

                      'GN_ROAM_FLUX_median', 'GN_ROAM_FLUX_var', 

                      'CALL_DAYS_median', 'CALL_DAYS_var', 

                      'CALLING_DAYS_median', 'CALLING_DAYS_var', 

                      'CALLED_DAYS_median', 'CALLED_DAYS_var', 

                      'CALL_RING_median', 'CALL_RING_var', 

                      'CALLING_RING_median', 'CALLING_RING_var', 

                      'CALLED_RING_median', 'CALLED_RING_var', 

                      'INNET_MONTH_median', 'INNET_MONTH_var']


data_group.to_csv('../tmp/data_group.csv', index=True, header='infer', encoding='utf8')




# 代码 8-8

# 将每个用户三个月的合约是否有效,合并为一条记录

# 定义合并合约有效记录函数

def fun1(data):

    if data.shape[0] != 3:

        return 0

    elif sum(data.iloc[:, 1] == 1) == 3:

        return 1.5

    else:

        return data.iloc[-1, 1] - data.iloc[:2, 1].mean()



data_agree = data_drop[["USER_ID",

                        "IS_AGREE"]].groupby("USER_ID").apply(lambda x: fun1(x))

print('data_agree的形状为:', data_agree.shape)

print(data_agree.head())

data_agree.to_csv('../tmp/data_agree.csv', index=True, header='infer', encoding='utf8')




# 代码 8-9

# 将每个用户三个月的VIP等级合并为一条记录

def fun2(data):

    if data.shape[0] != 3:

        return 0

    elif(data.iloc[0, 1] == data.iloc[1, 1]) & (data.iloc[0, 1] == data.iloc[2, 1]):

        return data.iloc[2, 1]

    else:

        return data.iloc[2, 1] - data.iloc[:2, 1].mean()



data_vip = data_drop[['USER_ID',

                      'VIP_LVL']].groupby('USER_ID').apply(lambda x: fun2(x))

print('data_vip的形状为:', data_vip.shape)

print(data_vip.head())

data_vip.to_csv('../tmp/data_vip.csv', index=True, header='infer', encoding='utf8')




# 代码 8-10

# 取每个用户三个月信用等级的平均数作为一行记录

data_credit = data_drop.groupby('USER_ID').agg({'CREDIT_LEVEL': np.mean, })

data_credit.iloc[:10]

print('data_credit的形状为:', data_credit.shape)

print(data_credit.head())

data_credit.to_csv('../tmp/data_credit.csv', index=True, header='infer', encoding='utf8')




# 代码 8-11

# 简化手机品牌

string = ['苹果', '小米', '华为', '三星', '诺基亚', '联想', 'LG']



def Replace(x=None, string=string):

    if x not in string:

        x = '其他'

    return x



# 每个ID的手机品牌只取第一个月的

data_str = data_drop.groupby("USER_ID").apply(lambda x: x.iloc[0])

data_manu = data_str['MANU_NAME'].apply(Replace)

print('data_manu的形状为:', data_manu.shape)

print(data_manu.head())


# 简化操作系统

# 每个ID的手机操作系统也只取第一个月的

data_id = data_drop.groupby("USER_ID").apply(lambda x: x.iloc[0])

data_os = data_id["OS_DESC"].str.extract("([A-Z]+)")  # 保留所有的字母

print('data_os的形状为:', data_os.shape)

print(data_os.head())

data_manu.to_csv('../tmp/data_manu.csv', index=True, header='infer', encoding='utf8')

data_os.to_csv('../tmp/data_os.csv', index=True, header='infer', encoding='utf8')