day76-初识数据分析

mysql中保存emoji表情需要将数据库的字符集改为utf8mb4

1数据分析定义及常见库

1.1数据分析定义

数据分析是基于商业目的,有目的的进行收集、整理、加工和分析数据,提炼有价值信息的一个过程。
过程:明确分析目的与框架、数据收集、数据处理(数据清洗、数据转换)、数据分析、数据展现和撰写报告等6个阶段。
数据类型可以分为表格型数据、多维数组(矩阵)及其他sql等类型的数据。

1.2常用库

1.numpy是python科学计算的基础包,numpy对于数值型数据,处理数据时比python内置的数据结构高效的多
2.pandas提供了快速便捷处理结构化数据的大量数据结构和函数
3.matplotlib最流行的用于绘制图表和其他二维数据可视化的python库
4.ipython和jupyter,jupyter notebook支持markdown和html编程
5.scipy一组专门解决科学计算中各种标准问题域的包的集合
6.scikit-learn通用的python机器学习工具包
7.statsmodels 包含经典统计学和经济计量学的算法
常用模块引用惯例:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import statsmodels as sm

2常用库的使用

在使用这些库之前,需要先安装环境(Anaconda软件),下载地址:https://www.anaconda.com/distribution/#macos

2.1ipython及jupyter使用

ipython使用于在python的shell中使用方式相同
在cmd窗口中直接输入jupyter notebook将会打开一个网页,在网页中可以直接编辑python程序。
要新建一个notebook,点击按钮New,选择“Python3”或“conda[默认项]”。如果是第一次, 点击空格,输⼊入一行Python代码。然后按Shift-Enter执⾏。当保存notebook时(File目录下的Save and Checkpoint),会创建一个后缀名为.ipynb的文件。在网页中在变量前或者后使⽤问号?,可以显示对象的信息。
在变量(函数)后使⽤??会显示函数的源码; np.load? 可以搜索含有load的文件;
%run命令运⾏所有的(或者所选择的)Python程序;使用%load,它将脚本(程序)导入到一个代码格中;%paste和%cpaste 函数。%paste 可以直接运⾏剪贴板中的代码;ctrl-a 将光标移动到一行的开头;ctrl-e 将光标移动到一行的末尾;ctrl-shift-v粘贴文本。

%run test3.py
np.*load*? 
%load test3.py

%timeit 测量任何Python语句,例如矩阵乘法,的执⾏时间;%debug在出现异常的语句进入调试模式。
ipython中集成了matplotlib数据可视化库:如下,利用随机生成的数绘制折线图。

 import numpy as np
 %matplotlib
 import matplotlib.pyplot as plt
 plt.plot(np.random.randn(50).cumsum())

3numpy-数组和矢量计算

numpy之于数值计算特别重要的原因之一,是因为它可以高效处理大数组的数据。
NumPy是C语⾔编写的算法库可以操作内存,⽽不必进⾏类型检查或其它前期⼯作。比起Python的内置序列, NumPy数组使⽤的内存更少。NumPy的C语⾔编写的算法库可以操作内存,⽽而不必进⾏类型检查或其它前期⼯作。⽐起Python的内置序列, NumPy数组使⽤的内存更少。于NumPy的算法要⽐纯Python快10到100倍(甚⾄更快)。

3.1numpy的使用

NumPy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速⽽灵活的大数据集容器。可以利⽤这种数组对整块数据执⾏一些数学运算,其语法跟标量元素之间的运算一样。

import numpy as np
data = np.random.randn(2, 3) # 生成一个2行3列的数组
data * 10 #data中所有数据乘10
data + data

ndarray是一个通⽤的同构数据多维容器,所有元素必须是相同类型的。

data.dtype  # 查看数据类型
data.shape  # 查看几行几列
arr1.ndim #查看维度
data1 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr1 = np.array(data1) # 将列表data1转化成数组对象(ndarray)

zeros和ones分别可以创建指定⻓度或形状的全0或全1数组。empty可以创建一个没有任何具体值的数组(当内存没有被清理时,数据将是之前的数据,要使用该数组,需要自己手动初始化)。

np.zeros((3, 6)) # 创建3行6列全为0的数组
np.ones((3,5))   # 创建3行5列全为1的数组
np.empty((2, 3, 2))   # 创建一个三维数组,其中的值没有任何意义
arr2 = np.ones_like(arr1) #生成一个结构跟arr1一样的矩阵,数据全为1
b = np.full((2,4), '=')  #生成一个2行4列,充填为=符号的矩阵
np.eye(5,5)生成对角线为1的5乘5,其他为0的矩阵
arr2[arr2 > arr1] #将arr2中arr2数大于arr1的数据筛选出来
arr = np.arange(10) #生成0-9的一维矩阵

np.empty返回的都是一些未初始化的垃圾值。
np.ones_like(arr1)生成一个结构跟arr1一样的矩阵,数据全为1。
np.full((2,4), '==') 生成一个2行4列,充填为==符号的矩阵
np.eye(5,5)生成对角线为1的5乘5,其他为0的矩阵
arr2[arr2 > arr1] 将arr2中arr2数大于arr1的数据筛选出来(逻辑为真的筛选出来)
在用两个矩阵查询数据时,可以用一个等长的其他矩阵作判断条件,然后得出一个等长的true、false矩阵,将该布尔矩阵作为另一个矩阵的查询对象,则可以筛选出true对应的矩阵。如arr2(arr1 == '李白')将筛选出arr1中跟李白同行的数据(必须两个矩阵等长)。

3.2ndarray的数据类型

给矩阵设置数据类型dtype

arr1 = np.array([1, 2, 3], dtype=np.float64)

给矩阵转换数据类型astype

arr = np.array([1, 2, 3, 4, 5])
float_arr = arr.astype(np.float64)

将浮点数转换成整数,则⼩数部分将会被截取删除;调⽤astype总会创建一个新的数组(一个数据的备份)。

3.3numpy数组的运算

不⽤编写循环即可对数据执⾏批量运算。NumPy⽤户称其为⽮量化(vectorization)。⼤⼩相等的数组之间的任何算术运算都会将运算应⽤到元素级。
数组与标量的算术运算会将标量值传播到各个元素;⼤⼩相同的数组之间的⽐较会⽣成布尔值数组。

arr = np.array([[1., 2., 3.], [4., 5., 6.]])
arr * arr 
arr - arr 
1 / arr 
arr * 0.5

3.4数组的索引和切片

3.4.1索引

一维数组的索引和切片跟列表的索引及切片相似。

arr = np.arange(10) # 生成0-9的数组
arr[5] 
arr_slice =arr[5:8] 
arr_slice[:] = 64 #对arr_slice进行全切片并全部修改为64,arr中的6-9也会变为64
arr[5:8] = 12 #对arr的6-9个数进行切片并赋值为12,arr数组值第6-9也会变成12

arr[5:8] = 12 #对arr的6-9个数进行切片并赋值为12,arr数组值第6-9也会变成12,对切片生成的新的数组中的数据进行修改,也将会同样影响到其之前在之前的数组中的值作修改。
ndarray切⽚的一份副本⽽⾮视图,就需要明确地进⾏复制操作,例如arr[5:8].copy()。ndarray中的复制都是深拷贝,而切片都是浅拷贝。
多维数组中,如果省略了后⾯的索引,则返回对象会是一个维度低一点的ndarray。标量值和数组都可以被赋值给arr3d[0]

arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
old_values = arr3d[0].copy() # 即[[1, 2, 3], [4, 5, 6]]
arr3d[0] = 42 # 即arr3d[0]全置为42
arr3d[0] = old_values #arr3d[0]又重新赋值为原来的二维数组

3.4.2切片

array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])
arr2d[:2]  # [[1, 2, 3],[4, 5, 6]]
arr2d[:2, 1:] #[[2, 3],[5, 6]] 逗号前表示对行切片,逗号后表示对切后的片的列进行切片
arr[[1, 5, 7, 2], [0, 3, 1, 2]]
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]] 
arr = np.arange(32).reshape((8, 4))
arr.T #矩阵转置

arr2d[:2, 1:] 结果为[[2, 3],[5, 6]] 逗号前表示对行切片,逗号后表示对行切好后的片的列进行切片。
arr2d[1, :2] 表示选取第二行的前两列;arr2d[:2, 2] 选取第三列的前两行
只有冒号表示对整个进行切片
arr2d[:, :1] 结果为 [[1], [4], [7]];arr2d[:2, 1:] = 0将前两行第二列及其后的数据都置为0.
arr[[1, 5, 7, 2], [0, 3, 1, 2]] 前面为取的行的行号,后面列表是取列的列号,前后两个列表数值需一对应
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]] 前面为取行的行号,后面为取列的全切片及每一列的数据重新排布
arr = np.arange(32).reshape((8, 4)) 生成8行4列,元素从0-31
arr.T矩阵转置

3.4.3布尔型索引

假设我们有一个⽤于存储数据的数组以及一个存储姓名的数组(含有重项)

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
data[names == 'Bob'] # 将筛选出data中的第1行、第4行的数据(与names数组对应)
data[names == 'Bob', 2:]  # 对筛选出为bob的数据进行切片
data[names == 'Bob', 3]  # 对筛选出为bob的数据取等4列

要选择除”bob”以外的其他值,既可以使⽤不等于符号(!=),也可以通过~对条件进⾏否定。
data[~(names == 'Bob')]
data[names != 'Bob'] # 选出不为bob的数据
mask = (names == 'Bob') | (names == 'Will')
data[mask] # 选出为bob或者will的数据
data[data < 0] = 0 # 将data中小于0的数据全部置为0
mask = (names == 'Bob') | (names == 'Will') ‘|’表或者

3.5花式索引

花式索引指利用整数数组进行索引
为了以特定顺序选取⾏⼦集,只需传⼊一个⽤于指定顺序的整数列表或ndarray即可;使⽤负数索引将会从末尾开始选取⾏

arr = np.empty((4, 3))
for i in range(4):
    arr[i] = i #[[ 0.,  0.,  0.],  [ 1.,  1.,  1.], [ 2.,  2.,  2.],[ 3.,  3.,  3.]]    
arr[[3, 0, 1]] #[[ 3.,  3.,  3.],[ 0.,  0.,  0.], [ 1.,  1.,  1.] ] 
arr[[-2, -3, -1]] #[[2.,  2.,  2.],[ 1.,  1.,  1.], [ 3.,  3.,  3.] ] 

一次传⼊多个索引数组会有一点特别。它返回的是一个一维数组,其中的元素对应各个索引元组;

arr = np.arange(12).reshape((4, 3))
# arr=[[ 0., 1.,  2.],  [3.,  4.,  5.], [ 6.,  7.,  8.],[ 9.,  10.,  11.]]
# 选取的是(1,0),(2,2),(3,1),(0,2)
arr[[1, 2, 3, 0], [0, 2, 1, 2]]  #[3,8,10,2]
#arr=[[3,5,4],[6,8,7],[9,11,10],[0,2,1]]
arr[[1, 2, 3, 0]][:, [0, 2, 1]] 

3.6数组转置和轴对称

转置是重塑的一种特殊形式,它返回的是源数据的视图,即行变列,列变行。
arr.T表示转置

3.7利用np.dot计算矩阵内积

arr = np.random.randn(6, 3)
np.dot(arr.T, arr) # 结果是一个3乘3的矩阵
np.dot(arr, arr.T) # 结果是一个6乘6的矩阵

对于高维数组,transpose需要得到一个由轴编号组成的元组才能对这些轴进⾏转置。

arr = np.arange(16).reshape((2, 2, 4))
arr.transpose((1, 0, 2)) 
arr.swapaxes(1, 2) 

3.8通用函数(ufunc)

通⽤函数(ufunc):快速的元素级数组函数

arr = np.arange(10)
np.sqrt(arr)  # 对数组每个元素开方
np.exp(arr)  # 对e进行数组中数据的n次方

add或maximum接受2个数组(因此也叫⼆元(binary)ufunc),并返回一个结果数组

x = np.random.randn(8)
y = np.random.randn(8)
np.maximum(x, y) 

maximum(x, y) 返回x和y中最大的一个数,结果为一个与x或者y等长的数组
add(x,y)对x和y求和

arr = np.random.randn(7) * 5
remainder, whole_part = np.modf(arr)

remainder, whole_part = np.modf(arr)分别将arr的小数部分和整数部分赋值给 remainder, whole_part,使之各生成两个数组。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容