def DMI(fy, ly, product_n): # 時系列データを得る練習として、DMIを計算してみる。 npz_dir = subroutine.get_npz_dir(product_n) fname = npz_dir + 'DMI-' + str(fy) + str(ly) + '.npz' print fname if os.path.exists(fname) == False: etseries = np.ones([ly - fy + 1, 12]) wtseries = np.ones([ly - fy + 1, 12]) for iye in range(fy, ly + 1): for itime in range(1, 13): etseries[iye - fy, itime - 1] = get_area_mean_data(0, iye, itime, 't', 1, 'hoge', 'eDMI', product_n) wtseries[iye - fy, itime - 1] = get_area_mean_data(0, iye, itime, 't', 1, 'hoge', 'wDMI', product_n) ano_et = subroutine.array_avestd(etseries, 'ano') ano_et = to_oneline(ano_et) ano_et = running_mean(ano_et, 5) ano_wt = subroutine.array_avestd(wtseries, 'ano') ano_wt = to_oneline(ano_wt) ano_wt = running_mean(ano_wt, 5) dmi = ano_wt - ano_et # dmi_oneline=to_oneline(dmi) ym = ts.ym_timeseries02(fy, ly) np.savez(fname, ym = ym, dmi = dmi) else: pass npload = np.load(fname) ym = npload['ym'] dmi = npload['dmi'] return dmi, ym
def cal(month,pres): import eof import subroutine import numpy as np import pylab as pl import matplotlib.pyplot as plt myear,mlat=eof.parameter() data=eof.get_data(month,pres) pm=eof.get_pm(month,pres) ano=subroutine.array_avestd(data,'ano') # 偏差場行列の計算 cov=ano.transpose().dot(ano) # 共分散行列の計算 eigen_value,eigen_vector=np.linalg.eig(cov) # 固有値・固有ベクトルを求める contribution_ratio=eigen_value/sum(eigen_value)*100 lat=eof.lat() year=eof.year() mn=3 # 何番目のモードまで出力するか time_coe=np.ones((myear,mn)) for i in range(0,mn): print eigen_value[i],contribution_ratio[i] print eigen_vector[i] for j in range(0,myear): time_coe[j,i]=sum(ano[j,:]*eigen_vector[:,i]) # 各モード時系列プロット for i in range(0,mn): plt.plot(year,time_coe[:,i],label='mode'+str(i+1)) plt.xlim(year[0],year[year.size-1]) plt.legend() plt.savefig(pm+'_time-series.png') plt.show() # 各モード時系列プロット # 各モード緯度分布プロット for i in range(0,mn): plt.plot(lat,eigen_vector[:,i],label='mode'+str(i+1)) plt.legend() plt.savefig(pm+'_lat-distribution.png') plt.show()