-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathETLDemo.py
More file actions
89 lines (69 loc) · 2.4 KB
/
ETLDemo.py
File metadata and controls
89 lines (69 loc) · 2.4 KB
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
import os
import sys
import petl
import pymssql
import configparser
import requests
import datetime
import json
import decimal
# get data from configuration file
config = configparser.ConfigParser()
try:
config.read('ETLDemo.ini')
except Exception as e:
print('could not read configuration file:' + str(e))
sys.exit()
# read settings from configuration file
startDate = config['CONFIG']['startDate']
url = config['CONFIG']['url']
destServer = config['CONFIG']['server']
destDatabase = config['CONFIG']['database']
user = config['CONFIG']['user']
password = config['CONFIG']['password']
# request data from URL
try:
BOCResponse = requests.get(url+startDate)
except Exception as e:
print('could not make request:' + str(e))
sys.exit()
# print (BOCResponse.text)
# initialize list of lists for data storage
BOCDates = []
BOCRates = []
# check response status and process BOC JSON object
if (BOCResponse.status_code == 200):
BOCRaw = json.loads(BOCResponse.text)
# extract observation data into column arrays
for row in BOCRaw['observations']:
BOCDates.append(datetime.datetime.strptime(row['d'],'%Y-%m-%d'))
BOCRates.append(decimal.Decimal(row['FXUSDCAD']['v']))
# create petl table from column arrays and rename the columns
exchangeRates = petl.fromcolumns([BOCDates,BOCRates],header=['date','rate'])
# print (exchangeRates)
# load expense document
try:
expenses = petl.io.xlsx.fromxlsx('Expenses.xlsx',sheet='Github')
except Exception as e:
print('could not open expenses.xlsx:' + str(e))
sys.exit()
# join tables
expenses = petl.outerjoin(exchangeRates,expenses,key='date')
# fill down missing values
expenses = petl.filldown(expenses,'rate')
# remove dates with no expenses
expenses = petl.select(expenses,lambda rec: rec.USD != None)
# add CDN column
expenses = petl.addfield(expenses,'CAD', lambda rec: decimal.Decimal(rec.USD) * rec.rate)
# intialize database connection
try:
dbConnection = pymssql.connect(server=destServer,database=destDatabase,user=user,password=password)
except Exception as e:
print('could not connect to database:' + str(e))
sys.exit()
# populate Expenses database table
try:
petl.io.todb (expenses,dbConnection,'Expenses')
except Exception as e:
print('could not write to database:' + str(e))
print (expenses)