1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
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
# from io import BytesIO, StringIO
import datetime
from pickle import loads
from ftplib import FTP
import config
import os
import sys
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)
|