补充
-
比较操作(条件判断里用)
== 等于 != 不等于 is 是相同对象 is not 是不同对象 关于
is
操作符-
is 与 == 区别:
is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
可以用来做 字符串 和 整数 的相等判断,但是不能用在 list 和 tuple 上,所以保险起见用
==
a = None b = None # True,因为None只有唯一实例 r = a is b a = "22" b = "22" # True,直接声明的相同字符串也会指向同一个实例 r = a is b a = [1] b = [1] # False,相等但不是同一个实例 r = a is b a = [1] b = a c = a # True,指向同一个实例 r = b is c a = 3 d = 6 b = 6 - 3 c = d - 3 e = 2 f = d - 4 print(a is b) #True print(a is c) #True print(a is e) #False print(a is f) #False
-
-
布尔操作
与 &
和and
或 ` 和
or`非 not
Numpy
NumPy 是一个 Python 包。 它代表 “Numeric Python”
我们用他来做线性代数有关的运算
- 使用 numpy 的函数,需要我们用
import
函数,将numpy
包装到我们的 python 文件里,通常我们命名为np
import numpy as np
-
我们一般用
numpy
的array
和matrix
类型作为向量区别 :
matrix 一定是二维的,array 可以是多维的 matrix 可以看做二维的 array array 可以作为行向量或者列向量 如果要确定向量的形状,用 matrix 构建向量 如果用了 matrix 或 array 构建向量就一直用,不要混用。
-
array 类型有许多有用的属性
-
array.ndim
array的维数,等于秩 -
array.shape
二维array中,表示数组的“行数”和“列数 -
array.size
:数组元素的总个数 -
array.dtype
:表示数组中元素类型的对象
-
-
array([a,b,c])
构建向量使用array函数创建时,参数必须是由括号(方的或圆的)括起来的列表,而不能使用多个数值作为参数调用array。
a = array(1,2,3,4) # 错误 a = array([1,2,3,4]) # 正确 a = array((1,2,3,4)) # 正确
-
可使用双重序列来表示二维的数组
b = np.array( [ [1.5,2,3], [4,5,6,7] ] )
-
用函数zeros可创建一个全是0的数组,用函数ones可创建一个全为1的数组,函数empty创建一个内容随机并且依赖与内存状态的数组
参数是元素为数组尺寸的 list
c = np.zeros((3,4)) d = np.ones((2,3)) e = np.empty((3,3))
还用
dtype
参数指定元素的类型np.ones( (2,3,4), dtype=int16 )
*
array 对应位置的元素相乘
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print ('a * b = \n', a * b)
-
np.dot()
同线性代数中矩阵乘法的定义,点乘(array 和 matrix 都是这个,最保险)a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) print ('np.dot(a, b) = \n', np.dot(a, b))
-
multiply()
matrix 对应位置的乘法*
matrix 点乘运算a = np.mat('1 2; 3 4') b = np.mat('5 6; 7 8'); print ('a * b = \n', a * b) print ('np.multiply(a, b) = \n', np.multiply(a, b))
-
.transpose()
转置运算a = np.array([[1, 2], [3, 4]]) print(a.transpose())
-
linspace()
在指定的间隔内返回均匀间隔的数字,numpy.linspace(start, stop, num, endpoint)
start
: 序列的起点stop
:序列的终点num
:生成的样本数endpoint
:可选项,如果是true
, 序列包括终点,如果是false
,序列不包括终点x = np.linspace(1, 5, 5) print(x)
Pandas
-
使用
pandas
的函数,需要我们用import
函数,将pandas
包装到我们的 python 文件里,通常我们命名为pd
import pandas as pd
我们用
pandas
的函数进行数据分析 -
读取文件
pandas.read_excel( 'XXX.xlsx' )
- 返回 dataframe 类型
- 如果是
csv
文件,用pandas.read_csv( 'XXX.csv' )
-
axis
axis = 0 匹配的是index, 涉及上下运算
axis = 1 匹配的是columns, 涉及左右运算
-
dataframe.head( n )
显示
dataframe
的前 n 行如果没有 n 输入 , 默认显示 dataframe 的前五行
-
dataframe.tail( n )
显示 dataframe 的后 n 行
如果没有 n 输入 , 默认显示 dataframe 的后五行
-
dataframe.info()
显示 dataframe 的基本数据:各列的名字,数量,数据类型,占内存大小
-
基本统计值
-
dataframe.describe()
显示 dataframe 的一些基本统计值
-
DataFrame.mean( axis = 0 )
axis
DataFrame.sum( axis = 0 , min_count = 0)
DataFrame.median( axis = 0)
-
-
数据修改
-
dataframe.T
转置函数
将行和列颠倒
-
dataframe.rename()
改名函数
给列改名
marketing.rename(columns={'Age':'Year'}, inplace=True)
-
Series
-
Series
就如同list一样,一系列数据,每个数据对应一个索引值Series
就是“竖起来”的 list: 和 list 一样元素可以是任意类型
-
Series
和Dataframe
的关系: Series 可以从 Dataframe 的 某一列提取出来catalogs = marketing['Catalogs'] marketing.loc['Catalogs']
或者用
iloc[]
截取出Dataframe
的某一列-
series.head()
- 返回系列前五行
-
series.nunique()
- 返回系列的唯一值的数量(出现了多少种不同的值)
-
series.value_counts()
- 返回每个唯一值对应的数据个数
Pyplot
-
matplotlib
包是 Python 的一个绘图库。它包含了大量的工具,可以使用这些工具创建各种图形,包括简单的散点图,正弦曲线,甚至是三维图形 , 类似于 MATLAB 里强大的画图能力matplotlib
名字来自于“ MATLAB plot library”我们用他的
matplotlib.pyplot
包来绘制我们最熟悉的直方图和曲线图 -
使用
pyplot
的函数,需要我们用import
函数,将 pyplot 包装到我们的 python 文件里,通常我们命名为plt
import matplotlib.pyplot as plt
-
画线形图(Line Plot)
plt.plot(x,y)
x 是 横坐标序列,y 是纵坐标序列
x,y 都需要是 list 类型
-
3.线条形状
plot方法的关键字参数linestyle(或ls)用来设置线的样式。
如plt.plot(x, y1, linestyle=':') 或 plt.plot(x, y1, ls=':')
可取值为:
- 实线(solid)
-- 短线(dashed)
-. 短点相间线(dashdot)
: 虚点线(dotted)
'', ' ', None
-
画柱状图
n, bins, patches = plt.hist( data, bins =7, color = 'r',alpha=0.5, density=True)
- data 是array数组或者序列数组(二维数组)
- bins 是共有多少个柱子
- alpha 选择透明度[0,1]
- 返回一个
tuple
类型- 第一个元素是每个柱子的值 组成的数组
- 第二个元素是每个柱子最右边值组成的数组
- 第三个元素用于多数据集输入
-
图像的文本处理
我们可以为图像添加文字注释包括
-
plt.xlabel('xxx')
为 X 轴命名 -
plt.ylabel('yyyy')
为 Y 轴命名 -
plt.title('zzzz')
图像命名,显示在图标最上方 -
plt.text(m, n, 'text',
在(m,n)坐标处添加文字 -
plt.grid(true)
添加网格 -
plt.xticks
设置x坐标轴刻度
-
-
画散点图
matplotlib.pyplot.scatter
(x,y,marker,c,alpha)- x,y 数据集
- marker: 散点的形状
- color: 颜色参数
# Task2
- Task2_1_1
- **Plot on the same figure by calling plt.hist() twice in a row**
在同一个图里绘制两个list的柱状图,在 `matplotlib.pyplot.hist( x )` 用包含两个这list 的 list 作为第一个参量
- **Specify a label for each histogram and use a legend**
hist 函数( 画柱状图函数 ) 的 label 变量赋值 ['xxxx','yyyy']
- **Specify a colour and transparency/alpha value for each in case they overlap**
alpha 可以改变每个柱状图的透明度(0 透明到1不透明)
color 可以改变颜色 代表不同颜色的标示符一共有八种:
| 标记符 | 颜色 |
| ------ | ---- |
| 'r' | 红 |
| 'g' | 绿 |
| 'b' | 蓝 |
| 'c' | 蓝绿 |
| 'm' | 紫红 |
| 'y' | 黄 |
| 'k' | 黑 |
| 'w' | 白 |
当然还有更多选择
```python
cnames = {
'aliceblue': '#F0F8FF',
'antiquewhite': '#FAEBD7',
'aqua': '#00FFFF',
'aquamarine': '#7FFFD4',
'azure': '#F0FFFF',
'beige': '#F5F5DC',
'bisque': '#FFE4C4',
'black': '#000000',
'blanchedalmond': '#FFEBCD',
'blue': '#0000FF',
'blueviolet': '#8A2BE2',
'brown': '#A52A2A',
'burlywood': '#DEB887',
'cadetblue': '#5F9EA0',
'chartreuse': '#7FFF00',
'chocolate': '#D2691E',
'coral': '#FF7F50',
'cornflowerblue': '#6495ED',
...
```
- Task2_1_2
- **For reference create a histogram or plot a probability density function of normal distribution**
画符合正态分布数据的直方图和**画正态分布函数**
- `numpy.random.randn(*d0*, *d1*, *...*, *dn*)`
生成符合均值0和方差1的单变量“正态”(高斯)分布的 list , `(*d0*, *d1*, *...*, *dn*)`指的是 list 的维数,例如:
```
np.random.randn(2, 4)
```
生成的就是两个 list ,每个 list 包含4个 float 类型数字
- 计算正态分布的概率密度函数
![概率分布函数公式](/Users/apple/Downloads/%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83%E5%87%BD%E6%95%B0%E5%85%AC%E5%BC%8F.png)
用`mean()`计算数据的**均值**`mean`
用`std()`计算**标准差**`std`
用函数完成计算概率密度函数
- 推荐用`matplotlib`库里的 `mlab.normpdf`函数计算
```python
import matplotlib.mlab as mlab
y = mlab.normpdf(x,mean,std)
```
- Task2_1_3
- **Standardise the Salary variable to make the comparison clearer (note that the x-axis values are different)**
**标准化数据**
一般指的是 Z-Score 标准化,去除均值和方差缩放
得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。
公式为:( mean 均值,std 标准差 )
$$
(X-mean)/std
$$
推荐用公式法
```python
xsalary_st = (xsalary-xsalary.mean())/xsalary.std()
```
或者使用`sklearn.preprocessing.scale()`函数,直接将数据标准化
```python
from sklearn import preprocessing
xsalary_scaled = preprocessing.scale(xsalary)
```
- **Is the Customer Salary Normally Distributed?**
**(Optional) Perform a normality test**
**判断是否满足正态分布**
目视法
直方图的柱子数足够多的话,可以观察图像是否是“钟形函数”
函数法
使用`scipy.stats.normaltest`函数 测量数据是否符合正态分布
```python
from scipy.stats import normaltest
normaltest(salary)
```
如果返回的 P 值大于0.05, 一般就认为符合正态分布
统计学里在差异性的比较中,大于0.05表示无差异,小于0.05表示有差异.大于0.05表明与正态分布无差异,故符合正态分布
- Task_2_2_1
- **Create the vector a=[2,−1,10]T**
**构建向量**
用 `np.array()` 或者`np.matrix()` 都可以
强调下`array` 和 `matrix`的区别:
```
matrix 一定是二维的,array 可以是多维的
array 可以作为行向量或者列向量
如果要确定向量的形状,用 matrix 构建向量
如果用了 matrix 或 array 构建向量就一直用,不要混用。
```
- **Calculate the transpose of a and store it in variable b:**
**向量的转置**
用 `np.transpose()` 函数
- **Calculate the sum of b by taking the dot product of b with a vector of all ones.**
**生成全一矩阵**
用`np.ones()` 函数
默认生成的矩阵元素都是 float 类型(有小数点),可以在调用函数时加上 `dtype = int` 变量,这样生成的矩阵元素都是整数
**矢量积(叉乘)**
用`np.dot(x,y)`函数,注意矢量积的顺序
```python
import numpy as np
a = np.matrix([[2,-1,10]]).transpose()
print(a)
b = a.transpose()
print(b)
ones = np.ones(a.shape)
b_sum = np.dot(b,ones)
print(b_sum)
```
- Task2_2_2
- **Create a matrix **
$$
\mathbf M = \left [ \begin{array}{ccc} 1 & -1 & 2 \\ 0 & -3 & 1 \end{array} \right]
$$
构建矩阵 `np.matrix()`
- **Sum the rows of M and then store the result along the diagonal of a square matrix**
**计算矩阵每行元素的和**
做法一(tutor):
M 与一个 3*2 的全一矩阵相乘,这样每一行上的值就是他们这一行的和;
用`np.diag()` 函数,将整个矩阵相乘的结果矩阵作为参数,取出一个 list 包含对角线上的两个值(分别是第一行之和,第二行之和);
再用`np.diag()`函数,将这个 list 作为参数,生成并打印矩阵,这个矩阵的对角线上的值就是 list 里的第一行之和,第二行之和
```python
import numpy as np
M = np.array(((1,-1,2),(0,-3,1)))
print(M)
ones = np.ones((3,2))
S = np.diag( np.dot(M,ones))
S = np.diag(S)
print(S)
```
做法二:嵌套循环(循环里还有个循环);
先计算第一行的元素和,存在 list `row_sum` 的第一个值里;
再计算第二行的元素和,存在 list `row_sum` 的第二个值里。
```python
import numpy as np
M = np.array(((1,-1,2),(0,-3,1)))
print(M)
sum = [.0,.0]
print(M.shape)
for x in range(M.shape[0]):
for y in range(M.shape[1]):
sum[x] += M[x,y]
S = np.diag(sum)
print(S)
```
做法三:做法二里的嵌套循环可以用 `sum` 函数代替
`M.sum(axis = 1)` 返回的是每行的和组成的 `list`
```
import numpy as np
M = np.array(((1,-1,2),(0,-3,1)))
print(M)
sum = [.0,.0]
for i in range(len(sum)):
sum[i] = float(M.sum(axis = 1)[i])
S = np.diag(sum)
print(S)
```
**构建对角阵**
用`np.diag()` 函数,传入一个 list 类型的对象
Challenges
Linspace
The linspace function takes a starting value, a stopping value and how many numbers you want to produce. The following will produce 11 numbers evenly spaced from 0 to 100.
在指定的间隔内返回均匀间隔的数字,linspace()函数
numpy.linspace(start, stop, num, endpoint)
start
: 序列的起点
stop
:序列的终点
num
:生成的样本数
endpoint
:可选项,如果是true
, 序列包括终点,如果是 false
,序列不包括终点
import numpy as np
start = int(input('Start: '))
stop = int(input('Stop: '))
n = int(input('N: '))
x = np.linspace(start, stop, n)
for i in range(len(x)):
print(x[i])
Matrix multiplication
Use Python to determine C, the matrix multiplication of matrix A and matrix B. Print the resultant matrix C.
生成矩阵和矩阵运算
import numpy as np
A = np.matrix([[2,0],[8,9],[5,8],[1,6]])
B = np.matrix([[7,9,1],[4,3,8]])
print(A*B)
Simple stats
计算数据中的最小值、最大值、平均值、和、标准差
获得元素最大值的函数:max
获得元素最小值的函数:min
获得整个矩阵、行或列的平均值 mean()
获取方差:var()
获取标准差:std()
获取中植:median()
求和:sum()
-
求值方向参数:axis
axis 不取值, 默认对整个矩阵求和
axis = 0,列方向求和
-
axis = 1,行方向求和
M = np.array([(1,-1,2),(0,-3,1)]) print(M) sum = M.sum #整个矩阵元素求和 sum_vol = M.sum(axis = 0) # 按列求和 sum_row = M.sum(axis = 1) # 按行求和
a = np.array(values)
print('Minimum:', a.min())
print('Maximum:', a.max())
print('Mean:', a.mean())
print('Sum:', a.sum())
print('Standard deviation', a.std())