javaee论坛

普通会员

225648

帖子

342

回复

356

积分

楼主
发表于 2019-11-01 17:05:50 | 查看: 87 | 回复: 2

文章目录NumPyNumPy数组对象NumPy数据类型NumPy数组运算NumPy索引和切片NumPy数组组合NumPy数组的属性NumPy数组的转换NumPy通用函数NumPy数据处理NumPy线性代数NumPy随机数NumPy例子

NumPy数组对象

NumPy中的ndarray是一个多维数组对象,该对象由两部分组成

实际的数据描述这些数据的元数据

举例

defsum(n):#range返回的是range对象(在python3中,不返回list对象)a=list(range(n))b=list(range(n))c=[]foriinrange(len(a)):a[i]=i**2b[i]=i**3c.append(a[i]+b[i])returncimportnumpyasnpdefsumNp(n):a=np.arange(n)**2b=np.arange(n)**3c=a+breturncprint(sumNp(5))print(sum(5))

数组创建函数

importnumpyasnpprint(np.arange(5).shape)print(np.array([[1,2],[2,1]]))print(np.zeros(10))print(np.zeros((3,6)))print(np.empty((2,3,4)))NumPy数据类型

自定义数据类型

#自定义数据类型importnumpyasnpt=np.dtype([("name",np.str_,40),("items",np.int32),("price",np.float64)])arr=np.array([("ThemeaningoflifeDVD",10,29.7),("Ianyourfather",20,32.1)],dtype=t)print(arr[0])NumPy数组运算

运算

importnumpyasnparr=np.array([[1,2,3],[4,5,6]])print(arr*arr)print(arr+arr)print(arr-arr)print(1/arr)array=[1,2,3,4]print(array[::-1])#步长NumPy索引和切片

切片

importnumpyasnparr=np.arange(24).reshape(2,3,4)print(arr[:,:,-1])print(arr[:,:,-1])print()print(arr[:,::-1])#两个冒号表示步长#全部反转print(arr[::-1,::-1,::-1])

布尔型索引

names=np.array(["Bob","Joe","Will","Bob","Will","Joe","Joe"])data=np.random.randn(7,4)print(data)print(names=="Bob")print(data[names=="Bob"])

花式索引

arr=np.arange(32).reshape((8,4))print(arr[1])print(arr[[1,2],[2,3]])print(arr.T)#将数组反转

改变维度

#改变数组的维度#增加维度b=np.arange(24).reshape(2,3,4)print(b)#降低维度print(b.flatten())#改变维度b.shape=(6,4)print(b)b.resize((2,12))print(b)#反转数组print(b.transpose())NumPy数组组合

数组的组合

#数组组合#水平组合a=np.arange(9).reshape(3,3)print(a)b=a*2print(b)print(np.hstack((a,b)))print(np.concatenate((a,b),axis=1))#竖直组合print(np.vstack((a,b)))print(np.concatenate((a,b),axis=0))#print(np.dstack((a,b)))a1=np.arange(0,2)b1=a1*2;#竖直组合print(np.column_stack((a1,b1)))#水平组合print(np.row_stack((a1,b1)))#分割a=np.arange(9).reshape(3,3)print(np.hsplit(a,3))print(np.split(a,3,1))print(np.vsplit(a,3))print(np.split(a,3,0))c=np.arange(27).reshape(3,3,3)print(c)print(np.dsplit(c,3))NumPy数组的属性

数组属性

#数组的属性b=np.arange(24).reshape(2,12)print(b.ndim)#维度(几维数组)print(b.size)#数组元素总个数print(b.itemsize)#在内存中占的字节数print(b.nbytes)#字节总和#复数的属性b=np.array([1+1j,2+2j])print(b.real)print(b.imag)print(b.flat[1])#获取展开为一维数组之后的指定下标值b.flat[0]=1b.flat[1]=2print(b)NumPy数组的转换

数组转换

b=np.array([1+1j,2+2j])print(b)print(b.tostring())print(b.tolist())print(np.fromstring('20:42:52',sep=":",dtype=int))print(b.astype(int))print(b.astype(complex))NumPy通用函数

一元ufunc

示例

arr=np.arange(10)print(np.sqrt(arr))#开根号print(np.exp(arr))#指数x=np.random.randn(8)y=np.random.randn(8)print(np.maximum(x,y))#元素级最大值arr=np.random.randn(7)*5print(arr)print(np.modf(arr))#将整数和分数分离成两个数组

二元ufunc

NumPy数据处理

向量化的处理

points=np.arange(-5,5,0.01)#print(points)xs,ys=np.meshgrid(points,points)#两个一维数组,第一个决定宽度,第二个决定高度#比如np.meshgrid([1,2],[3,4])#高度和宽度都是2,所以在xs中:#xs:[[1,2]ys:[[3,3#[1,2]]4,4]]importmatplotlib.pyplotaspltz=np.sqrt(xs**2+ys**2)plt.imshow(z,cmap=plt.cm.gray)plt.colorbar()plt.title("imageforsql(xs**2+ys**2)")plt.show()

结果:

将条件逻辑表达式为数组运算

#where函数arr1=[1,2,3,4,5]arr2=[6,7,8,9,10]cond=[True,True,False,True,True]arr3=np.where(cond,arr1,arr2)print(arr3)arr4=np.random.randn(4,4)print(arr4)np.where(arr4>0,2,-2)

数学与统计方法

print(arr.mean())#算术平均数。零长度的数组的mean为NaNprint(arr.sum())#求和print(arr.std())#标准差print(arr.var())#方法print(arr.max())#最大值print(arr.min())#最小值print(arr.argmax())#最大值的下标print(arr.argmin())#最小值的下标bools=np.array([False,True,False,False])print(bools.any())#是否存在非零元素print(bools.all())#是否全部为0#arr.sort(1)#按照某一行排序arr.sort()print(arr)#从小到大排序value=np.array([1,2,3,4,5,6])print(np.in1d(value,[2,3,6]))#判断是否存在在第一个表中。返回的是一个布尔数组

NumPy线性代数

常用的numpy.linalg函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x27G3cUS-1571620181708)(线性代数.JPG)]

arr=np.arange(16).reshape(4,4)矩阵的对角线(一维数组)print(np.diag(arr))#矩阵乘法print(arr)print("*")print(arr.T)print(np.dot(arr,arr.T))print(np.trace(arr))print(np.linalg.det(arr))#计算矩阵的逆arr=np.array([1,1,1,1]).reshape(2,2)print(arr)print(np.linalg.inv(arr))print(np.dot(arr,np.linalg.inv(arr)))NumPy随机数产生随机数

示例importrandomposition=0walk=[position]steps=1000foriinrange(steps):step=1ifrandom.randint(0,1)else-1position+=stepwalk.append(position)print(walk)nstep=1000draws=np.random.randint(0,2,size=nstep)steps=np.where(draws>0,1,-1)walk=steps.cumsum()#所有元素的累计和print(steps)print(walk)NumPy例子

数据(csv)文件

AAPL28-01-2011344.17344.4333.53336.121144800AAPL31-01-2011335.8340.04334.3339.3213473000AAPL01-02-2011341.3345.65340.98345.0315236800AAPL02-02-2011344.45345.25343.55344.329242600AAPL03-02-2011343.8344.24338.55343.4414064100AAPL04-02-2011343.61346.7343.51346.511494200AAPL07-02-2011347.89353.25347.64351.8817322100AAPL08-02-2011353.68355.52352.15355.213608500AAPL09-02-2011355.19359354.87358.1617240800AAPL10-02-2011357.39360348354.5433162400AAPL11-02-2011354.75357.8353.54356.8513127500AAPL14-02-2011356.79359.48356.71359.1811086200AAPL15-02-2011359.19359.97357.55359.910149000AAPL16-02-2011360.8364.9360.5363.1317184100AAPL17-02-2011357.1360.27356.52358.318949000AAPL18-02-2011358.21359.5349.52350.5629144500AAPL22-02-2011342.05345.4337.72338.6131162200AAPL23-02-2011338.77344.64338.61342.6223994700AAPL24-02-2011344.02345.15338.37342.8817853500AAPL25-02-2011345.29348.43344.8348.1613572000AAPL28-02-2011351.21355.05351.12353.2114395400AAPL01-03-2011355.47355.72347.68349.3116290300AAPL02-03-2011349.96354.35348.4352.1221521000AAPL03-03-2011357.2359.79355.92359.5617885200AAPL04-03-2011360.07360.29357.7536016188000AAPL07-03-2011361.11361.67351.31355.3619504300AAPL08-03-2011354.91357.4352.25355.7612718000AAPL09-03-2011354.69354.76350.6352.4716192700AAPL10-03-2011349.69349.77344.9346.6718138800AAPL11-03-2011345.4352.32345351.9916824200

代码

#利用NumPy进行历史股价分析importsys#读入文件第6,7列:股票的收盘价和成交数量。c,v=np.loadtxt("data.csv",delimiter=",",usecols=(5,6),unpack=True)#计算加权平均价格(价格*频数)/总频数vmap=np.average(c,weights=v)print("加权平均价格:",vmap)#算术平均值print("算术平均价格:",np.mean(c))#时间加权平均价格t=np.arange(len(c))tmap=np.average(c,weights=t)print("时间加权平均价格:",tmap)#寻找最大值和最小值:最高价和最低价h,l=np.loadtxt("data.csv",delimiter=",",usecols=(3,4),unpack=True)print("最高价格:",np.max(h))print("最低价格:",np.min(l))print("最高价和最低价平均值:",(np.max(h)+np.min(h))/2)#波动性:最高价的最大值-最高价的最小值(或最低价的最大值-最低价的最小值)print("最高价波动性:",np.ptp(h))print("最低价波动性:",np.ptp(l))print("中位数:",np.median(c))print("方差:",np.var(c))#print(np.diff(c))#后一个值减去前一个值#股票收益率:收益的标准差returns=np.diff(c)/c[:-1]print("收益的标准差",np.std(returns))logreturns=np.diff(np.log(c))posretindices=np.where(returns>0)annual_volatility=np.std(logreturns)/np.mean(logreturns)annual_volatility=annual_volatility/np.sqrt(1./252.)print(annual_volatility)#日期分析:#fromdatetimeimportdatetime##defdatestr2num(s):#returndatetime.strptime(s,"%d-%m-%Y").date().weekday()##dates,close=np.loadtxt('data.csv',delimiter=",",usecols=(1,6),converters={1:datestr2num},unpack=True)#fromdatetimeimportdatetime#Monday0#Tuesday1#Wednesday2#Thursday3#Friday4#Saturday5#Sunday6defdatestr2num(s):#将字符转换成字符串returndatetime.datetime.strptime(s.decode('ascii'),"%d-%m-%Y").date().weekday()dates,close=np.loadtxt('data.csv',delimiter=',',usecols=(1,5),converters={1:datestr2num},unpack=True)print("Dates=",dates)averages=np.zeros(5)foriinrange(5):indices=np.where(dates==i)#返回i所在的下标。prices=np.take(close,indices)#返回下标所对应的值。avg=np.mean(prices)#求平均值print("Day",i,"prices",prices,"Average",avg)averages[i]=avgtop=np.max(averages)botton=np.min(averages)print("最高:",top)print("最低:",botton)#周汇总defdatestr2num(s):returndatetime.datetime.strptime(s.decode("ascii"),"%d-%m-%Y").date().weekday()dates,open,high,low,close=np.loadtxt('data.csv',delimiter=",",usecols=(1,2,3,4,5),converters={1:datestr2num},unpack=True)close=close[:16]dates=dates[:16]#getfirstMondayfirst_monday=np.ravel(np.where(dates==0))[0]#将元组变成数组,也能够降维last_friday=np.ravel(np.where(dates==4))[-1]#将元组变成数组,也能够降维#从第一个周一到最后一个周五的下标week_indices=np.arange(first_monday,last_friday+1)week_indices=np.split(week_indices,3)#切成三分print(week_indices)defsummarize(a,o,h,l,c):monday_open=o[a[0]]#一周的开盘价week_high=np.max(np.take(h,a))#一周的最高价week_low=np.min(np.take(l,a))#一周的最低价friday_close=c[a[-1]]#一周的收盘价return("APPL",monday_open,week_high,week_low,friday_close)#将arr数组的每一个元素经过func函数变换形成的一个新数组week_summary=np.apply_along_axis(summarize,1,week_indices,open,high,low,close)print(week_summary)np.savetxt('weeksummary.csv',week_summary,delimiter=",",fmt="%s")#真实波动幅度均值h,l,c=np.loadtxt('data.csv',delimiter=",",usecols=(3,4,5),unpack=True)N=20h=h[-N:]l=l[-N:]previousclose=c[-N-1:-1]truerange=np.maximum(h-l,h-previousclose,previousclose-l)atr=np.zeros(N)atr[0]=np.mean(truerange)foriinrange(1,N):atr[i]=(N-1)*atr[i-1]+truerange[i]atr[i]/=Nprint(atr)#简单移动平均线frommatplotlib.pyplotimportplotfrommatplotlib.pyplotimportshowN=5weights=np.ones(N)/Nc=np.loadtxt('data.csv',delimiter=",",usecols=(5,),unpack=True)#'full'默认值,返回每一个卷积值,长度是N+M-1,在卷积的边缘处,信号不重叠,存在边际效应。#'same'返回的数组长度为max(M,N),边际效应依旧存在。#'valid'返回的数组长度为max(M,N)-min(M,N)+1,此时返回的是完全重叠的点。边缘的点无效。#sma1=np.convolve(weights,c,mode="same")#sma1=np.convolve(weights,c,mode="full")[N-1:-N+1]#print(sma1)#sma=np.convolve(weights,c,mode="same")sma=np.convolve(weights,c,mode="valid")#print(sma1)#print(sma3)t=np.arange(N-1,len(c))#plot(t,c[N-1:],lw=1.0)#plot(t,sma,lw=2.0)#show()#指数移动平均线c=np.loadtxt('data.csv',delimiter=",",usecols=(5,),unpack=True)t=np.arange(N-1,len(c))weights=np.exp(np.linspace(-1.,0.,N))weights/=weights.sum()ema=np.convolve(weights,c)[N-1:-N+1]#plot(t,c[N-1:],lw=1.0)#plot(t,ema,lw=2.0)#show()#布林带N=5weights=np.ones(N)/Nc=np.loadtxt('data.csv',delimiter=",",usecols=(5,),unpack=True)sma=np.convolve(weights,c)[N-1:-N+1]deviation=[]foriinrange(N-1,len(c)):ifi+N<len(c):dev=c[i:i+N]else:dev=c[-N:]averages=np.zeros(N)averages.fill(sma[i-N-1])dev=dev-averagesdev=dev**2dev=np.sqrt(np.mean(dev))deviation.append(dev)deviation=2*np.array(deviation)upperBB=sma+deviationlowerBB=sma-deviationc_slice=c[N-1:]between_bands=np.where((c_slice<upperBB)&(c_slice>lowerBB))between_bands=len(np.ravel(between_bands))t=np.arange(N-1,len(c))plot(t,c_slice,lw=1.0)plot(t,sma,lw=2.0)plot(t,upperBB,lw=3.0)plot(t,lowerBB,lw=4.0)show()

简单移动平均线

指数移动平均线

哥布林带


普通会员

0

帖子

321

回复

329

积分
沙发
发表于 2024-03-05 10:18:02

楼主说得对

普通会员

0

帖子

310

回复

334

积分
板凳
发表于 2024-04-20 03:35:52

很好

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017