コード例 #1
0
ファイル: test_sqlplus.py プロジェクト: nalssee/pydwork
    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')
コード例 #2
0
ファイル: test_sqlplus.py プロジェクト: nalssee/pydwork
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])