def check_anamoly_and_update_network(self, user_id, purchase): """ Gets friends with in the degree, checks anomaly and write to flagged_purchases.json if purchase is anomaly. Adds current purchase to user's purchases Args: user_id: purchase: Returns: is_anomaly, mean, std """ if user_id in self.network: friend_list = self.get_friends_within_degree(user_id) #self.logger.info('Friend list for user %s: %s', user_id, friend_list) T = self.network[user_id].get_num_tracked() is_anomaly, mean, std = self.check_anomaly(friend_list, purchase, T) #self.logger.info("current purchase: %s", purchase) #self.logger.info('is_anomaly = %r mean = %f std = %f', is_anomaly, mean, std) # Build the flagged purchase json object and write to flagged_purchases.json flagged_purchase = OrderedDict() if is_anomaly: flagged_purchase['event_type'] = 'purchase' flagged_purchase['timestamp'] = purchase[1] flagged_purchase['id'] = user_id flagged_purchase['amount'] = "{0:.2f}".format(purchase[2]) flagged_purchase['mean'] = "{0:.2f}".format(mean) flagged_purchase['sd'] = "{0:.2f}".format(std) json_string = json.dumps(flagged_purchase) #with open('.' + self.output_log, 'a') as f: with open(self.output_log, 'a+') as f: f.write(json_string) f.write('\n') #self.logger.info("Add current purchase %s for user %s", purchase, user_id) # Add the current purchase to the user's purchase list user = self.network[user_id] user.add_purchase(purchase) return is_anomaly, mean, std else: #self.logger.info("user: %s not in network.", user_id) user = User(user_id, self.num_tracked) # add his purchase user.add_purchase(purchase) # add user to network self.add_user(user) return None, None, None
def process_batch_input(batch_input_file, output_log, logger): global index #with open('.' + batch_input_file, 'r') as f: with open(batch_input_file, 'r') as f: for idx, line in enumerate(f.readlines()): #logger.info('File %s: Processing line numer: %d', batch_input_file, idx) line.rstrip() json_line = json.loads(line) if 'D' in json_line: degree = json_line['D'] num_tracked = json_line['T'] #logger.info('Degree of network = %s number of tracked purchases = %s', degree, num_tracked) social_network = SocialNetwork(output_log, degree, num_tracked) elif json_line['event_type'] == 'purchase': timestamp = json_line['timestamp'] purchase_amount = float(json_line['amount']) purchase = (-1 * index, timestamp, purchase_amount) user_id = json_line['id'] if not user_id in social_network.network: # create user user = User(user_id, num_tracked) # add his purchase user.add_purchase(purchase) # add user to network social_network.add_user(user) else: user = social_network.network[user_id] user.add_purchase(purchase) elif json_line['event_type'] in ['befriend', 'unfriend']: user1_id = json_line['id1'] user2_id = json_line['id2'] timestamp = json_line['timestamp'] event_type = json_line['event_type'] if event_type == 'befriend': social_network.add_friend(user1_id, user2_id) elif event_type == 'unfriend': social_network.remove_friend(user1_id, user2_id) index += 1 return social_network