home changes contents help options
日経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>