Python数据分析方法
本文主要介绍Python中的Numpy库在数据分析中的用法,知识是不断积累的过程,未完待续。
导入相关库
一般在进行数据分析之前,可以先导入相关库,导入数据之后再进行数据分析。通常情况下可以导入如下的库:
import numpy as np
import pandas as pd
import os
os.chdir(r'/Python/数据分析四大库')#指定路径
import xlrd#excel数据的库
np.set_printoptions(suppress=True)#将科学计数法转化为小数
np.set_printoptions(precision=2)#保留2位小数
np.random.seed(12345)
import matplotlib.pyplot as plt
plt.rc('figure', figsize=(10, 6))
np.set_printoptions(precision=4, suppress=True)
Python读取数据文件
.txt格式
第一种:
f=open(r'./data/APP.txt',encoding='utf-8')
f_read=f.readlines()#读为列表形式
data=[]
for line in f_read[1:]:
line=line.split('\t')
line=[i.strip('\n') for i in line]
data.append(line)
第二种:
f=open(r'./data/APP.txt',encoding='utf-8')
data=[]
n=0
while n<1000:#只看前1000行
line=f_readline()
line=line.split('\t')
line=[i.strip('\n') for i in line]
data.append(line)
n+=1
f.close()#关闭数据
第三种:读成列表/字符串
f=open(r'./data/APP.txt',encoding='utf-8')
f_read=f.read()#全读为字符串
f_read=f.readlines()#全读为列表
.csv格式
第一种:
import csv
fields=[]
data=[]
f=open(r'./data/农户信息.csv','r',encoding='gbk')#'r'就是读数据,'w'是写数据
csvread=csv.reader(f,delimiter=',')
fields=csvread._next_()#表头
for row in csvread:
data.append(row)
.json格式
第一种:
import json
with open(r'./data/sample.json',encoding='utf-8') as f:
f_read=f.read()#读为字符串,且只能用.read
data=json.loads(f_read)
第二种:
f=open(r'./data/sample2.json',encoding='utf-8')
f_read=f.read()
data=json.loads(f_read)
data.keys()
导出数据
with open(r'./data/shuju.json','w') as f:#'w'写数据
json.dump(data1,f,indent=2,ensure_ascii=False)
#indent=2每一层级间有2个空格,ensure_ascii=False正常显示中文
Numpy数组
np.pi
π
\pi
π
np.e
e
e
e
arr.shape几行几列
arr.ndim维数
arr.size元素个数
arr[::-1]反过来排列
arr.dtypefloat/int
将因变量化为{0,1}np.where(amount[:,1]>10000,1,0)#超过¥10000是1,否则为0
arr[np.where(arr>30)]取出大于30的值
arr.round(4)保留4位小数
改变数组格式/形状
data2=((8,6,4,2,0.7),(1.5,3,5,7,9),(3,4,6,3,9),(11,13,15,17,19))
arr=np.array(data2)
arr_t[np.newaxis,:]增加一个维度,变[[]]
arr_t[:,np.newaxis]增加一个维度,按列展示
arr.squeeze()变回一维数组
amount=amount.astype('float')转化为浮点型
arr=np.array([1,2,3],dtype=np.float32)转化为浮点型
np.tile(arr,(4,4))按行列方向复制4次
np.sort(arr)排序
arr=np.arrage(10)
arr1=arr[np.newaxis,:]
arr1.shape=(1,10)
arr2=arr[:,np.newaxis]
arr2.shape=(10,1)
arr3=arr2.squeeze()#变回一维数组
arr3.shape=(10,)
arr4=np.array([[0,1],[2,3,]])
np.tile(arr4,(4,4))#按行列方向复制4次
np.tile(arr4,(4,3))#按行复制4次,列复制3次
ravel&flatten&reshape
arr.reshape(10,2)10行2列,但不改变原数组
arr.resize(10,2)改变原数组
arr.shape=(10,2)改变原数组
arr.ravel()展平为一维数组,按行展平
arr.ravel(order='F')按列进行展平
arr.flatten()
arr.flatten(order='F')
arr.reshape(-1)一维数组
arr.reshape(1,-1)展开成一行,成二维数组
arr.reshape(-1,1)展开成一列,成二维数组
arr.flatten()[1]=200返回的是copy,不改变原数组
arr.ravel()[1]=200改变原数组
运算
不要写成list结构运算,如array=[1,2,3,4,5],array+1(×)
arr=np.array([1,2,3,4,5])
arr2=arr+1
arr2+arr
arr2*arr#对应位置变量相乘
np.dot(x,y)#矩阵乘积,向量内积
二维数组
np.sum(arr,axis=0)
arr.prod(axis=1)
arr.min(axis=1)
一维数组arr1=np.array([1,2,3],dtype=float)
切片
arr[0]
arr.shape#几行几列
arr[1:3]#左闭右开
arr[-2:]
arr[-1]#最后一个
arr[::-1]#反过来排列
.copy与赋值:
arr_change=arrarr_change改变,原来数组也跟着改变;arr_fix=arr.copy()arr_fix改变,原来数组不改变。
二维数组
arr2=np.array([[1,2,3,4],[5,6,7,8]])
data2=((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),(3.2,4.5,6,3,9),(11.2,13.4,15.6,17.8,19))
arr2=np.array(data2)
arr2[2]#第3行
arr2[:,2]#第3列
arr2[2][1]=arr2[2,1]#第3行第2列的元素
arr2[1:3]#第2行到第3行
arr2[1:,2:]#第2行至最后一行,第3列至最后一列
索引
arr2[arr2>3.5]输出大于3.5的值
arr2[-(arr2>3.5)]输出小于3.5的值
arr2[(arr2>3)&(arr2<6)]&且,返回大于3小于6的值
arr2[(arr2>3)|(arr2<6)]|或,返回大于3或小于6的值
arr2[[1,0,3,2]]按指定顺序返回数组,第2,1,4,3行
arr2[[3,2]]返回第4,3行
arr2[[3,2],[0,1]]返回(3,0),(2,1)上的元素
arr2[:,[3,1]]返回第4,2列
arr2[:,2]返回第3列
arr2[:,[2]]以列的形式返回第3列
arr2[np.ix_([0,1],[0,1,3])]=arr2[[0,1]][:[0,1,3]]
逻辑索引
unique()唯一性索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
np.unique(names)
统计计算
np.percentile(data,50)中位数
np.sqrt(arr)开根号
np.exp(arr)指数
remainder, whole_part = np.modf(arr)modf返回浮点数的小数部分和整数部分
np.percentile(data[:,0],50)#中位数
np.percentile(data[:,0],[0,10,25,50,75,90])
np.percentile(data,[0,10,25,50,75,90],axis=0)#axis=0改变行
np.ptp(data)#极差
np.ptp(data,axis=0)
np.sum(data>0.3)#data中大于0.3的个数
arr.sum(axis=0)# 求列和
arr.cumsum(axis=0)#累计求和
arr.cumprod()#累计求积
arr.mean()
arr.mean(axis=1)# 求行平均
arr.std()
arr.var()#方差
# 使用列表计算
sum([(i - arr_mean)**2 for i in arr])/len(arr)#方差
(sum([(i - arr_mean)**2 for i in arr])/len(arr))**0.5#标准差
矩阵计算
np.dot(arr.T, arr)
# 矩阵乘法,计算矩阵的内积
合并数组
np.hstack((arr1,arr2))=np.concatenate([arr1,arr2],axis=1)横向合并
np.vstack((arr1,arr3))=np.concatenate([arr1,arr3],axis=0)纵向合并
arr1=np.arange(12).reshape(3,4)
arr2=np.array([[8.5,6,1,2,0.7],[1.5,3,5,7,9],[3,2,4,3,9]])
#3行5列
np.hstack((arr1,arr2))=np.concatenate([arr1,arr2],axis=1)
#axis=1改变列
arr3=np.array([[8,6,4,0.9],[1,3,5,1],[3,4,6,7],[11,13,5,14]])
#4行4列
np.vstack((arr1,arr3))=np.concatenate([arr1,arr3],axis=0)
#axis=0改变行
特殊数组
np.arange(0,20,1)1是步长,左闭右开
np.linspace(1,10,11)创建一个等差数列,个数为11,两边1,10均可取
np.linspace(1,10,10,endpoint=False)左闭右开,不取10
np.zeros([4,5])4行5列的零矩阵
np.zeros(5)5个全为0的数组
np.ones([4,5])4行5列全为1的矩阵
np.eye(5)单位矩阵
np.diag([3,4])对角阵
(
3
0
0
4
)
\left(\begin{matrix}3&0\\0&4\end{matrix}\right)
(3004)
np.diag([3,4,8,9])对角线为3,4,8,9的对角矩阵
np.ones([2,3])*8=
(
8
8
8
8
8
8
)
\left(\begin{matrix}8&8&8\\8&8&8\end{matrix}\right)
(888888)
arr=np.array([1,2,3,4])
np.zeros_like(arr)[0,0,0,0]
np.ones_like(arr)[1,1,1,1]
np.random
np.random.rand(10)构建10个随机的值
np.random.rand(3,2)3行2列的0,1之间的随机数
np.random.randint(10,size=(5,4))5行4列的10以内的随机整数
np.random.randint(0,10,3)0到10区间内取3个随机数
mu,sigma=0,0.2
np.random.normal(mu,sigma,10)取10个
∼
N
(
0
,
0.2
)
\sim N(0,0.2)
∼N(0,0.2)的随机数
samples = np.random.normal(size=(4, 4))生成4x4的正态分布样本数组
np.random.shuffle(arr)洗牌打乱数据
np.random.seed(100)
随机漫步
import random
position = 0
walk = [position]
steps = 1000
for i in range(steps):
step = 1 if random.randint(0, 1) else -1
position += step
walk.append(position)
# 简单的随机漫步,从0开始,步进为1和-1,且两种步进发生的概率相等
字符串
np.char.lower(arr)全部转为小写
np.char.upper(arr)全部转化为大写
np.char.strip(data[:,1],'')删除前后空格
np.char.replace(data[:,6],',','')去除逗号
np.char.join([':','-'],['hello','world'])返回一个字符串,该字符串是给定序列中所有字符串的连接。即h:e:l:l:o,w-o-r-l-d
np.char.isdigit(data[:,1])判断字符串是不是全为数字
np.char.isalpha(data[:,1])判断字符串是不是全为字母
np.char.count(data[:,1],'1')计算1出现的次数
np.char.startswith(data[:,2],'zhu')判断字符串是不是’zhu’开头
np.char.endwith(data[:,1],'X')判断字符串是不是以’X’结尾

本文介绍了Python中Numpy库在数据分析中的应用,包括导入数据(txt,csv,json格式),数组操作如ravel,flatten,reshape,以及统计计算、矩阵运算、逻辑索引等内容,同时讲解了数据读取和导出的方法以及字符串处理功能。

被折叠的 条评论
为什么被折叠?



