2012年7月24日火曜日

Wvisで気象情報を3次元可視化




Wvisという、気象庁のメソモデル(MSM)を3次元可視化してくれるソフトがある。
今のところMSMしか可視化できないが、MSMなら手軽に3次元可視化できる。

Wvisは以下からダウンロードできる。
http://www.cybernet.co.jp/avs/download/wvis.html

Windowsのみのソフトだが、私の試した限り、Linux上でも、wineを用いることで問題なく使えた

Wvisについては、気象学会の「天気」にも解説がある。
http://www.metsoc.jp/tenki/pdf/2011/2011_09_0073.pdf

使い方については、Wvisのマニュアルまたは、「天気」の記事を参照されたい。

MSMのデータは
http://database.rish.kyoto-u.ac.jp/arch/jmadata/gpv-original.html
または
http://gpvjma.ccs.hpcc.jp/~gpvjma/
でgrib2形式のデータが入手可能である。

例として、下の動画は2012年7月11-14日にかけて九州に豪雨をもたらした暖かく湿った空気(相当温位355K)をプロットしたものである。説明についてはYoutubeのキャプションの欄を参照されたい。http://www.youtube.com/watch?v=GO0ZrA3wx5s


浦神と串本の日平均潮位差をpandasで



以前書いた、pandasでの時系列処理の続き。バージョンアップ(これを書いてる時点でversion 0.8.1)により、さらに便利になった。

浦神と串本の日平均潮位差をプロットしてみる。前回のようにwebから直接読むこともできるが、今回はhttp://www.data.kishou.go.jp/db/kobe/kuroshio/chouisa/chouisa.datからchouisa.datをダウンロードしてそれを読むことにする。

下がプログラム。
read_psvでデータを読んでいる。
前回は日付とデータの間にあるスペースをスマートに処理できなかったが、sep='\s*' (任意の数のスペース)を使えばよかったらしい。
column=0(右端)をindexとして用い(index_col=0)、日付データとして解釈する(parse_dates=Trule)。
”-”を欠損値と解釈する。

version 0.8以降、月平均を計算するのが簡単になり、data.resample("M",how='mean')で良い。


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# read data
data=pd.read_csv("chouisa.dat",sep='\s*',skiprows=1,header=None,index_col=0,parse_dates=True,names=("date","chouisa"),na_values="-")

#monthly value
data2=data.resample("M",how='mean')

#plot
plt.subplot(111)
data["chouisa"].plot(style='b-',label="Daily")
data2["chouisa"].plot(style='r-',label="Monthly",linewidth=2)
plt.legend(loc='best')
plt.savefig("choisa.png")
plt.show()



2012年4月28日土曜日

pythonでssh



pythonで外部のサーバーにsshでアクセスして、そこでコマンドを実行する。
そのためにparamikoというパッケージを用いる。

以下はその例。
外部サーバにアクセス(ホスト名***, user名xxx, password +++)にアクセスし、コマンド"du . | sort -n -r"(どのディレクトリが容量を使っているかを調べる)を実行して、標準出力に表示する。

#!/usr/bin/env python

import paramiko

host="***"
port=22
user="xxx"
passwd="+++"

if __name__ == "__main__":
    paramiko.util.log_to_file('paramiko.log')
    s=paramiko.SSHClient()
    s.load_system_host_keys()
    s.connect(host,port,user,passwd)
    stdi,stdo,stde = s.exec_command("du . | sort -n -r")
    print stdo.read()
    s.close()

参考文献
Python ポケットリファレンス (Pocket Reference) 317ページ

(追記)
私がparamikoを使っている時、時々timeoutの問題が起こることがあった。
その場合
http://www.stillhq.com/commentform.cgi?post=python/paramiko/000004
などを参考にして、回避する。

ENDNOTE: MS Wordの文献リストのhanging indent



MS WORDでENDNOTEを使ってHanging indentをするやり方がずっとわからなかったのだが、やっとわかった。

Hanging indentというのはこういうの


設定はWordのEndnoteタブのBibliographyのLayoutでHanging indentの大きさを指定するとともに

Endnote本体のStyle ManagerのEditorで、BibliographyのLayoutの右隅(これに気が付かなかった)のHanging indentで"All paragraphs"など選んでやれば良い





2012年3月16日金曜日

黒潮の流路をpandasで



以前、気象庁黒潮の流軸の緯度のデータをネットから読み込んでプロットしてみた。

同じことをpandas (Python Data Analysis Library)で行ってみる。

import numpy as np
from  pandas import *
import matplotlib.pyplot as plt
ds = np.DataSource(None)
f=ds.open('http://www.data.kishou.go.jp/kaiyou/shindan/b_2/kuroshio_stream/kuro_slat.txt')
data=read_csv(f,sep=" ",names=("space","val"),parse_dates=True)
f.close()
data["val"].plot()
plt.xlabel("YEAR")
plt.ylabel("Kurosho latitude")
plt.savefig("pandas_example.png")

(注記) 上のデータ読み込みでは、元データがスペースを使っている関係で、"space"という余計なデータ列(column)を作ってしまう。もっとスマートな方法があるかもしれない。
(追記:2012/7/23) 後日、改良版を書いた。

2012年2月6日月曜日

GrADSで作成するpostscriptの不要な横線

GrADSでpostscript形式の図を作ると不要な横線が入ってしまうことがある。

従来の対策は、例えば
http://www.sci.hokudai.ac.jp/~sasakiyo/tips_grads.html

GrADS 2.0.0から従来のgxout shaded に加えて、gxout shade2が加わっている。
http://www.iges.org/grads/gadoc/gradcomdsetgxout.html
これで図を作ったところ、従来横線が入っていた場合に、横線が入らなくなった。常にそうであるかは要確認。

2011年10月17日月曜日

フィルタの応答関数



フィルタの周波数応答関数をプロットしてみる。

以下の例は、京都大学の講義「MATLABで時系列解析」の線形システムの伝達関数を求めるを翻案したものである。

想定としては、1ヶ月ずつのデータがあり、シグナルとしては、48ヶ月周期と6ヶ月周期とホワイトノイズが重なったシグナルに対して13ヶ月の移動平均をかけている。

理論的な周波数応答関数を求める関数はscipyのfreqz関数である(matlabのfreqz関数に対応する)。応答関数は入力 x のパワースペクトル密度関数 Pxx と出力のクロススペクトル密度関数 Pyx の比としても推定できる。スペクトル密度関数を求める関数psdに関しては何度か紹介した。

#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pylab as plab
import matplotlib.mlab as mlab
from scipy.signal import freqz,lfilter

#--- Signal

Fs = 1   # frequency 
T = 1000.    # final time
t = np.arange(0.,T+1./Fs,1./Fs)  # time
x = np.sin(2.*np.pi*t/6.) + np.sin(2.*np.pi*t/48.)+np.random.normal(0,0.1,len(t)) # input signal

#---- power spectral by Welch's method 

plt.figure()
nfft = 256
window = np.hanning(256) 
noverlap = 128 
[Pxx,f] = mlab.psd(x,NFFT=nfft,Fs=Fs,window=window,noverlap=noverlap,detrend=plab.detrend_none) # Power spectral
plt.subplot(2,2,1) 
plt.plot(f,10*np.log10(Pxx)) # plot in decibel 
plt.legend(('Pxx',))
plt.plot([1./12.,1./12],[-70.,20.],'k--')
plt.plot([1./6.,1./6],[-70.,20.],'k--')
plt.plot([1./48.,1./48],[-70.,20.],'k--')
plt.ylim((-70,20))

#--- Moving average

h = np.ones(13)/13.

#--- Calculate theoritical response

fs,Res = freqz(h)
plt.subplot(2,2,2)
plt.plot(fs/2./np.pi,np.abs(Res))
plt.legend(('theoretical response',))
plt.plot([1./12.,1./12],[0.,1.],'k--')
plt.plot([1./6.,1./6],[0.,1.],'k--')
plt.plot([1./48.,1./48],[0.,1.],'k--')
plt.ylim((0,1.))


#--- Apply Filter

y = lfilter(h,1,x) # filter 

[Pxy,f] = mlab.csd(x,y,NFFT=nfft,Fs=Fs,window=window,noverlap=noverlap,detrend=plab.detrend_none) # cross scectral density

[Pyy,f] = mlab.psd(y,NFFT=nfft,Fs=Fs,window=window,noverlap=noverlap,detrend=plab.detrend_none)  # power spectral density 

plt.subplot(2,2,3)
plt.plot(f,10.*np.log10(abs(Pyy)))
plt.legend(('Pyy',))
plt.plot([1./12.,1./12],[-70.,20.],'k--')
plt.plot([1./6.,1./6],[-70.,20.],'k--')
plt.plot([1./48.,1./48],[-70.,20.],'k--')
plt.ylim((-70,20))


#--- Calculate estimated response

Resc = Pxy/Pxx 
plt.subplot(2,2,4)
plt.plot(f,abs(Resc)); 
plt.legend(('estimated response',)) 
plt.plot([1./12.,1./12],[0.,1.],'k--')
plt.plot([1./6.,1./6],[0.,1.],'k--')
plt.plot([1./48.,1./48],[0.,1.],'k--')
plt.ylim([0,1])

#--- Save fig
plt.savefig("test_response.png")
plt.show()


以下がフィルタを12ヶ月移動平均にした場合。
以下はシグナルからホワイトノイズを除いた場合。この時はスペクトルからの応答関数の推定はうまくいかない(移動平均はこの場合は13ヶ月)。



参考) Scipy Cookbook FIRFilter