「Rubyで始めるシステムトレード」を読み進めながら、オリジナルのruby codeのpythonでの記述を進めていたが、随分長い間放置してしまった。2024年再び再開する。rubyからpythonへのコード書き換えの効率を上げるため、ChatGPTを活用する。
コードの変換テストとして、下記のSpeaker.rbをChatGPTでpythonへ変換してみた。
"speak.rb"
class Speaker
def say(*word)
puts word
end
end
speaker = Speaker.new
speaker.say("Good morning")
speaker.say("Hello","How are you?","Good-by")
ChatGPTは、Pythonの可変長引数の表し方を説明しながら、問題なく動くPythonコードを出力してくれた。これはとてつもなく便利ではないか。続いて以下のRubyのコードもChatGPTでPythonに変換してみた。
"stock_list_loader.py"
class StockListLoader:
def initialize(stock_list_file)
unless stock_list_file
raise "Identify the stock list."
end
@stock_list = File.readlines(stock_list_file).map do |line|
line.split(",")
end
end
def stock_info
@stock_info ||= @stock_list.map do |data|
{:code=> data[0].to_i, :market_section => data[1], :uint => data[2].to_i}
end
end
def codes
@codes ||= stock_info.map {|info| info[:code]}
end
def market_sections
@market_section ||= stock_info.map{|info[:market_section]}
def units
@units ||= stock_info.map (|info| info[:uint])
end
def filter_by_market_section(*sections)
return self unless sections[0]
@stock_info = stock_info.find_all do |info| section.include?(info[:market_section])
end
self
end
end
以下が変換されたPythonコードだ。動作テストはまだ行っていないが、それなりのものを出力しているように見える。
"stock_list_loader.rb"
class StockListLoader:
def __init__(self, stock_list_file):
if not stock_list_file:
raise ValueError("Identify the stock list.")
with open(stock_list_file, 'r') as file:
self.stock_list = [line.strip().split(",") for line in file]
@property
def stock_info(self):
if not hasattr(self, '_stock_info'):
self._stock_info = [
{'code': int(data[0]), 'market_section': data[1], 'unit': int(data[2])}
for data in self.stock_list
]
return self._stock_info
@property
def codes(self):
if not hasattr(self, '_codes'):
self._codes = [info['code'] for info in self.stock_info]
return self._codes
@property
def market_sections(self):
if not hasattr(self, '_market_sections'):
self._market_sections = [info['market_section'] for info in self.stock_info]
return self._market_sections
@property
def units(self):
if not hasattr(self, '_units'):
self._units = [info['unit'] for info in self.stock_info]
return self._units
def filter_by_market_section(self, *sections):
if not sections or not sections[0]:
return self
self._stock_info = [info for info in self.stock_info if info['market_section'] in sections]
return self
元々のRubyのコードをChatGPTでPythonに変換し、動作確認を行いながらコードを修正するという方法が機能しそうだ。