def setUp(self): self.rs1 = [] for year in range(2001, 2011): r = Row() r.yyyy = year self.rs1.append(r) self.rs1 = PRows(self.rs1, 'yyyy') self.rs2 = [] start_month = 200101 for i in range(36): r = Row() r.yyyymm = yyyymm(start_month, i) self.rs2.append(r) self.rs2 = PRows(self.rs2, 'yyyymm') self.rs3 = [] start_date = 20010101 for i in range(30): r = Row() r.yyyymmdd = yyyymmdd(start_date, i) self.rs3.append(r) self.rs3 = PRows(self.rs3, 'yyyymmdd') with dbopen(':memory:') as c: c.save('indport.csv') # to pseudo monthly data rs = [] for rs1 in c.reel('indport order by date', group=lambda r: str(r.date)[0:4]): for r in rs1: r.yyyy = int(str(r.date)[0:4]) r.fcode = 'A' + str(r.date)[4:] del r.date rs.append(r) self.indport = PRows(rs, 'yyyy', 'fcode') rs = [] for rs1 in c.reel('indport order by date', group=lambda r: str(r.date)[0:6]): for r in rs1: r.yyyymm = int(str(r.date)[0:6]) r.fcode = 'A' + str(r.date)[6:] del r.date rs.append(r) self.indport1 = PRows(rs, 'yyyymm', 'fcode')
class TestPRows(unittest.TestCase): def setUp(self): self.rs1 = [] for year in range(2001, 2011): r = Row() r.yyyy = year self.rs1.append(r) self.rs1 = PRows(self.rs1, 'yyyy') self.rs2 = [] start_month = 200101 for i in range(36): r = Row() r.yyyymm = yyyymm(start_month, i) self.rs2.append(r) self.rs2 = PRows(self.rs2, 'yyyymm') self.rs3 = [] start_date = 20010101 for i in range(30): r = Row() r.yyyymmdd = yyyymmdd(start_date, i) self.rs3.append(r) self.rs3 = PRows(self.rs3, 'yyyymmdd') with dbopen(':memory:') as c: c.save('indport.csv') # to pseudo monthly data rs = [] for rs1 in c.reel('indport order by date', group=lambda r: str(r.date)[0:4]): for r in rs1: r.yyyy = int(str(r.date)[0:4]) r.fcode = 'A' + str(r.date)[4:] del r.date rs.append(r) self.indport = PRows(rs, 'yyyy', 'fcode') rs = [] for rs1 in c.reel('indport order by date', group=lambda r: str(r.date)[0:6]): for r in rs1: r.yyyymm = int(str(r.date)[0:6]) r.fcode = 'A' + str(r.date)[6:] del r.date rs.append(r) self.indport1 = PRows(rs, 'yyyymm', 'fcode') def test_indi_sort(self): with self.assertRaises(ValueError): # there are not enough element to make portfolios in 2009 self.indport.pn('cnsmr', 2).pn('manuf', 3).pavg('other') avgport = self.indport.where(lambda r: r.yyyy < 2009)\ .pn('cnsmr', 2).pn('manuf', 3).pavg('other') self.assertEqual(avgport[0].n, 76) self.assertEqual(avgport[1].n, 45) self.assertEqual(avgport[2].n, 3) self.assertEqual(avgport[3].n, 7) self.assertEqual(avgport[4].n, 37) self.assertEqual(avgport[5].n, 80) self.assertEqual(round(avgport[0].other, 2), -0.63) indport = self.indport.where(lambda r: r.yyyy < 2009).pn('cnsmr', 10) other1 = [] for year in range(2001, 2009): other1.append(mean0(indport.where(lambda r: r.pn_cnsmr == 1 and r.yyyy == year)['other'])) self.assertEqual(other1, [-1.249, -1.418, -0.838, -0.98, -0.944, -1.027, -1.75, -4.143]) other10 = [] for year in range(2001, 2009): other10.append(mean0(indport.where(lambda r: r.pn_cnsmr == 10 and r.yyyy == year)['other'])) self.assertEqual(other10, [1.415, 1.486, 1.235, 0.96, 1.062, 1.174, 1.34, 4.014]) pat = self.indport.where(lambda r: r.yyyy < 2009)\ .pn('cnsmr', 10).pavg('other', pncols='pn_cnsmr').pat('pn_cnsmr') self.assertEqual(round(st.mean(other10) - st.mean(other1), 2), float(pat.lines[0][11][:4])) indport = self.indport.where(lambda r: r.yyyy < 2009).pn('cnsmr', 2).pn('manuf', 3) # pavg.show() other21 = [] other23 = [] for year in range(2001, 2009): pavg1 = indport.where(lambda r: r.pn_cnsmr == 2 and r.pn_manuf == 1 and r.yyyy == year)['other'] pavg2 = indport.where(lambda r: r.pn_cnsmr == 2 and r.pn_manuf == 3 and r.yyyy == year)['other'] other21.append(st.mean(pavg1)) other23.append(st.mean(pavg2)) pat = indport.pavg('other').pat().lines self.assertEqual(round(st.mean(other21), 3), float(pat[2][1].split()[0])) self.assertEqual(round(st.mean(other23), 3), float(pat[2][3].split()[0])) self.assertEqual(round(st.mean(other23) - st.mean(other21), 3), float(pat[2][4][:5])) indport.pavg('other', pncols='pn_cnsmr, pn_manuf').pat().csv() def test_indi_sort2(self): "weighted average" avgport = self.indport.where(lambda r: r.yyyy <= 2015).pn('cnsmr', 10) hlth = avgport.where(lambda r: r.yyyy == 2001 and r.pn_cnsmr == 3)['hlth'] other = avgport.where(lambda r: r.yyyy == 2001 and r.pn_cnsmr == 3)['other'] total = sum(hlth) result = [] for x, y in zip(other, hlth): result.append(x * y / total) self.assertEqual(sum(result), avgport.pavg('other', 'hlth')\ .where(lambda r: r.yyyy == 2001 and r.pn_cnsmr == 3)['other'][0]) def test_indi_sort3(self): def fn(rs): n = round(len(rs) / 2) return [rs[:n], rs[n:]] self.assertEqual(self.indport.pn('cnsmr', 2).pavg('other').pat().lines, self.indport.pn('cnsmr', fn).pavg('other').pat().lines) def test_dpn(self): avgport = self.indport.pn('cnsmr', 4).dpn('manuf', 3, 'hlth', 2).pavg('other') for r in avgport.where(lambda r: r.yyyy < 2016): self.assertTrue(r.n == 10 or r.n == 11) seq1 = avgport.where(lambda r: r.pn_cnsmr == 3 and r.pn_manuf == 1 and r.pn_hlth == 2)['other'] seq2 = avgport.where(lambda r: r.pn_cnsmr == 3 and r.pn_manuf == 3 and r.pn_hlth == 2)['other'] pat = avgport.pat().lines self.assertEqual(round(st.mean(seq1), 3), float(pat[14][2].split()[0])) self.assertEqual(round(st.mean(seq2), 3), float(pat[16][2].split()[0])) self.assertEqual(round(st.mean(seq2) - st.mean(seq1), 3), float(pat[17][2][:5])) def test_pnroll(self): a = self.indport.between(2003).dpnroll(5, 'cnsmr', 5, 'manuf', 4) for rs in a.roll(5, 5): for rs1 in rs.order('fcode, yyyy').group('fcode'): self.assertTrue(same(rs1['pn_cnsmr, pn_manuf'])) xs = a.pavg('other') self.assertEqual(round(xs[0].other, 3), -1.013) self.assertEqual(round(xs[-1].other, 3), -0.426) a = self.indport.between(2003).pnroll(5, 'cnsmr', 5, 'manuf', 4, 'hi_tec', 3) for rs in a.roll(5, 5): for rs1 in rs.order('fcode, yyyy').group('fcode'): self.assertTrue(same(rs1['pn_cnsmr, pn_manuf, pn_hi_tec'])) with self.assertRaises(Exception): a.pavg('other') a = self.indport.between(2003).pnroll(5, 'cnsmr', 5, 'manuf', 4) # independent sort raises exception because there is not enough elements with self.assertRaises(Exception): a.pavg('other') a = self.indport.between(2003).pnroll(5, 'cnsmr', 2, 'manuf', 2) xs = a.pavg('other') self.assertEqual(round(xs[0].other, 3), -0.338) self.assertEqual(round(xs[-1].other, 3), -0.014) def test_pns(self): self.indport.dpn('cnsmr', 4, 'manuf', 3, 'hlth', 2) self.assertEqual(len(self.indport.pncols), 3) self.indport.pncols.clear() self.indport.dpn('cnsmr', 2, 'manuf', 3) self.assertEqual(len(self.indport.pncols), 2) def test_famac(self): fit = self.indport.famac('other ~ cnsmr + manuf + hi_tec + hlth') self.assertEqual(round(fit[0].intercept, 2), 0.02) self.assertEqual(round(fit[0].cnsmr, 2), 0.44) self.assertEqual(round(fit[0].manuf, 2), 0.16) self.assertEqual(round(fit[0].hi_tec, 2), 0.03) self.assertEqual(round(fit[0].hlth, 2), 0.10) fitavg = fit.tsavg() for var, val in zip(['cnsmr', 'manuf', 'hi_tec', 'hlth'], fitavg.lines[1][2:]): self.assertEqual(mean1(fit[var]), val) def test_rollover(self): lengths = [] for rs0 in self.rs1.roll(3, 2): lengths.append(len(rs0)) self.assertEqual(lengths, [3, 3, 3, 3, 2]) lengths = [] for rs0 in self.rs2.where(lambda r: r.yyyymm > 200103).roll(12, 12): lengths.append(len(rs0)) self.assertEqual(lengths, [12, 12, 9]) lengths = [] for rs0 in self.rs2.where(lambda r: r.yyyymm > 200103).roll(24, 12): lengths.append(len(rs0)) self.assertEqual(lengths, [24, 21, 9]) lengths = [] for rs0 in self.rs3.roll('2 weeks', '1 week'): lengths.append(len(rs0)) self.assertEqual(lengths, [14, 14, 14, 9, 2])