def test_calc_return(self, name, df, quote_column, days, want, wantError): stock = Stock(None, StockConfig(quote_column=quote_column)) stock.set_data(StockDF(df)) if wantError: with pytest.raises(wantError): pd.testing.assert_series_equal(stock._calc_return(days), want, check_names=False, check_index=False) else: pd.testing.assert_series_equal(stock._calc_return(days), want, check_names=False, check_index=False)
def test_calc_average_shadow_range(self, name, df, days, want, wantError): stock = Stock(None, StockConfig()) stock.set_data(StockDF(df)) if wantError: with pytest.raises(wantError): pd.testing.assert_series_equal(stock._calc_average_shadow_range(days), want, check_names=False, check_index=False) else: pd.testing.assert_series_equal(stock._calc_average_shadow_range(days), want, check_names=False, check_index=False)
def test_load_save_data(self): # repositoryのmockを作成 dummy_repository = Mock(spec=FeatureRepositoryABC) dummy_repository.load_data.return_value = FeatureDF(ORIGINAL_STOCK_PDF.copy()) dummy_repository.save_data.return_value = None # Stockからload_dataとsave_dataを呼び出す stock = Stock(dummy_repository, StockConfig()) stock.load_data("load_test") stock.save_data("save_test") # mockの引数を中心に動作確認 pd._testing.assert_frame_equal(stock._df.df, ORIGINAL_STOCK_PDF) dummy_repository.load_data.assert_called_once_with("load_test") dummy_repository.save_data.assert_called_once() args = dummy_repository.save_data.call_args.args pd._testing.assert_frame_equal(args[0].df, stock._df.df) assert args[1] == "save_test"
def extract_indicator(self, request: IndicatorInteractorRequest) -> IndicatorInteractorResponse: """株取引の意思決定指標抽出. データから抽出できる特徴量を全て取得する Args: request (IndicatorInteractorRequest): リクエスト Returns: IndicatorInteractorResponse: レスポンス """ stocks_df = self._load_data(request.from_, request.repository) stocks_df.append_feature(StocksDFColumns.RETURN.value, stocks_df.df[StocksDFColumns.OPEN.value]) for code in stocks_df.get_codes(): stock_df = stocks_df.get_stock_df(code) stock_conf = StockConfig() stock = Stock(request.repository, stock_conf) stock.set_data(stock_df) # TODO(dondakeshimo): # cache機能をつけるなら計算済みのデータはloadする # 基本的に一度計算したものを再計算するメリットはないのでつけるべき # stock.load_calculated_data(request.from_) みたいな stock.preprocess() stock.extract_feature() stocks_df.overwrite_specific_rows(stocks_df.df[StocksDFColumns.CODES.value] == code, stock.df.df) # TODO(dondakeshimo): # それぞれのcodeをsuffixとかにつけるのが良いと思う # ただし、to_にpathが入ってくるとは限らないので注意 # stock.save_data(request.to_) # TODO(dondakeshimo): 計算済みのデータと未計算だったデータのマージ # TODO(dondakeshimo): # 銘柄ごとのStockインスタンスをIndicatorInteractorResponse型にマージして整形する # IndicatorInteractorResponseはstrategyの実行に必要十分な情報を付与すること # 今の所は適当な順番をつけられる項目と銘柄情報があれば良い return IndicatorInteractorResponse(stocks_df)
def test_extract_feature(self, name, df): stock = Stock(None, StockConfig()) stock.set_data(StockDF(df)) stock.extract_feature() assert stock.df.has_extracted()