This example shows how to create a very simple rule engine that executes SQL queries on an in-memory SQL database
import pandas as pd
import sqlite3
class RuleEngine(object):
"""Handles creation and execution of a SQL based rule engine.
Input are a pandas dataframe with market data and a list of
SQL queries to be executed. Generates a database with
all data, old and newly generated
"""
def __init__(self, pd_marketdata, output_fields):
"""
Takes a pandas dataframe with market data and a list of
output fields, i.e. fields that should be newly generated and
returns an SQLite in-memory database as self.db with one table temp_tbl
containing all market data
"""
self.db = sqlite3.connect(':memory:')
marketdata_fields = pd_marketdata.columns
# attach output fields to the dataframe
for field in output_fields:
pd_marketdata[field] = ""
# write dataframe to database
pd_marketdata.to_sql("temp_tbl", self.db)
self.db.commit()
def execute_rules(self, sql_list):
"""
Takes a list of sql queries of the form
UPDATE temp_tbl set SPPI_ASSET_CLASS = 'FAIL' WHERE MARKET_SECTOR_DES = 'Equity'
and executes all queries on the in-memory database self.db
"""
cursor = self.db.cursor()
for sql in sql_list:
cursor.execute(sql)
def to_excel(self, path_to_file):
"""Writes the rule engine database to Excel"""
df = pd.read_sql_query("SELECT * FROM temp_tbl", self.db)
writer = pd.ExcelWriter(path_to_file, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
writer.save()
path_csv_marketdata = 'market_data.csv'
pd_marketdata = pd.read_csv(path_csv_marketdata)
pd_marketdata
new_fields = ["SPPI_ASSET_CLASS", "SPPI_RESULT"]
sql_list = [
"UPDATE temp_tbl set SPPI_ASSET_CLASS = 'PASS' WHERE MARKET_SECTOR_DES = 'Govt'",
"UPDATE temp_tbl set SPPI_ASSET_CLASS = 'FAIL' WHERE MARKET_SECTOR_DES = 'Equity'",
"UPDATE temp_tbl set SPPI_RESULT = 'PASS'",
"UPDATE temp_tbl set SPPI_RESULT = 'FAIL' WHERE SPPI_ASSET_CLASS = 'FAIL'"
]
rule_engine = RuleEngine(pd_marketdata, new_fields)
pd.read_sql_query("SELECT * FROM temp_tbl", rule_engine.db)
rule_engine.execute_rules(sql_list)
pd.read_sql_query("SELECT * FROM temp_tbl", rule_engine.db)
export_path = "C:\\Users\\jakob\\GoogleDrive\\market_data.xlsx"
rule_engine.to_excel(export_path)