相場商売

トレーディングビジネスあれこれ

Pythonシストレ第6章

第6章

libフォルダのstock_list_loader.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import codecs

# 銘柄リストを読み込み、銘柄に関する情報を供給するクラス
class StockListLoader:
    def __init__(self, stock_list_file):
        if stock_list_file == None:
            raise IOError('銘柄リストを指定してください')
        else:
            self.stock_list     = []
            self.stock_infos    = []
            self.code           = []
            self.market_section = []
            self.unit           = []
            f = codecs.open(stock_list_file, 'r', 'utf-8')
            for line in f.readlines():
                self.stock_list.append(line.strip().split(','))
        
    def stock_info(self):
        if self.stock_infos == []:
            for l in self.stock_list:
                d = {'code': int(l[0]), 'market_section': l[1], 'unit': int(l[2])} 
                self.stock_infos.append(d)
        return self.stock_infos
    
    def codes(self):
        if self.code == []:
            for info in self.stock_infos:
                self.code.append(info['code'])
        return self.code

    def market_sections(self):
        if self.market_section == []:
            for info in self.stock_infos:
                self.market_section.append(info['market_section'])
        return self.market_section            

    def units(self):
        if self.unit == []:
            for info in self.stock_infos:
                self.unit.append(info['unit'])
        return self.unit

    def filter_by_market_section(self, *sections):
        if len(sections) == 0:
            return self.stock_infos
        else:
            return [info for info in self.stock_infos if info['market_section'] in sections]

Rubyのコードのように属性とメソッド名を同じにするとエラーが出たので
少しだけ名前を変更した。

checkフォルダのstock_list_loader_check.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from lib.stock_list_loader import StockListLoader

sll = StockListLoader('data\\tosho_list.txt')

print(sll.stock_info()[0]) 
#                         => {:code=>1301,
#                             :market_section=>"東証1部",
#                             :unit=>1000}
print(sll.codes()[0])           #=> 1301
print(sll.codes()[-1])          #=> 9997
print(sll.market_sections()[0]) #=> "東証1部"
print(sll.units()[0])           #=> 1000

print('東証2部' in sll.market_sections())                    #=> true
print('東証2部' in sll.filter_by_market_section('東証1部'))  #=> false

input()

filter_by_market_sectionメソッドRubyとは違いstock_info自体は書き換えない。

7章へ続く。