def price_change_hist(input, pickle_file, historical_quotes_dir, header, header_for_quotes, use_current_date): ranking = defaultdict(list) find_quotes = FindPrice(historical_quotes_dir, header_for_quotes) if header: input.next() if use_current_date: HEADER_LINE = 'Ticker,Firm,Action,Date,Old_Target,New_Target,Target_Ratio,Current_Price,Price_in_1yr,Price_Ratio' else: HEADER_LINE = 'Ticker,Firm,Action,Date,Old_Target,New_Target,Target_Ratio,EOQ_Price,Price_EOQ_next_year,Price_Ratio' print HEADER_LINE for l in csv.reader(input): rec_date = datetime.strptime(l[ANALYST_DATA_FIELDS.Date.zvalue], ANALYST_DATA_DATE_FORMAT) try: if use_current_date: start_price = find_quotes.at(l[ANALYST_DATA_FIELDS.Ticker.zvalue], rec_date) else: start_price = find_quotes.at_end_of_qtr(l[ANALYST_DATA_FIELDS.Ticker.zvalue], rec_date) end_price = find_quotes.at_end_of_qtr_next_year(l[ANALYST_DATA_FIELDS.Ticker.zvalue], rec_date) price_delta = end_price / start_price except DatesNotAvailableException: # Catch when dates are not available continue to_rating = re.sub('(.*\s*->\s*)(?P<to>.*)', '\\g<to>', l[ANALYST_DATA_FIELDS.Rating.zvalue]) if pickle_file and price_delta: ranking[to_rating].append(price_delta) # get rid of annoying commas in text for i in range(len(l)): l[i] = l[i].replace(",",";") # Don't deal with exchange rates l[ANALYST_DATA_FIELDS.Price_Target.zvalue] = l[ANALYST_DATA_FIELDS.Price_Target.zvalue].replace('$','') # Make sure this isn't a different currency (€ or C$ or something else) if any(c.isalpha() for c in l[ANALYST_DATA_FIELDS.Price_Target.zvalue]): continue # replace '$40.00 -> $42.00' to '40.00,42.00' before_after = l[ANALYST_DATA_FIELDS.Price_Target.zvalue].split('->') if len(before_after) == 1: l[ANALYST_DATA_FIELDS.Price_Target.zvalue] = before_after[0] + ',' + before_after[0] + ',1.0' elif len(before_after) == 2: l[ANALYST_DATA_FIELDS.Price_Target.zvalue] = ','.join(before_after).replace(' ','') + \ ',' + str(float(before_after[1])/float(before_after[0])) else: raise ValueError print ",".join([l[ANALYST_DATA_FIELDS.Ticker.zvalue], l[ANALYST_DATA_FIELDS.Firm.zvalue], to_rating, l[ANALYST_DATA_FIELDS.Date.zvalue], l[ANALYST_DATA_FIELDS.Price_Target.zvalue], str(start_price), str(end_price), str(price_delta)]) if pickle_file: save_obj(ranking, pickle_file)
def price_change_hist(input, pickle_file): ranking = defaultdict(list) print HEADER_LINE for l in csv.reader(input): rec_date = datetime.strptime(l[FIELD_REC_DATE], RECS_DATE_FORMAT) later_date = rec_date + DATE_CHANGE try: start, end, delta = get_price_change(l[FIELD_REC_TICKER], rec_date, later_date) except DatesNotAvailableException: # Catch when dates are not available continue to_rank = re.sub("(.*\s*->\s*)(?P<to>.*)", "\\g<to>", l[FIELD_REC_RANK]) if delta: ranking[to_rank].append(delta) # get rid of annoying commas in text for i in range(len(l)): l[i] = l[i].replace(",", ";") # Don't deal with exchange rates l[FIELD_REC_PRICE_1Y] = l[FIELD_REC_PRICE_1Y].replace("$", "") # Make sure this isn't a different currency (€ or C$ or something else) if any(c.isalpha() for c in l[FIELD_REC_PRICE_1Y]): continue # replace '$40.00 -> $42.00' to '40.00,42.00' before_after = l[FIELD_REC_PRICE_1Y].split("->") if len(before_after) == 1: l[FIELD_REC_PRICE_1Y] = before_after[0] + "," + before_after[0] + ",1.0" # before and after are equal elif len(before_after) == 2: l[FIELD_REC_PRICE_1Y] = ( ",".join(before_after).replace(" ", "") + "," + str(float(before_after[1]) / float(before_after[0])) ) else: raise ValueError print ",".join( [ l[FIELD_REC_TICKER], l[FIELD_REC_FIRM], to_rank, l[FIELD_REC_DATE], l[FIELD_REC_PRICE_1Y], # before, after, ratio str(start), str(end), str(delta), ] ) if pickle_file: save_obj(ranking, pickle_file)
def price_change_hist(input, pickle_file): ranking = defaultdict(list) print HEADER_LINE for l in csv.reader(input): rec_date = datetime.strptime(l[FIELD_REC_DATE], RECS_DATE_FORMAT) later_date = rec_date + DATE_CHANGE try: start, end, delta = get_price_change(l[FIELD_REC_TICKER], rec_date, later_date) except DatesNotAvailableException: # Catch when dates are not available continue to_rank = re.sub('(.*\s*->\s*)(?P<to>.*)', '\\g<to>', l[FIELD_REC_RANK]) if delta: ranking[to_rank].append(delta) # get rid of annoying commas in text for i in range(len(l)): l[i] = l[i].replace(",",";") # Don't deal with exchange rates l[FIELD_REC_PRICE_1Y] = l[FIELD_REC_PRICE_1Y].replace('$','') # Make sure this isn't a different currency (€ or C$ or something else) if any(c.isalpha() for c in l[FIELD_REC_PRICE_1Y]): continue # replace '$40.00 -> $42.00' to '40.00,42.00' before_after = l[FIELD_REC_PRICE_1Y].split('->') if len(before_after) == 1: l[FIELD_REC_PRICE_1Y] = before_after[0] + ',' + before_after[0] + ',1.0' # before and after are equal elif len(before_after) == 2: l[FIELD_REC_PRICE_1Y] = ','.join(before_after).replace(' ','') + \ ',' + str(float(before_after[1])/float(before_after[0])) else: raise ValueError print ",".join([l[FIELD_REC_TICKER], l[FIELD_REC_FIRM], to_rank, l[FIELD_REC_DATE], l[FIELD_REC_PRICE_1Y], # before, after, ratio str(start), str(end), str(delta)]) if pickle_file: save_obj(ranking, pickle_file)