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

数据采集

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

数据预处理

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

数据清洗

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

数据缺失的缘由

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

数据缺失的类型

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

清洗案例

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

缺失值处理办法

对于各类类型数据的缺失,咱们到底要如何处理呢?如下是处理缺失值的四种方法:删除记录,数据填
补,和不处理。
删除记录
简单粗暴
在样本数据量十分大且缺失值很少的状况下很是有效,但若是样本量自己不大且缺失也很多,那么
不建议使用"""
删除缺失数据
"""
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())ide

数据填补

对缺失值的插补大致可分为两种:替换缺失值,拟合缺失值,虚拟变量。替换是经过数据中非缺失数据
的类似性来填补,其核心思想是发现相同群体的共同特征,拟合是经过其余特征建模来填补,虚拟变量
是衍生的新变量代替缺失值。
均值插补。
对于定类数据:使用 众数(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 lagrange
x = [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 np
import  pandas as pd

def 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 np
import 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  info
user1    NaN      1     2
user2    3.0      4     5
user3    6.0      7     8
user4    NaN     10    11
"""
df.price.iloc[0] = np.nan
df.price.iloc[3] = 3

print("源数据: \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 date

import matplotlib.pyplot as plt
import seaborn as sns
import 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')
相关文章
相关标签/搜索