您好,欢迎来到网暖!

当前位置:网暖 » 站长资讯 » 建站基础 » 网络技术 » 文章详细 订阅RssFeed

python学习之数据分析与数据挖掘

来源:网络整理 浏览:159次 时间:2020-10-28
数据采集

利用各种手段获取数据,数据样式不限制,但一般而言是形如 excel 或者 csv 这样的表格格式。
数据采集: urllib , requests
数据解析: Xpath , BS4 , 正则表达式
数据持久化存储: pd.to_csv , pd.to_excel , MySQL , Redis

数据预处理

python学习之数据分析与数据挖掘
一般而言,数据分析和数据挖掘领域的处理的数据都是海量的数据,这样的数据难免会出现问题。
数据预处理占到数据挖掘工作的60%,这是最重要也是最核心的领域.
数据预处理分为数据清洗、数据集成、数据变换和数据规约。

数据清洗

数据清洗就是删除无关数据、重复数据、平滑噪声数据、处理缺失值和异常值。

数据缺失的原因

有些信息暂时无法获取。例如在医疗数据库中,并非所有病人的所有临床检验结果都能在给定的时
间内得到,就致使一部分属性值空缺出来。又如在申请表数据中,对某些问题的反映依赖于对其他
问题的回答。
有些信息是被遗漏的。可能是因为输入时认为不重要、忘记填写了或对数据理解错误而遗漏,也可
能是由于数据采集设备的故障、存储介质的故障、传输媒体的故障、一些人为因素等原因而丢失
了。有些对象的某个或某些属性是不可用的。也就是说,对于这个对象来说,该属性值是不存在的,如
一个未婚者的配偶姓名、一个儿童的固定收入状况等。
有些信息(被认为)是不重要的。如一个属性的取值与给定语境是无关的,或训练数据库的设计者
并不在乎某个属性的取值(称为 dont-care value )。
获取这些信息的代价太大。
系统实时性能要求较高,即要求得到这些信息前迅速做出判断或决策。

数据缺失的类型

数据集中不含缺失值的变量称为完全变量,数据集中含有缺失值的变量称为不完全变量。
从缺失的分布来将缺失可以分为完全随机缺失,随机缺失和完全非随机缺失。
完全随机缺失(missing completely at random, MCAR ):指的是数据的缺失是完全随机的,
不依赖于任何不完全变量或完全变量,不影响样本的无偏性,如家庭地址缺失;
随机缺失(missing at random,MAR):指的是数据的缺失不是完全随机的,即该类数据的缺失依
赖于其他完全变量,如财务数据缺失情况与企业的大小有关;
非随机缺失(missing not at random, MNAR ):指的是数据的缺失与不完全变量自身的取值有关,
如高收入人群不愿意提供家庭收入;
随机缺失和非随机缺失,直接删除记录是不合适的,随机缺失可以通过已知变量对缺失值进行估计,而
非随机缺失的非随机性还没有很好的解决办法。

清洗案例

我给你一组数据,如果要你做数据清洗,你会怎么做?
数据存在 2 个问题:
典韦出现了 2 次
张飞的数学成绩缺失
python学习之数据分析与数据挖掘

缺失值处理办法

对于各种类型数据的缺失,我们到底要如何处理呢?以下是处理缺失值的四种方法:删除记录,数据填
补,和不处理。
删除记录
简单粗暴
在样本数据量十分大且缺失值不多的情况下非常有效,但如果样本量本身不大且缺失也不少,那么
不建议使用"""
删除缺失数据
"""
import pandas as pd
import numpy as np
#创建一个带有缺失值的DataFrame对象
df = pd.DataFrame(np.arange(12).reshape((3, 4)), index=['user1', 'user2',
'user3'], columns=['views', 'likes', 'transfers', 'saves'])
print("源数据: \n", df)
df.loc[:2, :1]= np.nan
print("缺失值数据: \n", df)
#删除行,使用参数axis=0
print(df.dropna(axis=0))
#删除列, 使用参数axis=1
print(df.dropna(axis=1))
#删除数据表中含有空值的行
print(df.dropna())

数据填补

对缺失值的插补大体可分为两种:替换缺失值,拟合缺失值,虚拟变量。替换是通过数据中非缺失数据
的相似性来填补,其核心思想是发现相同群体的共同特征,拟合是通过其他特征建模来填补,虚拟变量
是衍生的新变量代替缺失值。
均值插补。
对于定类数据:使用 众数(mode)填补,比如一个学校的男生和女生的数量,男生500
人,女生50人,那么对于其余的缺失值我们会用人数较多的男生来填补。
对于定量(定比)数据:使用平均数(mean)或中位数(median)填补,比如一个
班级学生的身高特征,对于一些同学缺失的身高值就可以使用全班同学身高的平均值或
中位数来填补。
"""
均值差补
"""
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(12).reshape((4, 3)),
index=['user1', 'user2', 'user3', 'user4'],
columns=['price', 'count', 'info'])
df['price'][:1] = np.nan
df['price'][3] = 3
print("缺失值数据: \n", df)
#使用price均值对NA进行填充
df_mean = df['price'].fillna(df['price'].mean())
#使用price中位数对NA进行填充
df_median = df['price'].fillna(df['price'].median())
#使用price众数对NA进行填充
df_mode = df['price'].fillna(df['price'].mode())
print("均值填充: \n", df_mean)
print("中位数填充: \n", df_median)print("众数填充: \n", df_median)

插值模型
拉格朗日插值法( scipy 实现)
拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为
拉格朗日(插值)多项式。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个
已知点的多项式函数。
python学习之数据分析与数据挖掘
python学习之数据分析与数据挖掘

from scipy.interpolate  import lagrangex = [3, 6, 9]y = [10, 8, 4]lagrange(x,y)#poly1d([ -0.11111111,   0.33333333,10.      ])#如果U7>:*? (tyyyyyyyyyyyy(要进行插值操作,可以:lagrange(x, y)(10)# 2.222222

牛顿插值法( scipy 未实现)
牛顿插值法是曲线拟合插值法中的一种,适合采用所有的数据都精确的情况下。

数据集成

多数据源数据仓库化。
实体识别
同名异义
异名同义
单位不统一
冗余属性识别
同一属性多次出现
同一属性命名不一致导致重复

数据变换

规范化处理数据,便于使用。
简单函数变换
常用来将不具有正态分布的数据变换成具有正态分布的数据。
规范化
最小-最大规范化
零-均值规范化(使用最多)
小数定标规范化
连续属性离散化
等宽法
等频法
聚类
属性构造
推导属性
小波变换
新型数据分析工具

数据规约

降低错误数据对建模的影响,减少存储成本
属性规约
数值规约
直方图
聚类
抽样
参数回归

数据挖掘建模

根据挖掘目标和数据形式的不同,可以建立分类与预测、聚类分析、关联规则、时序模式、偏差检测等
模型。

分类与预测

如餐饮行业想知道哪些用户会离我而去,哪些用户可能成为VIP。
常用的分类和预测算法:
python学习之数据分析与数据挖掘
python常用分类预测模型
python学习之数据分析与数据挖掘
聚类分析
群体上的考究。
和分类不同,这里所有的数据都是事先没有类别的。
Keras这是非监督的学习算法。
原理:给定一组数据,根据数据自身距离或者相似度将其划分为若干组,原则为组内距离最小而组
间距离最大。
常用聚类方法。
划分方法(分裂):K-Means算法(K-平均)、 K-MEDOIDS 算法(K-中心点)、 CLARANS 算
法(基于选择的算法)
层次分析方法:BIRCH算法(平均迭代规约和聚类)、CURE算法(代表点聚类)、
CHAMELEON算法(动态模型)
基于密度的方法: DBSCAN 算法(基于高密度连接区域)、 DENCLUE算法 (密度分布函
数)、OPTICS算法(对象排序识别)
基于网格的方法:STING算法(统计信息网络)、 CLIOUE 算法(聚类高维空间)、WAVE-
CLUSTER算法(小波变换)
基于模型的方法:统计学方法、神经网络方法 - 常用聚类分析算法
python学习之数据分析与数据挖掘

删除缺失值
import numpy as npimport  pandas as pddef create_csv():    """测试删除缺失值的数据准备"""    #创建一个带有缺失值的DataFrame对象    df = pd.DataFrame(np.arange(12).reshape((3, 4)),                      index=['user1', 'user2', 'user3'],                      columns=['views', 'likes', 'transfers', 'saves'])    #第一行前2列, np.nan缺失值    df.iloc[:1, :2] = np.nan    #将数据存储到csv文件中    df.to_csv('doc/data-clean.csv')def drop_null_data():    # 返回市DataFrame对象    df = pd.read_csv('doc/data-clean.csv')    #df1 = df.dropna()       # 默认情况下,将有缺失值的一行信息或者多行信息删除    df1 = df.dropna(axis=1)   # axis=1, 删除有缺失值的一列或者多列(不建议使用)    print(df1)if __name__ == '__main__':    drop_null_data()
缺失值的填充
import numpy as npimport pandas as pd#生成DataFrame数据(一般是从文件加载出来的)df = pd.DataFrame(np.arange(12).reshape(4, 3),                  index=['user1', 'user2', 'user3', 'user4'],                  columns=['price', 'count', 'info']                  )#df.price获取price这一列信息。 iloc通过索引进行定位"""       price  count  infouser1    NaN      1     2user2    3.0      4     5user3    6.0      7     8user4    NaN     10    11"""df.price.iloc[0] = np.nandf.price.iloc[3] = 3print("源数据: \n", df)#使用均值填充price_mean = df.price.mean()        # 获取价格这一列的均值df_mean = df['price'].fillna(price_mean)#使用中位数填充price_median = df.price.median()df_median = df['price'].fillna(price_median)print(df_median)#众数填充price_mode = df['price'].mode()  # 众数返回的是Series对象, 所以需要获取对应的索引df_mode = df['price'].fillna(price_mode[0])print(df_mode)
stock.py
from datetime import dateimport matplotlib.pyplot as pltimport seaborn as snsimport tushare as ts#正常显示画图时出现的中文和负号"""Linux/Mac:     1. 寻找显示中文的字体库 fc-list :lang=zh    2. 实例化字体对象    my_font = font_manager.FontProperties(fname='字体库的文件名")    3. 指定中文字体时, 设置字体的属性    plt.title('中文标题', fontproperties=my_font)"""def draw_close(code):    """    1. 近一月股票收盘价走势曲线    2. 5日均线、10日均线以及20日均线    3. 每日收盘价涨跌幅度  diff(差值)/pct_change(涨/跌幅百分比)    :param code: 股票编码    :return:    """    #数据准备与样式设置    sns.set(style='whitegrid')    plt.rcParams['font.sans-serif'] = ['SimHei']    plt.rcParams['axes.unicode_minus'] = False    end = date.today()  # 日期对象    start = date(end.year, end.month - 1, end.day)  # 日期对象    end = str(end)    start = str(start)    #获取code股票的过去一年的历史数据    df = ts.get_hist_data(code, start, end)    print(df)    #创建子图    ax1 = plt.subplot(3, 1, 1)    #获取收盘价df.close/df['close'], 绘制曲线图    #plt.plot(df.index, df.close)    df['close'].plot(ax=ax1, color='orange', ls='-.', label='收盘价')    df['open'].plot(ax=ax1, color='b', ls='-', label='开盘价')    ax1.set_title("%s股票收盘价/收盘价走势曲线" % (code))    #loc指定图例的显示位置    ax1.legend(loc='upper right')    #创建子图    ax2 = plt.subplot(3, 1, 2)    ax2.set_title("%s股票均线走势曲线" % (code))    df['ma5'].plot()    df['ma10'].plot()    df['ma20'].plot()    ax2.legend(loc='upper right')    #创建子图    ax3 = plt.subplot(3, 1, 3)    ax3.set_title("%s股票每日涨跌幅度曲线" % (code))    df['Daily Return'] = df['close'].pct_change()    df['Daily Return'].plot(color='green')    plt.show()if __name__ == '__main__':    draw_close('600848')

推荐站点

  • 腾讯腾讯

    腾讯网(www.QQ.com)是中国浏览量最大的中文门户网站,是腾讯公司推出的集新闻信息、互动社区、娱乐产品和基础服务为一体的大型综合门户网站。腾讯网服务于全球华人用户,致力成为最具传播力和互动性,权威、主流、时尚的互联网媒体平台。通过强大的实时新闻和全面深入的信息资讯服务,为中国数以亿计的互联网用户提供富有创意的网上新生活。

    www.qq.com
  • 搜狐搜狐

    搜狐网是全球最大的中文门户网站,为用户提供24小时不间断的最新资讯,及搜索、邮件等网络服务。内容包括全球热点事件、突发新闻、时事评论、热播影视剧、体育赛事、行业动态、生活服务信息,以及论坛、博客、微博、我的搜狐等互动空间。

    www.sohu.com
  • 网易网易

    网易是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,开设新闻、娱乐、体育等30多个内容频道,及博客、视频、论坛等互动交流,网聚人的力量。

    www.163.com
  • 新浪新浪

    新浪网为全球用户24小时提供全面及时的中文资讯,内容覆盖国内外突发新闻事件、体坛赛事、娱乐时尚、产业资讯、实用信息等,设有新闻、体育、娱乐、财经、科技、房产、汽车等30多个内容频道,同时开设博客、视频、论坛等自由互动交流空间。

    www.sina.com.cn
  • 百度一下百度一下

    百度一下,你就知道

    www.baidu.com