text: """
      code : 회사코드
      name : 회사이름
      liabilities_risk_ratio : 유동부채의 위험 배수
      totalStockCount : 현재 총 주식수
      df : 매년 회사 가치가 기록되는 DataFrame
      goal_rate_of_return : ?? 다시봐야할듯!!
  """
  
  import FilePathManager as fm
  import pandas as pd
  from decimal import *
  import os
  import pickle
  
  class Model(object):
      def __init__(self, liabilities_risk_ratio = 1.2, goal_rate_of_return=0.06 ):
          self.liabilities_risk_ratio = liabilities_risk_ratio
          self.goal_rate_of_return = goal_rate_of_return
      """
          손익계산서에서 추출하는 데이터 리스트이다.
          또한 각 항목이 여러 이름으로 불릴 수 있기 떄문에 계산될 수 있는 항목리스트를 가지고 있다.
      """
      def getISDataColumns( self ):
          return {
              '영업이익' : { 
                  '영업이익(손실)' : 0 ,
                  '영업이익' : 0,
                  '영업손실' : 0
              }
          }
      """
          대조대차표에서 추출하는 데이터 리스트이다.
          또한 각 항목이 여러 이름으로 불릴 수 있기 떄문에 계산될 수 있는 항목리스트를 가지고 있다.
      """
      def getBSDataColumns( self):
          return { 
              '유동자산' : { '유동자산' : 0  },
              '투자자산' : {
                  '장기매도가능금융자산' : 0 ,
                  '만기보유금융자산' : 0 ,
                  '상각후원가금융자산' : 0 ,
                  '기타포괄손익-공정가치금융자산' : 0 ,
                  '당기손익-공정가치금융자산' : 0 ,
                  '관계기업 및 공동기업 투자' : 0 ,
              },
              '유동부채' : { '유동부채' : 0 },
              '비유동부채' : { '비유동부채' : 0 },
          }
      def getDFindex( self ):
          return [ '유동자산', '투자자산', '유동부채', '비유동부채', '영업이익', '회사가치' ]
  
      """
          가장최근 분기부터 4년치의 가치를 분석
          4년치의 가치 성장평균을 최근분기가치에 더해서 계산한다. 더할때 비율은 n개년/4 ---- 4개년보다 적을 경우 비율감소
          미래가치와 현재가치의 평균을 최종가치로 평가한다.
          미래, 현재, 평균의 각각 수익률을 계산한다.
      """
      def calculateCompanyValue( self, df, company ):
          for column in df.columns:
              data = df.loc[ : , column]
              value = data['유동자산'] + data['투자자산'] - data['유동부채']*Decimal(self.liabilities_risk_ratio) - data['비유동부채']
              if data['영업이익'] > 0 :
                  value += data['영업이익']*Decimal(0.6)/Decimal(self.goal_rate_of_return)
              df.loc['회사가치' , [column]] = value
  
          # TODO- columns SORT
          self._info = {}
          for column in df.columns:
              self._info[column] = Decimal(df.loc[ '회사가치', column ])
          
          valueDiffSum = Decimal(0)
          for index in range(1, min( 4, len(df.columns)-1 ) ):
              valueDiffSum += Decimal( df.loc[ '회사가치', df.columns[index] ] - df.loc[ '회사가치', df.columns[index-1] ] )
          
          if valueDiffSum != 0 :
              valueDiffSum /= Decimal(3)
  
          self.currentValue = Decimal(df.loc[ '회사가치', df.columns[0] ])
          self.feautureValue = self.currentValue + valueDiffSum
          self.avgValue = ( self.feautureValue + Decimal(df.loc[ '회사가치', df.columns[0] ]) ) / Decimal(2)
          self.currentReturnRatio = Decimal(100)*(( self.currentValue - company.recentTotalStockPrice ) / company.recentTotalStockPrice )
          self.featureReturnRatio = Decimal(100)*(( self.feautureValue - company.recentTotalStockPrice ) / company.recentTotalStockPrice)
          self.avgReturnRatio = Decimal(100)*(( self.avgValue - company.recentTotalStockPrice ) / company.recentTotalStockPrice)
          self.vb_cur_sp = self.currentValue / company.totalStockCount
          self.vb_fea_sp = self.feautureValue / company.totalStockCount
          self.vb_avg_sp = self.avgValue / company.totalStockCount
          self.writeToInfo()
          return df
          
      def writeToInfo( self ):
          self._info['현재가치'] = self.currentValue
          self._info['미래가치'] = self.feautureValue
          self._info['평균가치'] = self.avgValue
          self._info['현재수익률'] = self.currentReturnRatio
          self._info['미래수익률'] = self.featureReturnRatio
          self._info['평균수익률'] = self.avgReturnRatio
          self._info['예상현재주가'] = self.vb_cur_sp
          self._info['예상미래주가'] = self.vb_fea_sp
          self._info['예상평균주가'] = self.vb_avg_sp
  
      def isValuableCompany( self ):
          return self.avgReturnRatio > Decimal(30)
  
      def to_Dict_info( self ):
          return self._info