Example #1
0
def request_loan_data():
    '''
    Requests list of loans that can be invested in, then makes individual call
    for details of the loans. Results stored in MongoDB database.

    Returns:
    loan_results: Results obtained from initial API request. list.
    loan_details: Individual loan details, obtained with individual API request
    of loan ids obtained in loan_results. list.
    '''
    filter_search = {
        'exclude_existing': False,
        'funding_progress': 0,
        'grades': {
            'All': False,
            'A': True,
            'B': True,
            'C': True,
            'D': True,
            'E': False,
            'F': False,
            'G': False
        },
        'term': {
            'Year3': True,
            'Year5': False
        }
    }

    club = LendingClub()
    filter_search = Filter(filter_search)
    club.authenticate()

    loan_results = club.search(filter_search, start_index=0, limit=1000)
    loan_results = loan_results['loans']
    loan_ids = [loan['loan_id'] for loan in loan_results]

    loan_details = []
    for loan_id in loan_ids:
        print "loan_id", loan_id
        request = club.session.get('/browse/loanDetailAj.action',
                                   query={'loan_id': loan_id})
        loan_details.append(request.json())
        time.sleep(1)

    return loan_results, loan_details
Example #2
0
def request_loan_data():
    '''
    Requests list of loans that can be invested in, then makes individual call
    for details of the loans. Results stored in MongoDB database.

    Returns:
    loan_results: Results obtained from initial API request. list.
    loan_details: Individual loan details, obtained with individual API request
    of loan ids obtained in loan_results. list.
    '''
    filter_search = {'exclude_existing': False,
                     'funding_progress': 0,
                     'grades': {'All': False,
                                'A': True,
                                'B': True,
                                'C': True,
                                'D': True,
                                'E': False,
                                'F': False,
                                'G': False},
                     'term': {'Year3': True, 'Year5': False}}
                 
    club = LendingClub()
    filter_search = Filter(filter_search)
    club.authenticate()

    loan_results = club.search(filter_search, start_index=0, limit=1000)
    loan_results = loan_results['loans']
    loan_ids = [loan['loan_id'] for loan in loan_results]

    loan_details = []
    for loan_id in loan_ids:
        print "loan_id", loan_id
        request = club.session.get('/browse/loanDetailAj.action', query={'loan_id': loan_id})
        loan_details.append(request.json())
        time.sleep(1)

    return loan_results, loan_details
Example #3
0
class Autobuy:

    lc = None
    #main_filter = 'low-risk2'
    saved_filters = None
    main_filters = []
    main_filter_ids = [8641686, 9061019]

    def __init__(self, email = None, password = None, filter_ids = None):
        if filter_ids != None:
            self.main_filter_ids = filter_ids

        self.lc = LendingClub(email, password)
        self.lc.authenticate()
        self.saved_filters = self.lc.get_saved_filters()
        self.main_filters = \
            filter(lambda x: x.id in self.main_filter_ids, self.saved_filters)

    def lc(self):
        self.lc
    
    def run_all(self):
        loan_ids = []
        for f in self.main_filters:
            loan_ids = list(set(loan_ids) | set(self.run(f)))
        
        if len(loan_ids) > 0:
            order = self.lc.start_order()
            order.add_batch(loan_ids, 25)
            order.execute()
            print "%s loans processed" % len(loan_ids)
            return len(loan_ids)
         
        print "No loans processed"
        return False

    def run(self, _filter = None, just_loans = True):
        if _filter is None:
            raise Exception("No filter specified")
        results = self.lc.search(_filter)
        if results[u'totalRecords'] > 30:
            raise Exception("Filter probably broken, returning > 30 results")
        elif results[u'totalRecords'] == 0:
            return []

        if not just_loans:
            order = self.lc.start_order()
        loans = []
        for result in results[u'loans']:
            loan_id = result[u'loan_id']
            additional_details = self.lc.loan_details(loan_id)
            if additional_details[u'currentJobTitle'] == u'n/a':
                continue
            rate = float(re.findall(r"\d+\.\d+|\d+", additional_details[u'rate'])[0]) 
            term = int(additional_details[u'loanLength'])
            if (term == 36 and rate < 0.19) or rate < 0.22:
                continue
            loans.append(loan_id)
        
        if len(loans) > 0:
            if just_loans:
                return loans
            order.add_batch(loans, 25) 
            order.execute()
            return True

        print "No loans found"
        if just_loans:
            return []
        else:
            return True

    def __str__(self):
        print "Autobuyer"
Example #4
0
class TestLendingClub(unittest.TestCase):
    lc = None
    logger = None

    def setUp(self):
        self.logger = TestLogger()

        self.lc = LendingClub(logger=self.logger)
        self.lc.session.base_url = 'http://127.0.0.1:8000/'
        self.lc.session.set_logger(None)

        self.lc.authenticate('*****@*****.**', 'supersecret')

        # Make sure session is enabled and clear
        self.lc.session.post('/session/enabled')
        self.lc.session.request('delete', '/session')

    def tearDown(self):
        pass

    def test_cash_balance(self):
        cash = self.lc.get_cash_balance()
        self.assertEqual(cash, 216.02)

    def test_portfolios(self):
        portfolios = self.lc.get_portfolio_list()
        self.assertEqual(len(portfolios), 2)
        self.assertEqual(portfolios[0]['portfolioName'], 'Existing Portfolio')

    def test_build_portfolio(self):
        portfolio = self.lc.build_portfolio(200, 25, 15, 16)

        self.assertNotEqual(portfolio, False)
        self.assertEqual(portfolio['percentage'], 15.28)

        self.assertTrue('loan_fractions' in portfolio)
        self.assertEqual(len(portfolio['loan_fractions']), 15)

    def test_build_portfolio_session_fail(self):
        """ test_build_portfolio_session_fail"
        If the session isn't saved, fractions shouldn't be found,
        which should make the entire method return False
        """

        # Disable session
        self.lc.session.post('/session/disabled')

        portfolio = self.lc.build_portfolio(200, 25, 15, 16)
        self.assertFalse(portfolio)

    def test_build_portfolio_no_match(self):
        """ test_build_portfolio_no_match"
        Enter a min/max percent that cannot match dummy returned JSON
        """
        portfolio = self.lc.build_portfolio(200, 25, 17.6, 18.5)
        self.assertFalse(portfolio)

    def test_search(self):
        results = self.lc.search()
        self.assertTrue(results is not False)
        self.assertTrue('loans' in results)
        self.assertTrue(len(results['loans']) > 0)
class TestLendingClub(unittest.TestCase):
    lc = None
    logger = None

    def setUp(self):
        self.logger = TestLogger()

        self.lc = LendingClub(logger=self.logger)
        self.lc.session.base_url = 'http://127.0.0.1:8000/'
        self.lc.session.set_logger(None)

        self.lc.authenticate('*****@*****.**', 'supersecret')

        # Make sure session is enabled and clear
        self.lc.session.post('/session/enabled')
        self.lc.session.request('delete', '/session')

    def tearDown(self):
        pass

    def test_cash_balance(self):
        cash = self.lc.get_cash_balance()
        self.assertEqual(cash, 216.02)

    def test_portfolios(self):
        portfolios = self.lc.get_portfolio_list()
        self.assertEquals(len(portfolios), 2)
        self.assertEquals(portfolios[0]['portfolioName'], 'Existing Portfolio')

    def test_build_portfolio(self):
        portfolio = self.lc.build_portfolio(200, 25, 15, 16)

        self.assertNotEqual(portfolio, False)
        self.assertEqual(portfolio['percentage'], 15.28)

        self.assertTrue('loan_fractions' in portfolio)
        self.assertEqual(len(portfolio['loan_fractions']), 15)

    def test_build_portfolio_session_fail(self):
        """ test_build_portfolio_session_fail"
        If the session isn't saved, fractions shouldn't be found,
        which should make the entire method return False
        """

        # Disable session
        self.lc.session.post('/session/disabled')

        portfolio = self.lc.build_portfolio(200, 25, 15, 16)
        self.assertFalse(portfolio)

    def test_build_portfolio_no_match(self):
        """ test_build_portfolio_no_match"
        Enter a min/max percent that cannot match dummy returned JSON
        """
        portfolio = self.lc.build_portfolio(200, 25, 17.6, 18.5)
        self.assertFalse(portfolio)

    def test_search(self):
        results = self.lc.search()
        self.assertTrue(results is not False)
        self.assertTrue('loans' in results)
        self.assertTrue(len(results['loans']) > 0)