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
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
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"
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)