pythob数据分析之函数

1.numpy

1.1 介绍

Numpy:Numerical python的简称。
Numpy系统是python的一种开源的数值计算框架,这种工具可用来存储和处理大型矩阵,相当于python边成一种免费的更强大的MatLab系统

1.2 安装

pip install numpy
官方文档:
https://numpy.org/doc/stable/user/quickstart.html

1.3 具体使用

import numpy as np
# 1. 基本用法
# 创建数组array
# 一维数组
data1 = [1, 2, 8, 6]
data1_arr = np.array(data1)
print(data1_arr.ndim)
print(data1_arr.itemsize)
print(data1_arr)  # [1 2 8 6]
print(type(data1_arr))  # <class 'numpy.ndarray'>
 
# 二维数组
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
data2_arr = np.array(data2)
print(data2_arr)
# 数组维度
print(data2_arr.ndim)
# 一个一维数组的元素个数
print(data2_arr.itemsize)
# 数组中的所有元素个数
print(data2_arr.size)
"""
[[1 2 3 4]
 [5 6 7 8]]
"""
 
# dtype数据类型
print(data2_arr.dtype)  # int32
# shape属性
print(data2_arr.shape)  # (2, 4):2行4列的数组
 
# 指定数据类型创建数组
arr3 = np.array(data2, dtype=np.int64)
print(arr3.dtype)  # int64
 
# 创建浮点类型数组
data4 = [6, 1.5, 8, 9.6]
data4_arr = np.array(data4)
print(data4_arr.dtype)  # float64
 
# 创建复数数组
c = np.array([ [1, 0 + 2j], [3, 1 + 4j] ], dtype=complex)
print(c)
# 转换数据类型
arr5 = data4_arr.astype(np.int64)
print(arr5)  # [6 1 8 9]
print(arr5.dtype)  # int64
 
# ones生成全为1的数组
arr6 = np.ones(10)
print(arr6)  # [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
print(np.ones((4, 5)))
"""
[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
"""
# zeros生成全为0的数组
arr7 = np.zeros(10) 
print(arr7)  # [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
print(np.zeros((2, 3)))
"""
[[0. 0. 0.]
 [0. 0. 0.]]
"""
 
# 数组与标量之间的运算
# 对数组元素进行运算
# 特性:大小相等的数组之间的任何运算都会应用到元素级
# 使得我们不用编写循环即可对数组中的元素执行批量运算
 
nd = np.array([1, 2, 3, 4])
print(nd * 2)  # [2 4 6 8]
print(nd * nd)  # [ 1  4  9 16]
print(nd ** 2)  # [ 1  4  9 16]
print(nd + 1)  # [2 3 4 5]
print(nd - 1)  # [0 1 2 3]
print(nd / 2)  # [0.5 1.  1.5 2. ]
print(nd + nd)  # [2 4 6 8]
# 取倒数
print(1 / nd)  # [1.         0.5        0.33333333 0.25      ]
 
# 2. 基本的索引和切片
# arage: 相当于range函数的数组版
print(np.arange(5))  # [0 1 2 3 4]
nd1 = np.arange(1, 20, 2) 
print(nd1)  # [ 1  3  5  7  9 11 13 15 17 19]
# 通过索引获取元素
# 一维
print(nd1[1])  # 3
print(nd1[2:5])  # [5 7 9]
# 二维
nd2 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(nd2[1, 1])  # 6,第一行,第一列 (从0开始)
print(nd2[1])  # [5,6,7,8]
print(nd2[:1])  # [[1 2 3 4]]
# 通过索引赋值
# 一维
nd1[2:5] = 10
print(nd1)  # [ 1  3 10 10 10 11 13 15 17 19]
# 多维
nd2[1] = 10
print(nd2)
"""
[[ 1  2  3  4]
 [10 10 10 10]]
"""
nd2[0][1:3] = 5
print(nd2)
"""
[[ 1  5  5  4]
 [10 10 10 10]]
"""
# 3. 花式索引
# 指的是利用整数数据进行索引
# reshape
nd = np.arange(12)
print(nd)  # [ 0  1  2  3  4  5  6  7  8  9 10 11]
nd1 = np.reshape(nd, (3, 4))  # 将一维数据变为二维数组:3行4列
print(nd1)
"""
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
"""
#ravel:恢复一维数组
print(123456)
print(nd1.ravel())  #
#转置矩阵
print(nd1.T)
"""
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
"""
 
# 选取特定的行子集    #花式索引,传入一个数组进行索引
print(nd1[[0, 2]])  # 得到第一行和第三行
"""
[[ 0  1  2  3]
 [ 8  9 10 11]]
"""
print(nd1[[0, 2][1]])  # [ 8  9 10 11]
 
# 选取多行,多列交叉处元素(类比坐标)
print(nd1[[0, 2, 1], [1, 1, 2]])  # [1 9 6]
"""
(0,1)---1
(2,1)---9
(1,2)---6
"""
# 选取矩形区域的两种方法
"""
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
"""
# 1.
print(nd1[[0, 1]][:, [1, 2]])
"""
[[1 2]
 [5 6]]
"""
# 2. np.ix_
print(nd1[np.ix_([0, 1], [1, 2])])
"""
[[1 2]
 [5 6]]
"""
 
# 4.通用函数
# nfunc(universal functions)是一种对ndarray中的数据执行元素级别运算的函数,如sqrt,exp
# sqrt开根号
nd = np.arange(9)
nd1 = nd ** 2
print(nd1)  # [ 0  1  4  9 16 25 36 49 64]
print(np.sqrt(nd1))  # [0. 1. 2. 3. 4. 5. 6. 7. 8.]

#exp:自然常数e为底的指数函数
print(np.exp(np.array([1,2])))  #[2.71828183 7.3890561 ]

# add:相加
a = np.arange(3)  # 0,1,2
b = np.array([1, -1, 2])
c = np.add(a, b)
print(c)  # [1 0 4]
 
# maximum:比较对应元素,取最大值
print(np.maximum(a, b))  # [1 1 2]


#vstack:按照垂直方向堆栈数组
a = np.array([[0,1],[2,3]])
b = np.array([[4,5],[6,7]])
print(np.vstack((a,b)))
"""
[[0 1]
 [2 3]
 [4 5]
 [6 7]]
"""
#hstack:按照水平方向堆栈数组
print(np.hstack((a,b)))
"""
[[0 1 4 5]
 [2 3 6 7]]
"""
 
# 5.常用的数学和统计方法
# 一维
# 生成随机数组
nd = np.random.randn(9)
print(nd)  # [ 0.57073301 -0.69598833 -0.20702626 -0.86582638 -0.09858326  0.08781526 0.25506694  1.58026149  0.35448699]
# max最大值
print(np.max(nd))  # 1.5802614926823562
# 最小值
print(np.min(nd))  # -1.4584447066232877
# 求均值
print(np.mean(nd))
# 求和
print(np.sum(nd))
# 排序
print(np.sort(nd))
 
# 二维
# nd = np.random.randn(5,3)
# print(nd)
arr = np.array([[1, 5, 0, 3], [5, 8, 12, 9], [0, 0, -9, 55]])
print(np.max(arr))  # 55
print(np.sort(arr))  # 每行按照升序排列
"""
[[ 0  1  3  5]
 [ 5  8  9 12]
 [-9  0  0 55]]
"""
print(np.sort(arr, axis=0))  # 按照列排序
"""
[[ 0  0 -9  3]
 [ 1  5  0  9]
 [ 5  8 12 55]]
"""
 
# linspace等分区间
arr = np.linspace(0, 10, 2)
print(arr)  # [ 0. 10.]
arr = np.linspace(0, 10, 3)
print(arr)  # [ 0.  5. 10.]
# 生成0~10之间均匀分布的11个数
arr = np.linspace(0, 10, 11)
print(arr)  # [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
 
# 计算
print("***")
a = np.arange(1,25, 2).reshape(3,4)
c = np.arange(5,17).reshape(3,4)
b = a > 4
print(b)
"""
[[False False False False]
 [False  True  True  True]
 [ True  True  True  True]]
 """
#所有超过4的元素都改为0
a[b] = 0
print(a)
 
#对应元素比较
print(a>c)
"""
[[False False False False]
 [False  True  True  True]
 [ True  True  True  True]]
"""
# 线性代数
# 矩阵乘法 dot
a = np.array([[1, 2, 3], [4, 5, 6]])  # 2*3
print(a)
"""
[[1 2 3]
 [4 5 6]]
"""
b = np.array([[0, 1], [2, 3], [-1, 6]])  # 3*2
print(b)
"""
[[ 0  1]
 [ 2  3]
 [-1  6]]
"""
print(a.dot(b))
"""
[[ 1 25]
 [ 4 55]]
"""
d1 = 1 * 0 + 2 * 2 + 3 * -1
d2 = 1 * 1 + 2 * 3 + 3 * 6
d3 = 4 * 0 + 5 * 2 + 6 * -1
d4 = 4 * 1 + 5 * 3 + 6 * 6
print(d1)
print()
 
# 矩阵求逆:inv
from numpy.linalg import inv
a = np.array([[4, 2], [3, 1]])  # 2*3
print(a)
"""
[[1 2 3]
 [4 5 6]]
"""
b = inv(a)
print(b)
"""
[[-0.5  1. ]
 [ 1.5 -2. ]]
"""
 
# cumsum:累计求和
b = np.arange(12).reshape(3,4)
print(b.cumsum(1))  #各行累计合计
"""
[[ 0  1  3  6]
 [ 4  9 15 22]
 [ 8 17 27 38]]
"""
print(b.cumsum(0))  #各列求和
"""
[[ 0  1  2  3]
 [ 4  6  8 10]
 [12 15 18 21]]
 """
# 7.随机数的生成
from numpy import random
# normal
arr = random.normal(size=(4, 4))
print(arr)
"""
[[-0.6731776  -0.77674242  0.15674769  0.65875012]
 [ 0.47656572  0.7074826  -0.59584356 -0.10902432]
 [-0.18324892 -0.93819386 -0.16716246  1.84150379]
 [-1.53836002  0.95684367  1.44417437 -2.43975145]]
"""
# randint给帝国上下限范围内的随机选取整数
arr = random.randint(0, 8)
print(arr)


2. pandas

import numpy as np
import pandas as pd
from pandas import Series

#pandas数据结构
#创建Series序列
s1 = Series([4,7,-5,3])
print(s1)   #前面是索引,后面为值
"""
0    4
1    7
2   -5
3    3
dtype: int64
"""
#获取index
print(s1.index)     #RangeIndex(start=0, stop=4, step=1)

#获取values
print(s1.values)    #[ 4  7 -5  3]

#指定index
s2 = Series([4,7,-5,3], index=["3月1日","3月2日","3月3日","3月4日"])
print(s2)
"""
3月1日    4
3月2日    7
3月3日   -5
3月4日    3
dtype: int64
"""
#通过索引获取值
print(s2["3月2日"])   #7

#通过条件筛选
print(s2[s2>0])
"""
3月1日    4
3月2日    7
3月4日    3
dtype: int64
"""

#in
print("3月2日" in s2) #True

#通过字典创建Series
dict1 = {"user1":4,
         "user2":7,
         "user3":-5,
         "user4":3}
s3 = Series(dict1)
print(s3)
"""
user1    4
user2    7
user3   -5
user4    3
dtype: int64
"""

#DataFrame 数据框架
from pandas import DataFrame
#创建数据框
positions = ["产品经理","数据分析师","UI","产品经理"]
companys = ["百度","三星","腾讯","华为"]

df = DataFrame([positions,companys])
print(df)
"""
    0      1       2         3
0  产品经理      数据分析师      UI      产品经理
1    百度         三星                  腾讯                华为
"""
#转置
job_info = DataFrame([positions,companys]).T
print(job_info)
"""
    0       1
0   产品经理          百度
1  数据分析师      三星
2     UI    腾讯
3   产品经理          华 为
"""

# 设置列名
job_info.columns = ["职位","公司"]
print(job_info)

#设置序号
job_info.index = ["a","b","c","d"]
print(job_info)

#重置index
job_info.reset_index(drop=True)
print(job_info)

#展示数据条数
print(job_info.head(2))

#tail显示后面几条数据
print(job_info.tail(2))

#获取某列的值
print(job_info["职位"])
print(job_info.职位)

#获取某行的值(索引名)
print(job_info.loc["c"])
#获取某行的值(索引序号)
print(job_info.iloc[2])

#返回固定频率的日期索引
dates = pd.date_range('20201101', periods=6)
print(dates)
print(dates[0])

df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)
"""
                   A         B         C         D
2020-11-01  0.511831  1.902508 -0.601631 -1.275379
2020-11-02  0.081817 -0.734119  1.201803  0.148207
2020-11-03 -0.746071  0.550262 -0.035730 -1.275730
2020-11-04  2.014247  0.066116  0.581703  0.361273
2020-11-05  0.131509  0.122587  1.049349 -0.761779
2020-11-06  0.395198 -0.587009  0.216365 -0.853146
"""

#常用方法
data = np.arange(16).reshape((4,4))
print(data)
df = DataFrame(data=data,index=['a','b','c','d'], columns=list('ABCD'))
print(df)
"""
    A   B   C   D
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11
d  12  13  14  15
"""
#删除指定轴上的项
df1 = df.drop('b')  #删除索引是b的行
print(df1)
"""
    A   B   C   D
a   0   1   2   3
c   8   9  10  11
d  12  13  14  15
"""
df1 = df.drop('C', axis=1)  #删除索引是C的列,axis=1b=表示按列执行
print(df1)
"""
    A   B   D
a   0   1   3
b   4   5   7
c   8   9  11
d  12  13  15
"""
#查找列D,值为11的行内容
print(df[df["D"]==11])
"""
   A  B   C   D
c  8  9  10  11
"""
print(df[df>5])
"""
      A     B     C     D
a   NaN   NaN   NaN   NaN
b   NaN   NaN   6.0   7.0
c   8.0   9.0  10.0  11.0
d  12.0  13.0  14.0  15.0
"""
df['E'] = [2,5,9,45]    #新增或修改列
print(df)
"""
    A   B   C   D   E
a   0   1   2   3   2
b   4   5   6   7   5
c   8   9  10  11   9
d  12  13  14  15  45
"""
#删除没有数值的数据NaN
print("****************")
df2 = df[df>9]
"""
      A     B     C     D     E
a   NaN   NaN   NaN   NaN   NaN
b   NaN   NaN   NaN   NaN   NaN
c   NaN   NaN  10.0  11.0   NaN
d  12.0  13.0  14.0  15.0  45.0
"""
print(df2.dropna(how='any'))
"""
      A     B     C     D     E
d  12.0  13.0  14.0  15.0  45.0
"""
#填充缺失的数据
print(df2.fillna(value=13))
"""
      A     B     C     D     E
a  13.0  13.0  13.0  13.0  13.0
b  13.0  13.0  13.0  13.0  13.0
c  13.0  13.0  10.0  11.0  13.0
d  12.0  13.0  14.0  15.0  45.0
"""

#判断数值是否为NaN
print(pd.isna(df2))
"""
       A      B      C      D      E
a   True   True   True   True   True
b   True   True   True   True   True
c   True   True  False  False   True
d  False  False  False  False  False
"""
#唯一值,unique
obj = Series([1,2,2,5,6,3,5])
print(obj.unique())     #[1 2 5 6 3]

#频率统计。value_counts
print(obj.value_counts())   #按照品=频率降序排列,如果不做排序,obj.value_counts(sort=False)
"""
5    2
2    2
6    1
3    1
1    1
dtype: int64
"""

#获取指定内容
print(df["A"])
"""
a     0
b     4
c     8
d    12
Name: A, dtype: int32
"""
#根据索引序号切片获取行
print(df[0:3])
"""
   A  B   C   D
a  0  1   2   3
b  4  5   6   7
c  8  9  10  11
"""

#根据索引切片获取行
print(df["b":"c"])
"""
   A  B   C   D
b  4  5   6   7
c  8  9  10  11
"""


#常用的数学和统计函数
#describe:一些数据的统计量
print(df.describe())
"""
               A          B          C          D
count   4.000000   4.000000   4.000000   4.000000
mean    6.000000   7.000000   8.000000   9.000000
std     5.163978   5.163978   5.163978   5.163978
min     0.000000   1.000000   2.000000   3.000000
25%     3.000000   4.000000   5.000000   6.000000
50%     6.000000   7.000000   8.000000   9.000000
75%     9.000000  10.000000  11.000000  12.000000
max    12.000000  13.000000  14.000000  15.000000
"""
#求和,sum,每列求和
print(df.sum())     #添加参数axis=1,每列求和
"""
A    24
B    28
C    32
D    36
dtype: int64
"""
#均值,mean
print(df.mean())
"""
A    6.0
B    7.0
C    8.0
D    9.0
dtype: float64
"""
#累计求和, cumsum
print(df.cumsum())  #每一列累计求和
"""
    A   B   C   D
a   0   1   2   3
b   4   6   8  10
c  12  15  18  21
d  24  28  32  36
"""

#最值
print(df.max()) #每列最大值
"""
A    12
B    13
C    14
D    15
dtype: int32
"""
#非数值的信息描述
positions = ["产品经理","数据分析师","UI","产品经理"]
companys = ["百度","三星","腾讯","华为"]

df = DataFrame([positions,companys])
print(df.describe())
"""
           0      1   2     3
count      2      2   2     2
unique     2      2   2     2
top     产品经理  数据分析师  UI  产品经理
freq       1      1   1     1        #频率
"""
#to_numpy,将Dataframe转换为一个小阵列。
data = df.to_numpy()
print(data)     
"""
[['产品经理' '数据分析师' 'UI' '产品经理']
 ['百度' '三星' '腾讯' '华为']]
"""

#按照某列排序
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)
"""                A         B         C         D
2020-11-01  0.511831  1.902508 -0.601631 -1.275379
2020-11-02  0.081817 -0.734119  1.201803  0.148207
2020-11-03 -0.746071  0.550262 -0.035730 -1.275730
2020-11-04  2.014247  0.066116  0.581703  0.361273
2020-11-05  0.131509  0.122587  1.049349 -0.761779
2020-11-06  0.395198 -0.587009  0.216365 -0.853146
"""
print(df.sort_values(by='B'))
"""
                   A         B         C         D
2020-11-02 -0.299943 -0.627584  0.417651 -0.006916
2020-11-06 -0.583363 -0.056184  1.941390  1.350911
2020-11-04 -0.486949  0.160367  1.178660 -0.572378
2020-11-03  0.449339  0.772650 -0.106306 -0.964246
2020-11-05 -1.358415  1.033476 -0.218945 -1.207231
2020-11-01  1.818069  1.197937  1.800319 -0.017046
"""
print(df.sort_index(axis=1, ascending=False))


#合并
df1 = DataFrame(np.random.randn(2, 4))
df2 = DataFrame(np.random.randn(3, 4))
print(pd.merge(df1,df2))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值