Python数据分析简介

1,Python作为一门编程语言开发效率快,运行效率被人诟病,但是Python核心部分使用c/c++等更高效的语言来编写的还有强大的numpy, padnas, matplotlib,scipy库等应用,在一定程度上解决了Python的运行效率问题

2,搭建Python开发平台

  • .5555666600Python的科学计算发行版---Anaconda
  • Anaconda的特点如下:
    1. 包含了众多流行的科学、数学、工程 、数据分析的Python包
    2. 完全开源免费
    3. 额外的加速、优化是收费的,但对于学术用途可以申请免费的License
    4. 全平台支持:Linux、Windows、Mac,支持Python2和Python3

3,Python效率的问题(回顾)

  • 我们要将会从哪个使用map()、reduce()、filter()Python的内置函数,目的是兼顾简洁和效率,内置函数的效率相当于c语言,要比Python内置的for循环和while循环快得多,因此下面的内容会大量使用Python的 内置函数

4,库的导入与添加(回顾)

import cmath
a = cmath.sin(1)  # 计算正弦
b = cmath.exp(1)  # 计算指数
c = cmath.pi  # 内置的圆周率常数
print(a)  # (0.8414709848078965+0j)
print(b)  # (2.718281828459045+0j)
print(c)  # 3.141592653589793

print(3/2, type(3/2))  # 1.5 <class 'float'>
print(1.2-0.2,type(1.2-0.2))  # 1.0 <class 'float'>

5,python数据分析工具

扩展库 简介
Numpy 提供数组支持,以及相应的高效的处理函数
 Scipy 提供矩阵支持以及矩阵相关的数值计算模块 
Matplotlib  强大的数据可视化工具、做图库 
Pandas  强大、灵活的数据分析和探索工具 
StatsModels  统计建模和计量经济学,包括描述统计统计模型估计和推断 
Scikit-Learn  支持回归,分类聚类等强大的及机器学习库 
Keras  深度学习库,用于建立神经网络以及深度学习模型 
Gensim  用来做文本主题模型的库,文本挖掘可能用到 
  • 5.1Numpy:
    • 提供真正数组的功能,以及对数据进行快速处理的函数。
    • 下载安装:pip install numpy
import numpy as np
a = np.array([2, 0, 1, 9])
print(a)
print(a[:3])  # 切片
print(a.min())  # 计算列表的最小值,min(self, iterable)
a.sort()  # 调用列表的排序方法
b = np.array([[1, 2, 3], [4, 5, 6]])  # 创建二维数组
print(b * b)
"""
[
    [1,2,3],
    [4,5,6]
]
相乘
[
    [1,2,3],
    [4,5,6]
]
[
    [1,4,9],------>[1*1, 2*2, 3*3]
    [16,25,36]----->[4*4,5*5,6*6]
]
数组是一致的数组
"""
  • 5.2Scipy:
    • scippy提供真正的矩阵,以及大量基于矩阵运算的对象与函数
    • scipy包含的函数功能有最优化、线性代数、积分、差值、拟合、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学和工程中常用的计算,显然这些都是数据挖掘和与建模必备的
    • Scipy依赖于Numpy,因此安装 它之前先安装Numpy,和Numpy的安装方式一样。
# 求解非线性方程组2x1-x2^2=1,x1^2-x2 = 2
from scipy.optimize import fsolve
def func(x):# 定义要求解的方程组
    x1 = x[0]
    x2 = x[1]
    return [2*x1 - x2**2 -1, x1**2 -x2 -2]
result = fsolve(func,[1, 1])  # 输入初始值1,1并求解
print(result)  # 输出结果[1.91963957 1.68501606]


# 数值积分
from scipy import integrate
def g(x):  # 定义被积函数
    return (1-x**2)**0.5
pi_2, err = integrate.quad(g, -1, 1)  # 积分结果和误差
print(pi_2*2)  # 有微积分知识知道积分结果为uan周吕PI的一半
# 3.1415926535897967
import numpy as np
import matplotlib.pyplot as plt  # 导入matplotlib
x = np.linspace(0, 10, 1000)  # 作图的变量自变量
y = np.sin(x)  # 因变量y
z = np.cos(x*2)  # 因变量z

plt.figure(figsize=(8, 4))  # 设置图像大小
plt.plot(x, y, label='$sin x+1$', color='red', linewidth=2)  # 作图,设置标签、线条颜色、线条大小
plt.plot(x, z, 'b--', label='$cos x^2+1$')  # 作图,设置标签、线条类型
plt.xlabel('Time(s)')  # x轴名称
plt.ylabel('Volt')  # y轴名称
plt.title('A Simple Example')  # 标题
plt.ylim(0, 2.2)  # 显示y轴范围
plt.legend()  # 显示图例
plt.show()  # 显示作图结果

    • 如果是中文标签,就会发现中文标签无法正常显示,解决办法作图之前手动将默认字体修改掉
      • pltrcParams['font.sans-serif'] = ['SimHei']  # 这俩句用来显示正常中文标签
    • 在作图的时候负号可能显示不正常,可以通过以下代码实现:
      • plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像,负号为方块的问题
    • 参考链接:
  • 5.4pandas:
    • Pandas是Python最强大的数据库分析和探索工具,它包含高级的数据结构和精巧的工具,使得在Python中处理数据非常快和简单
    • Pandas基本的数据结构是Series。Series是序列类似于一堆数组;DateFrame相当于一张二维的表格,它的每一列都是一个Series,为了定位Series中的元素,Pandas提供了index对象,每个Series都会带一个对应的Index用来标记不同的元素,Index不一定是数字,也可以是字母,中文等,它 类似于SQL中的主键
import pandas as pd
s = pd.Series([1, 2, 3], index=["a", "b", "c"])  # 创建一个序列s
d = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=["a", "b", "c"])  # 创建一个二维列表
d2 = pd.DataFrame(s)  # 也可以用已经有的序列来创建表格
d.head()  # 预览前5行数据
d.describe()  # 数据基本统计量
# 读取文件,注意文件的存储路径不能带有中文,否则读取可能会出错
pd.read_excel("data.xls")  # 读取excel文件,创建DataFraame
pd.read_csv("data.csv", encoding="utf-8")  # 读取文本格式的数据,一般用encoding指定编码
from statsmodels.tsa.stattools import adfuller as ADF  # 导入ADF检验
import numpy as np
print(ADF(np.random.rand(100)))  # 返回的结果有ADF值, p值等
"""
(-7.516108057146661,
 3.899499612937967e-11,
 2,
 97,
 {'1%': -3.4996365338407074,
  '10%': -2.5829283377617176,
  '5%': -2.8918307730370025},
 33.01000991650656)
"""
from sklearn.linear_model import LinearRegression  # 导入线性回归模型
model = LinearRegression()  # 建立线性回归模型
print(model)  # LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,normalize=False) 
    • 所有模型提供的接口有:
      • model.fit():训练模型,对于监督模型来说是fit(X, y),对于非监督模型是fit(X)。
    • 监督模型提供的接口有:
      • model.predict(X_new):预测新样本
      • model.predict_probal(X_new):预测概率 ,仅对某些模型有用(比如LR)
      • model.score():得分越高,fit越好
    • 非监督模型提供的接口有:
      • model.transform():从数据中学到新的"基空间"
      • model.fit_transform():从数据中学到新的基并将 这个数据按照这组"基"进行交换。
from sklearn import svm  # 导入svm模型
clf = svm.LinearSVC()  # 建立线性SVM分类器
clf.fit(iris.data, iris.target)  # 用数据训练模型
clf.predict([[5.0, 3.6, 1.3, 0.25]])  # 训练好模型之后,输入新的值进行预测
clf.coef_  # 查看训练好模型的参数
# 报了一个 错,让我增加迭代次数
  • 5.7Keras
    • 虽然scikit-Learn足够强大,但是它并没有包含一种强大的模型-人工神经网络。人工神经网络功能是相当强大的,但是原理相对简单,在语言处理、图像识别等领域有着重要的作用
    • Keras是基于Theano的模块的,它是定义、优化和高效地解决多维数组数据对应数学表达式的模拟估计问题。它有效地实现符号分解、高度优化的速度和稳定性等特点,最重要的是它还实现了CPU加速,使得密集数据的处理速度是CPU的数十倍
    • 安装Keras之前首先要安装Numpy、Scipy、Theano。安装Theano先准备一下c++编译器(MinGW),再下载Numpy等依赖包,再下载Keras,如果想要实现CPU加速,还需要安装和配置CUDA(在windows下速度运行的会打折扣,建议在Linux下安装和配置)
    • 参考链接
    • 用Keras搭建一个简单的MLP(多层感知器)
from Keras.models import Sequential
from Keras.layers.core import Dense,Dropout,Activation
from Keras.optimizers import SGD

model = Sequential()  # 模型初始化
model.add(Dense(20, 64))  # 添加到输入层(20节点)、第一隐藏层(64节点的连接)
model.add(Activation('tanh'))
model.add(Dropout(0.5))  # 使用Droout防止过拟合
model.add(Activation("tanh"))  # 第二隐藏层用tanh作为激活函数
model.add(Dense(64, 1))  # 添加第二隐藏层(64节点)、输出层(1节点的连接)
model.add(Activation("sigmod"))  # 输出用sigmod 作为激活函数

sgd = SGD(lr=0.1, decay=1e-6, monmenton=0.9, nesterov=True)  # 定义求解算法
model.compile(loss="mean_squared_error", optimizer=True)  # 编译生成模型,损失函数为平均误差平方和
model.fit(X_train, Y_train, nb_epoch=20, batch_size=16)  # 训练模型
score = model.evaluate(X_test, y_test, batch_size=16)  # 测试模型
    • 要注意的是,Keras的预测函数与Scikit-Learn有所差别,Keras用model.predict()给出概率,model.predict_classes()方法给出和分类结果
    • 参考链接:
  • 5.8Gensim
    • 在Gensim的官网中,对自己的介绍只有一句话:topic modelling for humans!
    • Gensim是用来处理语言方面 的任务,如文本想的相似度计算、LDA、Word2Vec
import gensim, logging
logging.basicConfig(format="%(asctime)s : $(levelname)s : %(message)s", level=logging.Info)
# logging是用来输出训练日志

# 分好词的句子, 每个句子以词列表的形式输入
sentences = [["first", "sentence"], ["second", "sentence"]]

# 用以上句子训练词向量模型
model = gensim.model.Word2Vec(sentences, min_count=1)
print(model["sentence"])  # 输出单词sentence的词向量
原文地址:https://www.cnblogs.com/ljc-0923/p/10738781.html