Numpy、Matplotlib和Pands

#!/usr/bin/env python
# coding: utf-8

# # Numpy

# In[1]:


# numpy
import numpy as np
np.arange(10)   # 0 ~ n-1的一维数组


# In[ ]:


np.ones((2,3))   # 全1数组


# In[ ]:


np.zeros((3,3),dtype=np.int32)  # 全0数组


# In[ ]:


np.eye(5)   # 5 * 5 的对角线为1,其余为0的数组


# In[2]:


x = np.ones([2,3,4])
print(x)
x.shape    # 数组的形状 


# In[ ]:


a = np.linspace(1,10,4)   # low  high  元素个数
b = np.linspace(1,10,4,endpoint=False)   # 不包含high
print(a)
print(b)
c = np.concatenate((a,b))   # 合并两个数组
print(c)


# In[ ]:


# 改变数组的形状
a = np.ones((2,3,4),dtype=np.int32)
print(a)
print(a.reshape((3,8)))   # 不改变原数组
print(a.resize((3,8)))    # 原数组被改变


# In[ ]:


# 改变数组的类型
a = np.ones((2,3,4),dtype=np.int32)
print(a)
b = a.astype(np.float32)   # 
print(b)


# In[ ]:


a = np.full((2,3,4),25,dtype=np.int32)  # full  数组形状,填充元素
b = a.tolist()   # 将ndarray转换成list
print(a)
print("======")
print(b)


# In[2]:


# 数组的索引和切片
a = np.array([1,2,3,4,5,6,7,8,9,10])
print(a[0])
print(a[1:10:2])   # 起始索引 : 终止(不含) : 步长


# In[ ]:


a = np.arange(24).reshape((2,3,4))
print(a)
print("===========================")
print("索引",a[1,2,3])
print(a[:,1,2])
print(a[:,:,:])
print(a[:,1:,::2])


# In[ ]:


a = np.arange(24).reshape((2,3,4))
np.square(a)
a.mean()     # 所有元素的平均值


# In[ ]:


get_ipython().run_cell_magic('html', '', "<img src='./DataAnalyze_img/numpy基础.png'' ,width=800 ,height=600>")


# In[ ]:


# csv文件的存取
# 存
np.savetxt(fname,array,fmt,delimiter)  # 文件名,数组,存入的类型,元素之间的分隔符
# 取
np.loadtxt(fname,dtype,delimiter,)

# 只适用于一,二维数组的存取
-------------------------------------
# a = np.arange(24).reshape((2,3,4))
# a.tofile("a.csv",sep=',',format='%d')
np.fromfile(fname,dtype,count,sep)   # 读入的元素个数,数据分割符

-------------------------------------
np.save(fname,array) or np.savez()
np.load(fname)

#适用于多维数组,但只会将多维数组的元素逐个存入,也就是变成一维数组,如果不指定数据分割符,就会按二进制存入,读取时是不含维度信息的,只会
#按一维数组读入


# In[ ]:


# 随机数函数
np.random.rand(5,5)  # 0 - 1 之间的随机数


# In[ ]:


np.random.randn(5,5)


# In[ ]:


np.random.randint(100,200,(5,5))


# In[ ]:


np.random.seed(10)  #   种子函数
np.random.randint(100,200,(5,5))
np.random.seed(10)
np.random.randint(100,200,(5,5))   # 两次生成的随机数组相同


# In[ ]:


# 高级随机函数
a = np.random.randint(100,200,(3,3,3))
print(a)
np.random.shuffle(a)
a


# In[ ]:


np.random.permutation(a) # 同shuffle,但不改变原数组


# In[ ]:


a = np.random.randint(100,200,(24,))
np.random.choice(a,(3,2),replace=False)   # 随机抽取元素,组成新的数组,replace设置是否抽取已经被选择过的元素,p参数设置抽取概率


# In[ ]:


# 统计函数


# In[ ]:


a = np.arange(15).reshape(3,5)
print(a)
print(np.sum(a))
np.sum(a,axis=0)


# In[ ]:


np.mean(a)    # 求平均值


# In[ ]:


np.average(a,axis=0,weights=[10,5,1])   # 加权平均值


# In[ ]:


np.std(a)   # 标准差,均方差  各元素与平均值平方的平均值的平方根


# In[ ]:


np.var(a)  # 方差


# In[ ]:


np.ptp(a)   # 最大值与最小值之间的差


# In[ ]:


np.median(a)   # 中位数


# In[ ]:


# 梯度函数
a = np.random.randint(1,10,(5,))
print(a)
np.gradient(a)   # 数组的梯度,即斜率,是该元素前一个与后一个元素的差,除以距离2


# In[ ]:


b = np.random.randint(1,15,(3,5))
print(b)
np.gradient(b)   # n维数组返回n个数组,反应元素在n维反向上的梯度


# In[ ]:


# 图像的数组表示及变换
from PIL import Image
a = np.array(Image.open("./DataAnalyze_img/timg.jpg"))   # png文件比jpg文件多一个维度,是透明度
print(a.shape)
a = [255,255,255] - a
im = Image.fromarray(a.astype("uint8"))
im.save("./DataAnalyze_img/timg1.png")


# In[ ]:


# 图像手绘效果
a = np.asarray(Image.open('./DataAnalyze_img/timg4.jpg').convert('L')).astype('float')

depth = 10.
grad = np.gradient(a)
grad_x , grad_y = grad
grad_x = grad_x*depth/100
grad_y = grad_y*depth/100
A = np.sqrt(grad_x**2+grad_y**2+1.)
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = 1./A

vec_el = np.pi/2.2
vec_az = np.pi/4.
dx = np.cos(vec_el)*np.cos(vec_az)
dy = np.cos(vec_el)*np.sin(vec_az)
dz = np.sin(vec_el)

b = 255*(dx*uni_x+dy*uni_y+dz*uni_z)
b = b.clip(0,255)

im = Image.fromarray(b.astype('uint8'))
im.save('./DataAnalyze_img/timg3.jpg')


# # Matplotlib

# In[1]:


import matplotlib.pyplot as plt


# In[2]:


plt.plot([1,2,3,4,5])
plt.xlabel("grade")  
# plt.axis()   # 四个参数,分别是x轴起始和y轴起始
# plt.savefig('fname',dpi=600) # 文件名默认.png    图片质量,每英寸(in)中点的数量 1in = 2.54cm
plt.show()


# In[3]:


# 一张主图中分成多个子图
import numpy as np
import matplotlib.pyplot as plt

def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)   # 衰减函数
   
a = np.arange(0.0,5.0,0.02)

plt.subplot(2,1,1)   # 行,列,子图所在区域
plt.plot(a,f(a))

plt.subplot(2,1,2)
plt.plot(a,np.cos(2*np.pi*a),'r--')
plt.show()


# In[1]:


# 一张图中绘制多条线
import matplotlib.pyplot as plt
import numpy as np
import matplotlib  
#  方式一
#matplotlib.rcParams["font.family"] = "SimHei"  # 默认不支持中文,修改字体,黑体
a = np.arange(25)
b = np.random.randint(10,20,(25,))
c = 
d = 
e = 
# 方式一
#plt.ylabel("KW(千瓦)")
# 方式二 
plt.ylabel("KW(千瓦)",fontproperties="FangSong",fontsize=20)   # x轴标签
plt.xlabel("日期",fontproperties="SimHei",fontsize=20)         # y轴标签
plt.title("日用电量",fontproperties="SimHei",fontsize=20)      # 标题
plt.text(10,40,r'$\mu=100$',fontsize=10)                       # $$   Latex 格式   一种排版格式
plt.plot(a,b,'ro-.',)                                           # 颜色,标记风格,线条风格 
plt.plot(b,b*2,'g.',
plt.plot(c,b*3,'k^-')  
plt.plot(d,b*3,'k^-') 
plt.plot(e,b*3,'k^-') 
plt.grid(True)                                                 # 添加网格
plt.show()


# In[4]:


# 主图中绘制多张子图,并对其位置自设计
import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(3,3)
a = np.arange(15)
b = np.arange(20,35)
plt.subplot(gs[0,:])
plt.plot(a,b)
plt.subplot(gs[1,:-1])
plt.plot(a,b)
plt.subplot(gs[1:,2])
plt.plot(a,b)
plt.subplot(gs[2,1])
plt.plot(a,b)
plt.subplot(gs[2,0])
plt.plot(a,b)


# In[ ]:


# 绘制饼图
label = "A","B","C","D"
size = [30,20,15,35]
explode = (0,0,0.1,0)
plt.pie(size,labels=label,explode=explode,shadow=True,startangle=90,autopct="%1.1f%%")
plt.axis("equal")
plt.show()


# In[ ]:


# 绘制直方图
mu,sigma = 100,20
a = np.random.normal(mu,sigma,size=100)    # 生成正态分布随机数
plt.hist(a,40,density=0,histtype="stepfilled",facecolor='y',alpha=0.75)
plt.title("Hist")
plt.show()


# In[ ]:


# 使用面向对象的方法绘制散点图
plt.rcParams['axes.unicode_minus'] = False    # 显示负号
fig,ax = plt.subplots()   #默认111
ax.plot(10*np.random.randn(100),10*np.random.randn(100),'o')
ax.set_title("散点图",fontproperties="SimHei")
plt.show()


# In[ ]:


# 绘制引力波
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

rate_h,hstrain = wavfile.read(r"./DataAnalyze_img/H1_Strain.wav")
rate_l,lstrain = wavfile.read(r"./DataAnalyze_img/L1_Strain.wav")
reftime,ref_H1 = np.genfromtxt('./DataAnalyze_img/wf_template.txt').transpose()
htime_interval = 1/rate_h
ltime_interval = 1/rate_l
htime_len = hstrain.shape[0]/rate_h
htime = np.arange(-htime_len/2,htime_len/2,htime_interval)
ltime_len = lstrain.shape[0]/rate_l
ltime = np.arange(-ltime_len/2,ltime_len/2,ltime_interval)

fig = plt.figure(figsize=(12,6))

plth = fig.add_subplot(221)
plth.plot(htime,hstrain,'y')
plth.set_xlabel('Time(seconds)')
plth.set_label("H1 Strain")
plth.set_title("H1 Strain")

pltl = fig.add_subplot(222)
pltl.plot(ltime,lstrain,'g')
pltl.set_xlabel('Time(seconds)')
pltl.set_label("L1 Strain")
pltl.set_title("L1 Strain")

pltref = fig.add_subplot(212)
pltref.plot(reftime,ref_H1)
pltref.set_xlabel('Time(seconds)')
pltref.set_label("H1 Strain")
pltref.set_title("Template")

fig.tight_layout()
plt.show()


# In[6]:


# 一张图中绘制多条线
import matplotlib.pyplot as plt
import numpy as np
import matplotlib  
#  方式一
#matplotlib.rcParams["font.family"] = "SimHei"  # 默认不支持中文,修改字体,黑体
a = np.arange(25)
b = np.random.randint(10,20,(25,))
# 方式一
#plt.ylabel("KW(千瓦)")
# 方式二 
x=np.arange(10)
plt.ylabel("KW(千瓦)",fontproperties="FangSong",fontsize=20)   # x轴标签
plt.xlabel("日期",fontproperties="SimHei",fontsize=20)         # y轴标签
plt.title("日用电量",fontproperties="SimHei",fontsize=20)      # 标题
plt.text(10,40,r'$\mu=100$',fontsize=10)                       # $$   Latex 格式   一种排版格式
plt.plot(a,b,'ro-.')                                         # 颜色,标记风格,线条风格 
plt.plot(a,b*2,'g.')
plt.plot(a,b*3,'k^-')  
plt.legend(["a","b","c"],loc="upper left")                     # 添加图例
plt.grid(True)                                                 # 添加网格
plt.show()


# # Pandas

# In[ ]:


# pandas是基于numpy的,但numpy注重数据的结构,而pandas注重数据的应用


# series类型,对应一维数组

# In[1]:


import pandas as pd
a = pd.Series([1,2,3,4,5])    # 生成自动索引
b = pd.Series([1,2,3,4,5],index=["a","b","c","d","e"])    # 自定义索引
print(a)
print(b)


# In[11]:


a_dict = {"a":1,"b":2,"c":3,"d":4}
a = pd.Series(a_dict)
a.index    # 索引
a.values   # 元素
# 可以看出,Series是索引与元素的关联,并且自动索引和定义索引同时存在,但不能同时使用


# In[13]:


# Series对象可以起一个名字  .name
a_dict = {"a":1,"b":2,"c":3,"d":4}
a = pd.Series(a_dict)
a.name = "First_S"
a.index.name = "索引列"   # 给索引列起个名字
a


# In[14]:


# 两个series对象相加,会对其
a = pd.Series([1,2,3,4],index=["a","b","c","d"])
b = pd.Series([1,2,3,4],index=["c","d","e","f"])
a+b


# Dataframe:带标签的多维数组,即拥有行列索引

# In[42]:


import pandas as pd
import numpy as np
a = pd.DataFrame(np.arange(1,12,step=2).reshape(2,3))
print(a)
#print(a.index)
#print(a.columns)
#print(a.values)
a[0]  # 获取某一列数据
a.loc[1]   # 获取某一行数据
a.iloc(0)  # <pandas.core.indexing._iLocIndexer at 0x23485f4f2c8>


# In[55]:


# 数据类型操作,对索引进行重排
a = pd.DataFrame(np.arange(24).reshape(3,8))
a.reindex(index = [2,1,0])  # 对列索引重排序
a.reindex(columns=[7,6,5,4,3,2,1,0])
a.reindex(index = [0,1,2,3],fill_value = 10)  # 对NaN进行填充  method填充方法,ffill向前填充,bfill向后

# 操作索引,向索引中插入     append  diff   intersection 交集 union并集 delete删除
new_co = a.columns.insert(1,"8") # 位置,值
a.reindex(columns=new_co,fill_value=10)

# 使用drop删除指定索引
a.drop([0])   # axis = 1删除列


# In[65]:


#数据类型运算add sub mul div   +-*/
a = pd.DataFrame(np.arange(24).reshape(3,8))
b = pd.DataFrame(np.arange(24).reshape(4,6))
a.add(b,fill_value=10)   # fill_value 替代NaN之后参与运算


# In[64]:


# 比较运算,必须同维度,不进行补齐操作
a = pd.DataFrame(np.arange(24).reshape(3,8))
b = pd.DataFrame(np.arange(24,0,-1).reshape(3,8))
a < b


# In[ ]:


# 排序
#对索引排序,DataFrame.sort_index()
#对元素排序,Dataframe.sort_values()


# In[ ]:


# 统计分析,dataframe.describe

 

上一篇:pands:numpy函数应用与映射


下一篇:pands模块的妙用爬取网页中的表格