利用各类手段获取数据,数据样式不限制,但通常而言是形如 excel 或者 csv 这样的表格格式。
数据采集: urllib , requests
数据解析: Xpath , BS4 , 正则表达式
数据持久化存储: pd.to_csv , pd.to_excel , MySQL , Redispython
通常而言,数据分析和数据挖掘领域的处理的数据都是海量的数据,这样的数据不免会出现问题。
数据预处理占到数据挖掘工做的60%,这是最重要也是最核心的领域.
数据预处理分为数据清洗、数据集成、数据变换和数据规约。正则表达式
数据清洗就是删除无关数据、重复数据、平滑噪声数据、处理缺失值和异常值。算法
有些信息暂时没法获取。例如在医疗数据库中,并不是全部病人的全部临床检验结果都能在给定的时
间内获得,就导致一部分属性值空缺出来。又如在申请表数据中,对某些问题的反映依赖于对其余
问题的回答。
有些信息是被遗漏的。多是由于输入时认为不重要、忘记填写了或对数据理解错误而遗漏,也可
能是因为数据采集设备的故障、存储介质的故障、传输媒体的故障、一些人为因素等缘由而丢失
了。有些对象的某个或某些属性是不可用的。也就是说,对于这个对象来讲,该属性值是不存在的,如
一个未婚者的配偶姓名、一个儿童的固定收入情况等。
有些信息(被认为)是不重要的。如一个属性的取值与给定语境是无关的,或训练数据库的设计者
并不在意某个属性的取值(称为 dont-care value )。
获取这些信息的代价太大。
系统实时性能要求较高,即要求获得这些信息前迅速作出判断或决策。数据库
数据集中不含缺失值的变量称为彻底变量,数据集中含有缺失值的变量称为不彻底变量。
从缺失的分布来将缺失能够分为彻底随机缺失,随机缺失和彻底非随机缺失。
彻底随机缺失(missing completely at random, MCAR ):指的是数据的缺失是彻底随机的,
不依赖于任何不彻底变量或彻底变量,不影响样本的无偏性,如家庭地址缺失;
随机缺失(missing at random,MAR):指的是数据的缺失不是彻底随机的,即该类数据的缺失依
赖于其余彻底变量,如财务数据缺失状况与企业的大小有关;
非随机缺失(missing not at random, MNAR ):指的是数据的缺失与不彻底变量自身的取值有关,
如高收入人群不肯意提供家庭收入;
随机缺失和非随机缺失,直接删除记录是不合适的,随机缺失能够经过已知变量对缺失值进行估计,而
非随机缺失的非随机性尚未很好的解决办法。网络
我给你一组数据,若是要你作数据清洗,你会怎么作?
数据存在 2 个问题:
典韦出现了 2 次
张飞的数学成绩缺失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 实现)
拉格朗日插值法能够找到一个多项式,其刚好在各个观测的点取到观测到的值。这样的多项式称为
拉格朗日(插值)多项式。数学上来讲,拉格朗日插值法能够给出一个刚好穿过二维平面上若干个
已知点的多项式函数。工具
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经常使用分类预测模型
聚类分析
群体上的考究。
和分类不一样,这里全部的数据都是事先没有类别的。
Keras这是非监督的学习算法。
原理:给定一组数据,根据数据自身距离或者类似度将其划分为若干组,原则为组内距离最小而组
间距离最大。
经常使用聚类方法。
划分方法(分裂):K-Means算法(K-平均)、 K-MEDOIDS 算法(K-中心点)、 CLARANS 算
法(基于选择的算法)
层次分析方法:BIRCH算法(平均迭代规约和聚类)、CURE算法(表明点聚类)、
CHAMELEON算法(动态模型)
基于密度的方法: DBSCAN 算法(基于高密度链接区域)、 DENCLUE算法 (密度分布函
数)、OPTICS算法(对象排序识别)
基于网格的方法:STING算法(统计信息网络)、 CLIOUE 算法(聚类高维空间)、WAVE-
CLUSTER算法(小波变换)
基于模型的方法:统计学方法、神经网络方法 - 经常使用聚类分析算法
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)
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')