import redis import pandas as pd import csv import sys if sys.version_info.major == 3: from io import StringIO else: from cStringIO import StringIO import datetime from pickle import loads from ftplib import FTP import config import os def decode_dict(d): return {k.decode() if isinstance(k, bytes) else k: \ v.decode() if isinstance(v, bytes) else v for k, v in d.items()} def get_trades(): q = redis.Redis(host = 'debian') p = q.pipeline() p.lrange('trades', 0, -1).delete('trades') r = p.execute() if sys.version_info.major == 3: df = pd.DataFrame([decode_dict(loads(e, encoding='bytes')) for e in r[0]]) else: df = pd.DataFrame([loads(e) for e in r[0]]) return df def aux(v): if v.action.iat[-1] == 'CANCEL': return None if v.action.iat[0] == 'NEW': v.action.iat[-1] = 'NEW' return v.iloc[-1] def build_line(obj): line = ["MortgageDeal", obj.dealid, obj.action ,"Serenitas", None, None , obj.folder, obj.custodian, obj.cashaccount, obj.cp_code, None, 'Valid', str(obj.trade_date), str(obj.settle_date), None, None, obj.cusip, obj['isin'], None, None, None, obj['description'], "Buy" if obj.buysell else "Sell", None, obj.accrued, obj.price, None, None, 'SERCGMAST', 'MORTGAGE', None, None, None, None, obj.faceamount, None, None, 'S'] return line def generate_csv(df): output = StringIO() csvwriter = csv.writer(output) headers = ['Deal Type', 'Deal ID', 'Action', 'Client', 'Reserved', 'Reserved', 'Folder', 'Custodian', 'Cash Account', 'Counterparty', 'Comments', 'State', 'Trade Date', 'Settlement Date', 'Reserved', 'GlopeOp Security Identifier', 'CUSIP', 'ISIN', 'Reserved', 'Reserved', 'Reserved', 'Security Description', 'Transaction Indicator', 'SubTransaction Indicator', 'Accrued', 'Price', 'BlockId', 'BlockAmount', 'Fund', 'Portfolio', 'Reserved', 'Reserved', 'ClientReference', 'ClearingMode', 'FaceAmount', 'Pool Factor', 'FactorAsOfDate', 'Delivery'] csvwriter.writerow(headers) flag = False for tradeid, v in df.sort('lastupdate').groupby('id'): trade = aux(v) if trade is not None: flag = True csvwriter.writerow(build_line(trade)) #convert to bytes if flag: if sys.version_info.major == 3: return output.getvalue().encode() else: return output.getvalue() def upload_file(timestamp): ftp = FTP('ftp.globeop.com') ftp.login('srntsftp', config.ftp_password) ftp.cwd('incoming') filename = 'Serenitas.ALL.{0:%Y%m%d.%H%M%S}.Mortgages.csv'.format(timestamp) cmd = 'STOR {0}'.format(filename) with open(os.path.join('/home/share/Daily', str(timestamp.date()), filename), 'rb') as fh: ftp.storbinary(cmd, fh) def write_buffer(buf): timestamp = pd.datetime.now() filename = 'Serenitas.ALL.{0:%Y%m%d.%H%M%S}.Mortgages.csv'.format(timestamp) with open(os.path.join('/home/share/Daily', str(timestamp.date()), filename), 'wb') as fh: fh.write(buf) return timestamp if __name__=="__main__": df = get_trades() if not df.empty: buf = generate_csv(df) if buf: timestamp = write_buffer(buf) upload_file(timestamp)