def test_assemble_yearly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcq/zcqa_2498.djhtm path = './yuantacat/tests/unit/data/income_statement_yearly/2498.html' param = { 'content' : FileUtils().read_file(path), 'stock_symbol' : '2498' } dao = IncomeStatementYearlyAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Y') actual = dao.get_column_name_list() expected = [ u'年', datetime.date(2014, 12, 31), datetime.date(2013, 12, 31), datetime.date(2012, 12, 31), datetime.date(2011, 12, 31), datetime.date(2010, 12, 31), datetime.date(2009, 12, 31), datetime.date(2008, 12, 31), datetime.date(2007, 12, 31) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [u'營業收入淨額', 187911, 203403, 289020, 465795, 278761, 144493, 152353, 118218]) for row in row_list: self.assertEqual(len(row), 9)
def test_assemble_quarterly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcq/zcq_2498.djhtm path = './yuantacat/tests/unit/data/income_statement_quarterly/2498.html' param = { 'content' : FileUtils().read_file(path), 'stock_symbol' : '2498' } dao = IncomeStatementQuarterlyAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Q') actual = dao.get_column_name_list() expected = [ u'期別', datetime.date(2015, 6, 30), datetime.date(2015, 3, 31), datetime.date(2014, 12, 31), datetime.date(2014, 9, 30), datetime.date(2014, 6, 30), datetime.date(2014, 3, 31), datetime.date(2013, 12, 31), datetime.date(2013, 9, 30) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [u'營業收入淨額', 33010, 41524, 47866, 41864, 65060, 33121, 42900, 47048]) for row in row_list: self.assertEqual(len(row), 9)
def test_assemble_yearly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcp/zcp_2498.djhtm path = './yuantacat/tests/unit/data/balance_sheet_summary/2498.html' param = { 'content' : FileUtils().read_file(path), 'stock_symbol' : '2498' } dao = BalanceSheetYearlySummaryAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Y') actual = dao.get_column_name_list() expected = [ u'期別', datetime.date(2014, 12, 31), datetime.date(2013, 12, 31), datetime.date(2012, 12, 31), datetime.date(2011, 12, 31), datetime.date(2010, 12, 31), datetime.date(2009, 12, 31), datetime.date(2008, 12, 31), datetime.date(2007, 12, 31) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [u'流動資產', 110287, 111507, 139659, 192860, 168606, 104901, 104257, 85729]) for row in row_list: self.assertEqual(len(row), 9)
def test_assemble_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zce/zce_2498.djhtm path = './yuantacat/tests/unit/data/profitability/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = ProfitabilityAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Q') actual = dao.get_column_name_list() expected = [ u'季別', u'營業收入', u'營業成本', u'營業毛利', u'毛利率', u'營業利益', u'營益率', u'業外收支', u'稅前淨利', u'稅後淨利' ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [ datetime.date(2015, 6, 30), 33010, 26648, 6362, 0.1927, -5141, -0.1557, -2777, -7918, -8034 ]) for row in row_list: self.assertEqual(len(row), 10)
def test_assemble_quarterly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcp/zcpa_2498.djhtm path = './yuantacat/tests/unit/data/balance_sheet_quarterly/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = BalanceSheetQuarterlyAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Q') actual = dao.get_column_name_list() expected = [ u'期別', datetime.date(2015, 6, 30), datetime.date(2015, 3, 31), datetime.date(2014, 12, 31), datetime.date(2014, 9, 30), datetime.date(2014, 6, 30), datetime.date(2014, 3, 31), datetime.date(2013, 12, 31), datetime.date(2013, 9, 30) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [ u'現金及約當現金', 47233, 51715, 55744, 54672, 48438, 43930, 53299, 43120 ]) for row in row_list: self.assertEqual(len(row), 9)
def test_assemble_yearly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zc3/zc3a_2498.djhtm path = './yuantacat/tests/unit/data/cash_flow_yearly/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = CashFlowYearlyAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Y') actual = dao.get_column_name_list() expected = [ u'期別', datetime.date(2014, 12, 31), datetime.date(2013, 12, 31), datetime.date(2012, 12, 31), datetime.date(2011, 12, 31), datetime.date(2010, 12, 31), datetime.date(2009, 12, 31), datetime.date(2008, 12, 31), datetime.date(2007, 12, 31) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual( row_list[0], [u'稅後淨利', 1483, -1324, 17589, 62299, 39515, 22614, 28553, 28918]) for row in row_list[:-1]: self.assertEqual(len(row), 9) self.assertEqual(row_list[-1], [u'[說明]上列會計科目中,投資收益-權益法、長期投資(新增)、固定資產(購置)、'])
def test_assemble_quarterly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcp/zcp_2498.djhtm path = './yuantacat/tests/unit/data/balance_sheet_summary/2498.html' param = { 'content' : FileUtils().read_file(path), 'stock_symbol' : '2498' } dao = BalanceSheetQuarterlySummaryAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Q') actual = dao.get_column_name_list() expected = [ u'期別', datetime.date(2015, 6, 30), datetime.date(2015, 3, 31), datetime.date(2014, 12, 31), datetime.date(2014, 9, 30), datetime.date(2014, 6, 30), datetime.date(2014, 3, 31), datetime.date(2013, 12, 31), datetime.date(2013, 9, 30) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [u'流動資產', 105701, 114095, 110287, 110883, 122386, 103908, 111507, 112025]) for row in row_list: self.assertEqual(len(row), 9)
def test_assemble_quarterly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zc3/zc3_2498.djhtm path = './yuantacat/tests/unit/data/cash_flow_quarterly/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = CashFlowQuarterlyAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Q') actual = dao.get_column_name_list() expected = [ u'期別', datetime.date(2015, 6, 30), datetime.date(2015, 3, 31), datetime.date(2014, 12, 31), datetime.date(2014, 9, 30), datetime.date(2014, 6, 30), datetime.date(2014, 3, 31), datetime.date(2013, 12, 31), datetime.date(2013, 9, 30) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual( row_list[0], [u'稅後淨利', -8034, 360, 466, 641, 2257, -1881, 315, -2974]) for row in row_list[:-1]: self.assertEqual(len(row), 9) self.assertEqual(row_list[-1], [u'[說明]上列會計科目中,投資收益-權益法、長期投資(新增)、固定資產(購置)、'])
def test_assemble_yearly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcr/zcra_2498.djhtm path = './yuantacat/tests/unit/data/financial_analysis_yearly/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = FinancialAnalysisYearlyAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Y') actual = dao.get_column_name_list() expected = [ u'期別', datetime.date(2014, 12, 31), datetime.date(2013, 12, 31), datetime.date(2012, 12, 31), datetime.date(2011, 12, 31), datetime.date(2010, 12, 31), datetime.date(2009, 12, 31), datetime.date(2008, 12, 31), datetime.date(2007, 12, 31) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [ u'淨值報酬率─稅後', 1.88, -1.68, 19.25, 70.34, 56.29, 35.79, 48.86, 58.48 ])
def test_assemble_yearly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcp/zcpb_2498.djhtm path = './yuantacat/tests/unit/data/balance_sheet_yearly/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = BalanceSheetYearlyAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Y') actual = dao.get_column_name_list() expected = [ u'期別', datetime.date(2014, 12, 31), datetime.date(2013, 12, 31), datetime.date(2012, 12, 31), datetime.date(2011, 12, 31), datetime.date(2010, 12, 31), datetime.date(2009, 12, 31), datetime.date(2008, 12, 31), datetime.date(2007, 12, 31) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [ u'現金及約當現金', 55744, 53299, 53878, 87502, 74463, 64638, 64238, 56490 ]) for row in row_list: self.assertEqual(len(row), 9)
def test_assemble_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcc/zcc_2498.djhtm path = './yuantacat/tests/unit/data/dividend_policy/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = DividendPolicyAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Y') actual = dao.get_column_name_list() expected = [ u'年度', u'現金股利', u'盈餘配股', u'公積配股', u'股票股利', u'合計', u'員工配股率%' ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual( row_list[0], [datetime.date(2014, 12, 31), 0.38, 0, 0, 0, 0.38, 0.0000]) self.assertEqual(row_list[4], [ datetime.date(2010, 12, 31), 37, 0.5000000092, 0, 0.5000000092, 37.5000000092, 0.0050 ]) for row in row_list: self.assertEqual(len(row), 7)
def test_assemble_quarterly_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcr/zcr_2498.djhtm path = './yuantacat/tests/unit/data/financial_analysis_quarterly/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = FinancialAnalysisQuarterlyAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Q') actual = dao.get_column_name_list() expected = [ u'期別', datetime.date(2015, 6, 30), datetime.date(2015, 3, 31), datetime.date(2014, 12, 31), datetime.date(2014, 9, 30), datetime.date(2014, 6, 30), datetime.date(2014, 3, 31), datetime.date(2013, 12, 31), datetime.date(2013, 9, 30) ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [u'獲利能力']) self.assertEqual( row_list[1], [u'營業毛利率', 19.27, 19.66, 20.36, 22.89, 22.23, 21.03, 17.8, 20.35])
def test_assemble_raise_no_record_assemble_error(self): # online: http://jdata.yuanta.com.tw/z/zc/zcp/zcp_3009.djhtm path = './yuantacat/tests/unit/data/error/balance_sheet_summary_not_found_error.html' param = { 'content' : FileUtils().read_file(path), 'stock_symbol' : '3009' } with self.assertRaises(NoRecordAssembleError) as context: BalanceSheetQuarterlySummaryAssembler().assemble(param) self.assertEqual(context.exception.param['stock_symbol'], param['stock_symbol'])
def test_assemble_yearly_raise_no_record_assemble_error(self): # online: http://jdata.yuanta.com.tw/z/zc/zcq/zcqa_3009.djhtm path = './yuantacat/tests/unit/data/error/income_statement_yearly_not_found_error.html' param = { 'content' : FileUtils().read_file(path), 'stock_symbol' : '3009' } with self.assertRaises(NoRecordAssembleError) as context: IncomeStatementYearlyAssembler().assemble(param) self.assertEqual(context.exception.param['stock_symbol'], param['stock_symbol'])
def test_assemble_quarterly_raise_no_record_assemble_error(self): # online: http://jdata.yuanta.com.tw/z/zc/zcr/zcr_3009.djhtm path = './yuantacat/tests/unit/data/error/financial_analysis_quarterly_not_found_error.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '3009' } with self.assertRaises(NoRecordAssembleError) as context: FinancialAnalysisQuarterlyAssembler().assemble(param) self.assertEqual(context.exception.param['stock_symbol'], param['stock_symbol'])
def test_assemble_raise_no_record_assemble_error(self): # online: http://jdata.yuanta.com.tw/z/zc/zch/zch_3009.djhtm path = './yuantacat/tests/unit/data/error/operating_revenue_not_found_error.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '3009' } with self.assertRaises(NoRecordAssembleError) as context: OperatingRevenueAssembler().assemble(param) self.assertEqual(context.exception.param['stock_symbol'], param['stock_symbol'])
class FileSpiderStorage(): def __init__(self): self.file_utils = FileUtils() self.base_path = './yuantacat/data/' def set(self, key, url): filepath = self.__build_filepath(key) self.file_utils.copy_url_to_file(url, filepath) def contains(self, key): filepath = self.__build_filepath(key) return self.file_utils.is_file(filepath) def get(self, key): filepath = self.__build_filepath(key) return self.file_utils.read_file(filepath) def __build_filepath(self, key): relative_path = '''{key}.html'''.format(key=key) return self.file_utils.join_paths(self.base_path, relative_path)
def test_assemble_raise_no_record_assemble_error(self): # online: http://jdata.yuanta.com.tw/z/zc/zcb/zcb_3009.djhtm path = './yuantacat/tests/unit/data/error/capital_increase_history_not_found_error.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '3009' } with self.assertRaises(NoRecordAssembleError) as context: CapitalIncreaseHistoryAssembler().assemble(param) self.assertEqual(context.exception.param['stock_symbol'], param['stock_symbol'])
def test_assemble_2498(self): # online: http://real-chart.finance.yahoo.com/table.csv?s=2498.TW&ignore=.csv path = './yuantacat/tests/unit/data/stock_price/2498.html' param = { 'content' : FileUtils().read_file(path), 'stock_symbol' : '2498' } dao = StockPriceAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) actual = dao.get_column_name_list() expected = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [datetime.date(2015, 10, 23), 80.9, 81.3, 76.8, 77.0, 23948000, 77.0]) for row in row_list: self.assertEqual(len(row), 7)
def test_assemble_otc_market(self): # online: http://isin.twse.com.tw/isin/C_public.jsp?strMode=4 path = './yuantacat/tests/unit/data/stock_symbol/otc_market.html' param = {'content': FileUtils().read_file(path)} dao = StockSymbolAssembler().assemble(param) actual = dao.get_column_name_list() expected = [ u'有價證券代號', u'名稱', u'國際證券辨識號碼(ISIN Code)', u'上市日', u'市場別', u'產業別', u'CFICode', u'備註' ] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [ u'5364', u'力麗店', u'TW0005364004', datetime.date(2013, 8, 26), u'上櫃', u'其他業', u'ESVUFR', u'' ]) for row in row_list: self.assertEqual(len(row), 8) self.assertEqual(dao.get_release_date(), datetime.date(2015, 8, 7))
class DataCreator(): def __init__(self): self.json_utils = JsonUtils() self.file_utils = FileUtils() self.data_merger = DataMerger() def create(self, param): json = self.__build_json(param) path = self.__build_path(param) self.__save(json, path) def __build_json(self, param): return self.data_merger.merge(param) def __build_path(self, param): if 'path' in param: return param['path'] else: relative_path = '''{key}.json'''.format(key=param['stock_symbol']) return self.file_utils.join_paths(param['base_path'], relative_path) def __save(self, json, path): self.json_utils.save(json, path)
def test_assemble_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zch/zch_2498.djhtm path = './yuantacat/tests/unit/data/operating_revenue/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = OperatingRevenueAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'M') actual = dao.get_column_name_list() expected = [u'年/月', u'合併營收', u'月增率', u'去年同期', u'年增率', u'累計營收', u'年增率'] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [ datetime.date(2015, 8, 31), 6889966, -0.0699, 14541044, -0.5262, 88831474, -0.2797 ]) for row in row_list: self.assertEqual(len(row), 7)
def test_assemble_2498(self): # online: http://jdata.yuanta.com.tw/z/zc/zcb/zcb_2498.djhtm path = './yuantacat/tests/unit/data/capital_increase_history/2498.html' param = { 'content': FileUtils().read_file(path), 'stock_symbol': '2498' } dao = CapitalIncreaseHistoryAssembler().assemble(param) self.assertEqual(dao.get_stock_symbol(), param['stock_symbol']) self.assertEqual(dao.get_period(), 'Y') actual = dao.get_column_name_list() expected = [u'年度', u'現金增資', u'比重', u'盈餘轉增資', u'比重', u'公積及其他', u'比重'] self.assertEqual(actual, expected) row_list = dao.get_row_list() self.assertEqual(row_list[0], [ datetime.date(2015, 12, 31), 14.464519, 0.1747, 67.724067, 0.8180, 0.598634, 0.0072 ]) for row in row_list: self.assertEqual(len(row), 7)
def __init__(self): self.json_utils = JsonUtils() self.file_utils = FileUtils() self.data_merger = DataMerger()
def __init__(self): self.file_utils = FileUtils() self.base_path = './yuantacat/data/'