日経225 マーケットマップは株価の様子をマップで表したもので セルの大きさで時価総額を、色で株価の変化を表している。
似たようなことをzopeでやってみた。
リアルタイムにyahooに株価を取りに行っているので、クリックしてから一分くらいかかるかもしれない。
http://lightson.dip.jp/zope/test/marketmap/dispMap
手順は次の通り
1.定義された会社のリストに基づき、yahoo株価から株価、価格の上下、時価総額を取る
2.株価の変動に対応する背景色を定義する。
3.次のような手順でhtmlファイルを生成する。
このロジックは同じ会社のMさんがEXCELでかかれた物をPythonで書き直した。
Mさんからはもっと効率のよいプログラムを提供されたが、私が理解することができなかったのが残念である。
でも、現実的はこの手順でも速度的にはまったく問題がないと思われる
**タイル化の手順**
1.要素をおおよそ半分にわけ、二つのグループ(TopとBottom)にする。(比率は0.5を変えると変更できる)
2.二つに分けたグループのそれぞれの合計を出し、全体に対するTopの比を求め、分割位置を決める。
3. TopとBottomの要素に対して1,2を繰り返し、要素が一個になったところで四角を描く。
nの値を計算する部分の0.5を0から1の範囲で増減すると形が変わります。
<img src="marketfilelist.jpg" />
ソースコードは基本的にローカル版と同じである。
http://lightson.dip.jp/zope/ZWiki/403Yahoo_e3_81_8b_e3_82_89_e3_83_87_e3_83_bc_e3_82_bf_e3_82_92_e5_8f_96_e3_82_8bMarketmap_e7_b7_a8_e9_9b_86_e3_81_a7_e8_a6_8b_e3_81_a6_ef_bc_89/editform
yahooへのアクセスなどはZope上のpythonではできないので、外部プログラムを用いる。
Extensionsディレクトリに、extKabuMethod.pyというファイルを作り、この中に次の関数を入れておく。
getKabuka()、drawRect()、delFile()、splitTitle()
Zope上のPythonスクリプトの説明
スクリプトは3つある。
getCompanyValueで、
compalylistに登録されている会社のコードを用い、Yahoo株価にアクセスし、株価、変化値、時価総額などを取りリストにする。
getColor()では、株価と変化値から、変化の割合を出し、背景の色を得る。
dispMap()では、外部プログラムのsplitTile()を使ってCSSで分割を定義していく。
splitTile()は、再帰的に面接を分割しながらデータを作っていくので、それを記憶するグローバルな変数が必要なのだが、どうしていいのかわからなかった。
そこで、今回は'/home/zope/public_html/position.txt'をそうした領域に用いた。
このディレクトリは、LocalFSでZopeにマウントしてある。
実行時には、最初に外部プログラムdelFile()を使ってposition.txtを削除しておく。
HTMLを生成するときにこれを読み出して使っている。
<pre>
#getCompanyValue()
companylist=['6752','6753','6954','6976','7752','6701','6702','6857','6764','6703','6971','6991','6952','6503','6504','4902','6502','6773','6841','6762','6674']
list=[]
for company in companylist:
data=context.getKabuka(company)
color=context.getColor(data[7],data[8])
value=[]
value.append(data[9])
value.append(data[0])
value.append(color)
value.append(data[1])
list.append(value)
return list
#getColor(kabuka=,diff)
ratio=int(1.0*diff/kabuka*100) ##変動率を実数で求め、小数点以下を切り捨てる
#株価の変動に割り付ける色を定義する
colorlist=['#ff0000','#ff3333','#ff6666','#ff9999','#ffcccc','#ccffff','#99ffff','#66ffff','#33ffff','#00ffff','#00ffcc']
if ratio < -5: #5%以上下がっていたら
color=colorlist[0]
elif ratio > 5: #5%以上あがっていたら
color=colorlist[10]
else: #+-5%以内だったら
color=colorlist[5+ratio]
return color
##dispMap()
value=context.getCompanyValue()
context.delFile('/home/zope/public_html/position.txt')
context.splitTile(d=value)
print '<html>'
print '<head>'
print '<title>position</title>'
print '<style type="text/css">'
print '<!--'
print 'body { margin: 0}'
print 'div {'
print ' position: absolute;'
print ' font-weight: bold'
print '}'
text=container.marketmap['position.txt']
print text
print '-->'
print '</style>'
print '</head>'
print '<body>'
for i in value:
print '<a href="'+i[3]+'">'+'<div class='+'"'+i[1]+'">',i[1],'</div></a>'
print '</body>'
print '</html>'
return printed
return printed
</pre>