def __init__(self, state_dim, action_dim, learner_args):
        super(PPO, self).__init__()
        self.data = []
        self.model_path = learner_args['model_path']
        self.device = learner_args['device']
        hidden_dim=128
        self.fc1   = nn.Linear(state_dim,hidden_dim)
        # self.fc_pi = nn.Linear(hidden_dim,action_dim)
        self.fc_v  = nn.Linear(hidden_dim,1)

        self.cdt = CDT(learner_args).to(self.device)
        self.pi = lambda x: self.cdt.forward(x, LogProb=False)[1]

        self.optimizer = optim.Adam(list(self.parameters())+list(self.cdt.parameters()), lr=learning_rate)
def obtenerCDT():
    url = 'https://www.davivienda.com/wps/portal/personas/nuevo/personas/aqui_puedo/construir_mi_futuro/inversiones/cdt/a0487af0-343f-4c94-bc79-9943220507a0/!ut/p/z1/pVPJbsIwEP0VeuBo2bEdjI8JiDZUKapSlviCnJBURs1C1tKvr9NDq4JIKnVO9vi9mXkzHijgDopUNupVVipL5Zu--2KyJ9Nn-rS0sTtbYRNZrmvP58w1vAWD298Ab8GJBiBvZvGVgR4JFD3PDhriG__ir-7x3_johlloiL-B_gz6a28THNsBMc5FsMFmXgNEf63LwQT2d63C0OnEkLx-QDfefoDRD_gaUG-ETvSQbF-3jd2IwPELgdtGRS1cp1mR6D_tdRHzUB2gjyU7GChAgFDTBJShKeDSRACzgEWY44BOTfhw1djrPuk9UcfTSVhQhFlaRe8V3LVhslf6XKRRtc-jotQbVY6RSlWosjH68chTrUZ5HR20V7PLqqhVMUrUKK6rusg6SqPBeiOj8lLsxYw3k9tiJaJTJuNOLIkBDTkFQcg44JwSjJGJmEQwT9ba0rMCIvYc5QB_2bRn8mG71t0nvUXbUg!!/dz/d5/L2dBISEvZ0FBIS9nQSEh/'

    html = requests.get(url).content

    soup = BeautifulSoup(html, 'html.parser')

    a = soup.find('a', string = 'Ver tasas vigentes')

    linkPDF = a['href']

    nombrePDF = 'CDTDavivienda.pdf'

    file = Path(nombrePDF)

    pdfResponse = requests.get('https://www.davivienda.com' + linkPDF)
    file.write_bytes(pdfResponse.content)

    #No reconoce el header con los plazos en dias, toca cambiarlo gradualmente
    plazos = [30,56,86,116,141,186,356,540,720]
    df = tabula.read_pdf(nombrePDF, pages=22, relative_area=True, area=(49.05, 0, 68.5, 100))
    info = df.values.tolist()
    montoMinimo = 500000
    tasas = info[0]
    listaCdts =[]
    i = 0
    for col in tasas:
        if i in range(2,11):
            tasa = float(col.strip('%'))
            cdt = CDT('Davivienda',plazos[i-2],tasa, montoMinimo, None)
            listaCdts.append(cdt)
        i+=1

    os.remove(nombrePDF)
    return listaCdts
Example #3
0
def obtenerCDT():
    #El url del pdf que tiene las tasas
    url = 'https://www.bancocajasocial.com/sites/default/files/files/tasascdt.pdf'

    #El archivo donde se va a guardar el pdf
    nombrePDF = "CDTBancoCajaSocial.pdf"
    file = Path(nombrePDF)

    #Guardar el pdf
    pdfResponse = requests.get(url)
    file.write_bytes(pdfResponse.content)

    # Lee el area marcada del pdf (top, left, bottom, right) y lo convierte a un dataframe
    df = tabula.read_pdf(nombrePDF, relative_area=True, area=(25, 6, 75, 94))

    info = df.values.tolist()

    montoMin = int(''.join(x for x in info[2][1] if x.isdigit()))
    listaCdts = []
    i = 0
    for fila in info:
        if i in range(5, 10):
            plazoDias = int(re.search(r'\d+', fila[0]).group())
            tasa = float(fila[1].strip('%'))
            cdt = CDT('Banco Caja Social', plazoDias, tasa, montoMin, None)
            listaCdts.append(cdt)
        i += 1

    os.remove(nombrePDF)

    return listaCdts
Example #4
0
def obtenerCDT():

    # url del pdf que contiene las tasas
    url = 'https://www.bancodeoccidente.com.co/wps/wcm/connect/banco-de-occidente/c24390e8-b984-44de-b427-e59ff152a22c/tasas-personas-2019.pdf?MOD=AJPERES&CVID=mCXPoS8'

    # El archivo donde se va a guardar el pdf
    nombrePDF = "CDTBancoDeOccidente.pdf"
    file = Path(nombrePDF)

    # guardar el pdf
    pdfResponse = requests.get(url)
    file.write_bytes(pdfResponse.content)

    # Lee el area marcada del pdf (top, left, bottom, right) y lo convierte a un dataFrame
    df = tabula.read_pdf(nombrePDF,
                         pages=5,
                         relative_area=True,
                         area=(19, 72, 34, 94))

    info = df.values.tolist()

    listaCDTs = []

    for i in info:
        dias = ""

        for j in i:

            if str(j) == "nan":
                break
            else:

                if (dias == ""):
                    jAct = str(j)[:4]
                    jAct = jAct.strip("D")
                    jAct = jAct.strip()
                    dias = jAct
                else:
                    jtasas = j.replace(',', '.')
                    jtasas = jtasas.split("%")
                    del jtasas[3]

                    t = 0
                    for ts in jtasas:
                        montoMin = 0

                        if (t == 0):
                            montoMin = 1000000
                        elif (t == 1):
                            montoMin = 100000000
                        else:
                            montoMin = 500000000

                        cdt = CDT('Banco de Occidente', int(dias), float(ts),
                                  None, int(montoMin))
                        listaCDTs.append(cdt)
                        t += 1
    return listaCDTs
Example #5
0
def obtenerCDT():
    url = 'https://www.bbva.com.co/personas/productos/inversion/cdt/tradicional.html#tasas-de-interes-e.a'

    html = requests.get(url).content

    soup = BeautifulSoup(html, 'html.parser')

    tabla = soup.findAll('div', class_='table--value')

    filas = []

    cdts = []

    montoMinimo = 1000000

    plazos = [60, 90, 129, 150, 180, 240, 370, 300, 330, 365]

    for div in tabla:
        a = div.text
        b = a.replace('\n', '')
        c = b.replace('     ', '')
        d = c.replace('   ', '')
        if '$' in d:
            filas.append(d)
        else:
            e = d.replace(' ', '')
            filas.append(e)

    contador = 0
    #print(filas)

    for i in range(len(filas)):
        if filas[i].isdigit():
            if 'NOAPLICA' in filas[i + 1]:
                rango = 365
                tasa = float(filas[i + 2].replace('%', '').replace(',', '.'))
                cdt = CDT('BBVA', rango, tasa, None, montoMinimo)
                cdts.append(cdt)
            else:
                rango = plazos[contador]
                tasa = float(filas[i + 2].replace('%', '').replace(',', '.'))
                cdt = CDT('BBVA', rango, tasa, None, montoMinimo)
                cdts.append(cdt)
                contador = contador + 1
    return cdts
def obtenerCDT():
    url = 'https://www.bancopopular.com.co/wps/portal/bancopopular/inicio/informacion-interes/tasas#table-rates-cdt'

    html = requests.get(url).content

    soup = BeautifulSoup(html, 'html.parser')

    tabla = soup.find_all("table", {"class": "simple-table"})[0]

    body = tabla.find('tbody')
    head = tabla.find('thead')
    i = 0
    plazos = []
    tasas = []
    montoMinimo = -1
    for child in head.children:
        if type(child) is bs4.Tag:
            if i == 0:
                i += 1
            else:
                for th in child.children:
                    if type(th) is bs4.Tag:
                        plazo = int(re.search(r'\d+', th.string).group())
                        plazos.append(plazo)

    i = 0
    for child in body.children:
        if type(child) is bs4.Tag:
            for td in child.children:
                if type(td) is bs4.Tag:
                    if i == 0:
                        montoMinimo = int(
                            td.string.split('a')[0].split('$')[1].strip(
                                '').replace('.', ''))
                        i = 1
                    else:
                        tasa = float(td.string.strip('%').replace(',', '.'))
                        tasas.append(tasa)

            break

    i = 0
    listaCdts = []
    while i < len(plazos):
        cdt = CDT('Banco Popular', plazos[i], tasas[i], montoMinimo, None)
        listaCdts.append(cdt)
        i += 1

    for cdt in listaCdts:
        print(
            str(cdt.montoInversion) + "_" + str(cdt.plazoMinDias) + "_" +
            str(cdt.tasaEA) + "_" + cdt.banco)
    return listaCdts
Example #7
0
def obtenerCDT():
    url = 'https://www.avvillas.com.co/wps/portal/avvillas/banco/banca-personal/productos/ahorro-e-inversion/cdt-av-villas/!ut/p/z1/04_Sj9CPykssy0xPLMnMz0vMAfIjo8zifQIszTwsTQx8LAJ8LAwcQz28PMz8XYwtfYz0w_EpCPYw1Y8iRr8BDuBoQJx-PAqi8Bsfrh-FxwovF29D_AqMHU3wKjAODjEgoAAUSIScWZAbGhphkOmZ6aioCADbOL_N/dz/d5/L2dBISEvZ0FBIS9nQSEh/'

    html = requests.get(url).content

    soup = BeautifulSoup(html, 'html.parser')

    tabla = soup.findAll('table')[1]

    filas = []

    cdts = []

    plazos = [90, 120, 180, 360, 540]

    montoMinimo = 10000000

    for child in tabla.children:
        if type(child) is bs4.Tag:
            for tsup in child.children:
                if type(tsup) is bs4.Tag:
                    cols = []
                    for td in tsup.children:
                        if type(td) is bs4.Tag:
                            if td.string != None:
                                cols.append(td.string)
                    if len(cols) > 0:
                        filas.append(cols)

    print(filas)

    contador = 0

    for fila in filas:
        if fila == filas[2]:
            for col in fila:
                if '%' in col:
                    col1 = col.replace('%', '')
                    tasa = float(col1)
                    cdt = CDT('AvVillas', plazos[contador], tasa, None,
                              montoMinimo)
                    cdts.append(cdt)
    return cdts
Example #8
0
def obtenerCDT():
    url = 'https://www.itau.co/tasasytarifas'

    html = requests.get(url).content

    soup = BeautifulSoup(html, 'html.parser')

    a = soup.find('a', string='Tasas productos pasivos')

    linkPDF = a['href']

    nombrePDF = 'CDTItau.pdf'

    file = Path(nombrePDF)

    pdfResponse = requests.get('https://www.itau.co' + linkPDF)
    file.write_bytes(pdfResponse.content)

    df = tabula.read_pdf(nombrePDF,
                         relative_area=True,
                         area=(76, 0, 96.16, 100))
    info = df.values.tolist()
    montoMinimo = 1000000
    listaCdts = []
    i = 0
    limite = len(info)
    while i < limite:
        plazo = int(re.search(r'\d+', info[i + 1][0]).group())
        tasa = ''
        if isinstance(info[i][2], str):
            tasa = float(info[i][2].strip('%'))
        else:
            tasa = float(info[i + 1][2].strip('%'))
        cdt = CDT('Itau', plazo, tasa, montoMinimo, None)
        listaCdts.append(cdt)
        i += 3

    os.remove(nombrePDF)
    return listaCdts
def obtenerCDT():

    url = 'https://www.bancow.com.co/wp-content/uploads/2019/03/Precios-y-tarifas-vigentes-cdt-marzo-26-2019.pdf'

    nombrePDF = "CDTBancoWWB.pdf"
    file = Path(nombrePDF)

    pdfResponse = requests.get(url)
    file.write_bytes(pdfResponse.content)

    df = tabula.read_pdf(nombrePDF)
    #print(df)

    info = df.values.tolist()
    print(info)

    #rangos = [info[0][1], info[0][2],info[0][3],info[0][4],info[0][5],info[0][6],info[0][7],info[1][8]]

    rangos = [60,90,120,180,270,360,540,720]

    montoMinimo = 1000000

    cdts = []

    for fila in info:
        filaActual = info.index(fila)
        if filaActual == 3:
            for col in fila:
                colActual = fila.index(col)
                monto = info[filaActual][0]
                if colActual > 0:
                    porcentaje = float(info[filaActual][colActual].replace('%', '').replace(',','.'))
                    rangoo = rangos[colActual-1]
                    cdt = CDT('WWB', rangoo, porcentaje, None, montoMinimo)
                    cdts.append(cdt)
    return cdts
class PPO(nn.Module):
    def __init__(self, state_dim, action_dim, learner_args):
        super(PPO, self).__init__()
        self.data = []
        self.model_path = learner_args['model_path']
        self.device = learner_args['device']
        hidden_dim=128
        self.fc1   = nn.Linear(state_dim,hidden_dim)
        # self.fc_pi = nn.Linear(hidden_dim,action_dim)
        self.fc_v  = nn.Linear(hidden_dim,1)

        self.cdt = CDT(learner_args).to(self.device)
        self.pi = lambda x: self.cdt.forward(x, LogProb=False)[1]

        self.optimizer = optim.Adam(list(self.parameters())+list(self.cdt.parameters()), lr=learning_rate)

    def v(self, x):
        if isinstance(x, (np.ndarray, np.generic) ):
            x = torch.tensor(x)
        x = F.relu(self.fc1(x))
        v = self.fc_v(x)
        return v
      
    def put_data(self, transition):
        self.data.append(transition)
        
    def make_batch(self):
        s_lst, a_lst, r_lst, s_prime_lst, prob_a_lst, done_lst = [], [], [], [], [], []
        for transition in self.data:
            s, a, r, s_prime, prob_a, done = transition
            
            s_lst.append(s)
            a_lst.append([a])
            r_lst.append([r])
            s_prime_lst.append(s_prime)
            prob_a_lst.append([prob_a])
            done_mask = 0 if done else 1
            done_lst.append([done_mask])
            
        s,a,r,s_prime,done_mask, prob_a = torch.tensor(s_lst, dtype=torch.float).to(self.device), torch.tensor(a_lst).to(self.device), \
                                          torch.tensor(r_lst).to(self.device), torch.tensor(s_prime_lst, dtype=torch.float).to(self.device), \
                                          torch.tensor(done_lst, dtype=torch.float).to(self.device), torch.tensor(prob_a_lst).to(self.device)
        self.data = []
        return s, a, r, s_prime, done_mask, prob_a
        
    def train_net(self):
        s, a, r, s_prime, done_mask, prob_a = self.make_batch()

        for i in range(K_epoch):
            td_target = r + gamma * self.v(s_prime) * done_mask
            delta = td_target - self.v(s)
            delta = delta.detach()

            advantage_lst = []
            advantage = 0.0
            for delta_t in torch.flip(delta, [0]):
                advantage = gamma * lmbda * advantage + delta_t[0]
                advantage_lst.append([advantage])
            advantage_lst.reverse()
            advantage = torch.tensor(advantage_lst, dtype=torch.float).to(self.device)

            pi = self.pi(s)
            pi_a = pi.gather(1,a)
            ratio = torch.exp(torch.log(pi_a) - torch.log(prob_a))  # a/b == exp(log(a)-log(b))
            surr1 = ratio * advantage
            surr2 = torch.clamp(ratio, 1-eps_clip, 1+eps_clip) * advantage
            loss = -torch.min(surr1, surr2) + F.smooth_l1_loss(self.v(s) , td_target.detach())

            self.optimizer.zero_grad()
            loss.mean().backward()
            self.optimizer.step()

    def choose_action(self, s, Greedy=False):
        prob = self.pi(torch.from_numpy(s).unsqueeze(0).float().to(self.device)).squeeze()  # make sure input state shape is correct
        if Greedy:
            a = torch.argmax(prob, dim=-1).item()
            return a
        else:
            m = Categorical(prob)
            a = m.sample().item()
            return a, prob  

    def load_model(self, ):
        self.load_state_dict(torch.load(self.model_path))
def obtenerCDT():
    #url del pdf que contiene las tasas
    url = 'https://cdn.agilitycms.com/scotiabank-colombia/Colpatria/pdf/acerca-de/tasas/Tasas-CDT-personas.pdf'

    #El archivo donde se va a guardar el pdf
    nombrePDF = "CDTColpatria.pdf"
    file = Path(nombrePDF)

    #guardar el pdf
    pdfResponse = requests.get(url)
    file.write_bytes(pdfResponse.content)

    # Lee el area marcada del pdf (top, left, bottom, right) y lo convierte a un dataFrame
    df = tabula.read_pdf(nombrePDF, relative_area=True, area=(25, 6, 75, 94))

    #dataFrame convertifo en lista
    info = df.values.tolist()

    print(info)

    listaCDTs = []

    plazos = []

    for i in info:
        entroPlazo = False
        montoAct = ""
        k = 0
        for j in i:

            if str(j) == 'MESES' or str(j) == 'RANGOS':
                break

            elif str(j) == 'PLAZO' or entroPlazo == True:
                if str(j) == 'PLAZO':
                    entroPlazo = True
                elif (entroPlazo == True):

                    jAct = str(j)[0:3]
                    jAct = jAct.strip('-')

                    if (str(j).startswith('>')):
                        jAct = str(j)[-4:]
                        jAct = jAct.strip()

                    if jAct != 'nan':
                        plazos.append(jAct)

            else:

                if str(j) == '1.000.000 49.999.999':
                    montoAct = 1000000
                    continue
                elif str(j) == '50.000.000 99.999.999':
                    montoAct = 50000000
                    continue
                elif str(j) == '100.000.000 499.999.999':
                    montoAct = 100000000
                    continue
                elif str(j) == '> 500.000.000':
                    montoAct = 500000000
                    continue

                if str(j) == 'nan':
                    continue
                else:

                    dias = plazos[k]

                    jAct = str(j).strip('%')
                    jAct = jAct.replace(',', '.')

                    cdt = CDT('Colpatria', int(dias), float(jAct), None,
                              int(montoAct))
                    listaCDTs.append(cdt)

                    k += 1

    return listaCDTs
Example #12
0
                    correct = pred.eq(target.view(-1).data).sum()
                    loss = criterion(output, target.view(-1))
                    epoch_training_loss_list.append(loss.detach().cpu().data.numpy())
                    print('Epoch: {:02d} | Batch: {:03d} | CrossEntropy-loss: {:.5f} | Correct: {}/{} | Difference: {}'.format(
                            epoch, batch_idx, loss.data, correct, output.size()[0], difference))

                    tree.save_model(model_path = learner_args['model_path'])
        writer.add_scalar('Training Loss', np.mean(epoch_training_loss_list), epoch)
        writer.add_scalar('Training Feature Difference', np.mean(epoch_feature_difference_list), epoch)

        # Testing stage
        tree.eval()
        correct = 0.
        for batch_idx, (data, target) in enumerate(test_loader):
            data, target = data.to(device), target.to(device)
            batch_size = data.size()[0]
            prediction, _, _ = tree.forward(data)
            pred = prediction.data.max(1)[1]
            correct += pred.eq(target.view(-1).data).sum()
        accuracy = 100. * float(correct) / len(test_loader.dataset)
        if accuracy > best_testing_acc:
            best_testing_acc = accuracy
        testing_acc_list.append(accuracy)
        writer.add_scalar('Testing Accuracy', accuracy, epoch)
        print('\nEpoch: {:02d} | Testing Accuracy: {}/{} ({:.3f}%) | Historical Best: {:.3f}% \n'.format(epoch, correct, len(test_loader.dataset), accuracy, best_testing_acc))


if __name__ == '__main__':    
    tree = CDT(learner_args).to(device)
    train_tree(tree)