目录
numpy模块
简介
#numpy模块:用来做数据分析,对numpy数组(既有行又有列)---矩阵进行科学运算
#TensorFlow/pytorch(数学专业/计科专业/物理专业/硕士及以上):用来做数据分析,对TensorFlow数组(既有行又有列还有层,三维以上)---张量进行科学运算
# gpu---图形显卡
lt1 = [1,2,3]
lt2 = [4,5,6]
lt = []
for i in range(len(lt1)):
lt.append(lt1[i]*lt2[i])
print(lt)
numpy中的一维和三维数组
import numpy as np #约定俗成的潮流
# #一维numpy数组---不考虑,可直接使用列表
# arr = np.array([1,2,3])
# print(type(arr),arr)
#三维numpy数组---不考虑,一般TensorFlow做三维数据处理
二维numpy数组的属性
import numpy as np
#创建二维numpy数组
arr = np.array([[1,2,3],[4,5,6]])
# print(arr)
#二维numpy数组的常用属性
#1. T---数组的转置(行列互换)
print(arr.T)
#2. dtype---数组元素的数据类型, numpy数组数据类型是属于python解释器的, 数组元素数据类型int32是属于numpy数组的
print(arr.dtype)
#3. size---数组元素的个数
print(arr.size)
#4. ndim---数组的维数
print(arr.ndim)
#5. shape---数组的维度大小,输出结果为元组,几行几列
print(arr.shape)
print(arr.shape[0]) #行数
print(arr.shape[1]) #列数
#6. astype---类型转换---numpy数组是可变数据类型
arr = arr.astype(np.float64)
print(arr)
二维numpy数组取值/修改值
import numpy as np
arr = np.array([[1,2,3],
[4,5,6]])
#numpy数组单个取值
print(arr[0,0])
#numpy数组切片
print(arr[0:2,-2:]) # 行,列---骨头不顾尾
#逻辑取值
print(arr[arr>2]) #输出结果为一维数组
#赋值
#1.单个元素赋值
arr[0,0] = 0
print(arr)
#2.整行赋值
arr[0:1,:] = 0
print(arr)
#3.整个二维数组赋值
arr[:,:] = 0
print(arr)
numpy数组的合并
import numpy as np
#数组的合并
arr1 = np.array([[1,2,3],
[4,5,6]])
arr2 = np.array([[55,66,77],
[11,22,33]])
print(np.hstack((arr1,arr2))) #水平合并,只能放元组
print(np.vstack((arr1,arr2))) #垂直平合并
print(np.concatenate((arr1,arr2),axis=1)) #合并数组,0表示行,1表示列,默认为0以行合并
通过函数创建numpy数组
import numpy as np
#通过函数创建numpy数组
print(np.ones((2,3)))
print(np.zeros((2,3)))
print(np.eye(3,3)) #创建3*3单位矩阵
print(np.linspace(0, 20, 5)) #构造一个等差数列,取头也取尾
print(np.arange(2,10)) #一维
#reshape
arr = np.zeros((1,12))
print(arr.reshape(4,3)) #重构数组行列数
numpy数组的运算
import numpy as np
#数组运算
print(np.ones((3,4))*4)
print(np.sin(arr1))
#点乘
arr1 = np.ones((6,5))*3
arr2 = np.ones((5,6))*4
print(np.dot(arr1,arr2))
#求逆
print(np.linalg.inv([[1,2,3],
[4,5,6],
[9,8,9]]))
numpy数组数学和统计方法
import numpy as np
#numpy数组数学和统计方法
arr1 = np.ones((6,5))*3
print(np.sum(arr1))
print(np.sum(arr1[0:1,:]))
numpy.random生成随机数
#numpy.random生成随机数---非常重要
print(np.random.rand(3,4)) #产生(0,1)之间均匀分布的维度大小为 "3*4" 的二维数组
print(np.random.randn(3,4)) #产生(0,1)之间标准正态分布的维度大小为 "3*4" 的二维数组
# np.random.seed(1) #随机数种子控制是否随机
print(np.random.random((3,4)))
s = np.random.RandomState(1) #等同于随机数种子
print(s.random((3,4)))
arr2 = np.array([[55,66,77],
[11,22,33]])
np.random.shuffle(arr2) #对数组随机洗牌
print(arr2)
print(np.random.choice([1,2,3,4,5],2)) #针对一维数组,随机选择
#针对某一范围随机指定维度大小的整数数组
print(np.random.randint(1,100,(4,5)))
matplotlib模块
画条形图
#matplotlib模块:画各种数据统计图
from matplotlib import pyplot as plt #约定俗成的潮流
from matplotlib.font_manager import FontProperties #导入修改字体模块
#一.条形图
font = FontProperties(fname='C:WindowsFontssimsun.ttc')
# 修改背景为条纹
plt.style.use('ggplot')
classes = ['3班','4班','5班','6班']
students = [50,55,45,60]
classes_index = range(len(classes))
plt.bar(classes_index,students,color='green')
plt.xticks(classes_index,classes,FontProperties=font)
plt.xlabel('班级',FontProperties=font)
plt.ylabel('学生人数',FontProperties=font)
plt.title('班级-学生人数条形图',FontProperties=font)
plt.show()
画直方图
#二.直方图
import numpy as np
from matplotlib import pyplot as plt #约定俗成的潮流
from matplotlib.font_manager import FontProperties #导入修改字体模块
plt.style.use('ggplot')
font = FontProperties(fname='C:WindowsFontssimsun.ttc')
x1 = np.random.randn(10000)
x2 = np.random.randn(10000)
fig = plt.figure() #生成一张画布
ax1 = fig.add_subplot(1,2,1) #1行两列去第一个
ax2 = fig.add_subplot(1,2,2) #1行两列去第二个
ax1.hist(x1,bins=50,color='purple')
ax2.hist(x2,bins=50,color='orange')
ax1.set_title('x1的正态分布',FontProperties=font) #加子标题
ax2.set_title('x2的正态分布',FontProperties=font) #加子标题
fig.suptitle('两个正态分布',FontProperties=font) #加总标题
plt.show()
画折线图
#三.折线图
import numpy as np
#叠加
arr = np.array([[1,2,3]])
print(arr.cumsum()) #每个数是前面所有数的叠加和
from matplotlib import pyplot as plt #约定俗成的潮流
from matplotlib.font_manager import FontProperties #导入修改字体模块
plt.style.use('ggplot')
font = FontProperties(fname='C:WindowsFontssimsun.ttc')
np.random.seed(1) #固定随机数种子使画出来的四条折线图不会每次运行都变化
x1 = np.random.randn(40).cumsum()
x2 = np.random.randn(40).cumsum()
x3 = np.random.randn(40).cumsum()
x4 = np.random.randn(40).cumsum()
plt.plot(x1,color='blue',linestyle='-',marker='o',label='蓝圆线') # "linestyle" 控制线条类型
plt.plot(x2,color='pink',linestyle='--',marker='x',label='粉虚线') # "marker" 控制主机形状,默认间隔为1
plt.plot(x3,color='green',linestyle='-.',marker='*',label='绿方线')
plt.plot(x4,color='purple',linestyle=':',marker='s',label='紫方线')
plt.legend(loc='best',prop=font)
plt.show()
画散点图+折线图
#四.散点图+折线图
import numpy as np
from matplotlib import pyplot as plt #约定俗成的潮流
from matplotlib.font_manager import FontProperties #导入修改字体模块
plt.style.use('ggplot')
font = FontProperties(fname='C:WindowsFontssimsun.ttc')
fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
x = np.arange(20)
y1 = x*2
y2 = x**2
ax1.scatter(x,y1,c='b',label='蓝散点')
ax1.plot(x,y2,c='r',label='红折线')
ax2.plot(x,y1,c='black',label='黑折线')
ax2.scatter(x,y2,c='green',label='绿散点')
ax1.legend(prop=font)
ax2.legend(prop=font)
ax1.set_title('散点折线图1',FontProperties=font)
ax2.set_title('散点折线图2',FontProperties=font)
fig.suptitle('两幅图',FontProperties=font)
plt.show()
pandas模块---重要
pandas模块的数据类型
#pandas模块:更多的是对excel/csv(类似于txt文件,占用空间小但是具有表格特征)文件处理,对numpy+xlrd模块作了一层封装
import pandas as pd #约定俗成的潮流
import numpy as np
#pandas的数据类型
#Series(现在一般不使用(一维))
df = pd.Series(np.array([1,2,3,4]))
print(df)
#DataFrame(多维)
#创建DataFrame数据结构
dates = pd.date_range('20190101',periods=6,freq='M')
print(dates)
np.random.seed(1)
values = np.random.rand(6,4)*10
print(values)
columns = ['c1','c2','c3','c4']
df = pd.DataFrame(values,index=dates,columns=columns)
print(df)
DataFrame数据结构的属性
import pandas as pd #约定俗成的潮流
import numpy as np
#创建DataFrame数据结构
dates = pd.date_range('20190101',periods=6,freq='M')
print(dates)
np.random.seed(1)
values = np.random.rand(6,4)*10
print(values)
columns = ['c1','c2','c3','c4']
df = pd.DataFrame(values,index=dates,columns=columns)
print(df)
#DataFrame数据结构的属性
print(df.dtypes) #获取数据类型---对象类型
print(df.index) #获取行标签
print(df.columns) #获取列标签
print(df.describe()) #查看数据每一列的极值,均值等
print(df.T) #转置
print(df.sort_values('c2')) #按照c2的值从小到大排序
print(df.sort_index(ascending=False)) #按行标签排序
DataFrame数据结构的取值/修改值
import pandas as pd #约定俗成的潮流
import numpy as np
#创建DataFrame数据结构
dates = pd.date_range('20190101',periods=6,freq='M')
print(dates)
np.random.seed(1)
values = np.random.rand(6,4)*10
print(values)
columns = ['c1','c2','c3','c4']
df = pd.DataFrame(values,index=dates,columns=columns)
print(df)
#DataFrame数据结构取值
print(df[['c1','c2']]) #按列标签取值
print(df.loc['2019-03-31':'2019-05-31']) #通过自定义标签取值
print(df[1:4]) #通过行标签取值
print(df.values[0,0]) #通过行列取出单个值
print(df.iloc[0,0])
print(df.iloc[:,0]) #通过切片取值,必须加 ".iloc"
print(df['c1']>4)
print(df[df['c1']>4]) #逻辑取值
df.iloc[0,0] = 1 #修改某个数值
print(df)
pandas操作表格
#pandas操作表格
test_data = '''
5.1,,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,,0.2
7.0,3.2,4.7,1.4
6.4,3.2,4.5,1.5
6.9,3.1,4.9,
'''
from io import StringIO
print(test_data)
test_data = StringIO(test_data) #把test_data读入内存,相当于变成文件
print(test_data)
df = pd.read_csv(test_data,header=None)
print(df)
#缺失值处理
print(df.dropna(axis=1)) #获取删除含有缺失值的列之后的结果
print(df.dropna(axis=0)) #获取删除含有缺失值的行之后的结果
print(df.dropna(thresh=4)) #获取删除行值个数小于4个的行之后的结果
#合并数据处理
df2 = pd.DataFrame(np.zeros((2,3)))
df3 = pd.DataFrame(np.ones((2,3)))
print(df2)
print(df3)
print(pd.concat((df2,df3))) #默认按行合并
print(pd.concat((df2,df3),axis=1)) #调整为按列合并
print(df2.append(df3,ignore_index=True)) #只能按行追加
#导入导出数据
df.index = ['nick','json','tank','egon','alex','蔡启龙']
df.to_csv('test18.csv')
pandas读取json文件
#pandas读取json文件
json_txt = '[{"ttery":"min","issue":"20130801-3391","code":"8,4,5,2,9","code1":"297734529","code2":null,"time":1013395466000},
{"ttery":"min","issue":"20130801-3390","code":"7,8,2,1,2","code1":"298058212","code2":null,"time":1013395406000},
{"ttery":"min","issue":"20130801-3389","code":"5,9,1,2,9","code1":"298329129","code2":null,"time":1013395346000},
{"ttery":"min","issue":"20130801-3388","code":"3,8,7,3,3","code1":"298588733","code2":null,"time":1013395286000},
{"ttery":"min","issue":"20130801-3387","code":"0,8,5,2,7","code1":"298818527","code2":null,"time":1013395226000}]'
print(pd.read_json(json_txt,orient='records')) #读取json文件,orient控制json文件需满足的格式
collections模块
有名元组
# collections模块: 提供更加复杂的数据类型
# 有名元组
from collections import namedtuple
point = namedtuple('point',['x','y'])
p = point(1,2)
print(p.x) #通过属性引用
print(p.y)
默认字典
#普通字典,取值时key不存在会报错
# dic = {'a':1}
# print(dic['b'])
# 默认字典
from collections import defaultdict
dic = defaultdict(lambda :'nan') # dic = {} # 如果找不到赋了一个默认值
dic['a'] = 1
print(dic['a'])
print(dic['c']) #取值时key不存在不报错,返回设定的默认值
双端队列
#普通列表,append只能末尾追加值,pop只能删除末尾值
# lis = [1,2,3] # 线性表
# lis.append(4)
# print(lis)
# 双端队列
from collections import deque # 链表
de = deque([1,2,3])
de.append(4)
print(de)
de.appendleft(0) #在最左端加值
print(de)
de.popleft()
de.popleft() #删除最左端的值
print(de)
计数器
s= 'programming'
#正常使用多行代码统计字符串s中每个字符出现次数
# dic = {}
# for i in s:
# if i in dic:
# dic[i]+=1
# else:
# dic[i] =1
# print(dic)
# 计数器
from collections import Counter
c = Counter() # 字典
for i in s:
c[i] +=1
print(c)