Esempio n. 1
0
 def __init__(self):
     if Predictor.__instance is not None:
         raise Exception("I'm Singleton")
     else:
         Predictor.__instance = self
         self.cfg = Config.get_instance()
         self.expenses = Expenses.get_instance()
Esempio n. 2
0
def predict():
    expenses = Expenses.get_instance()
    if expenses.data is None:
        predictor = Predictor.get_instance()
        predictor.read_data()
    filteredData = filter_predict_window(expenses.data)
    result = filteredData[['Description', 'DueDate', 'Where']]
    return curate_result(result, processType='predict')
Esempio n. 3
0
def usage():
    expenses = Expenses.get_instance()
    if expenses.data is None:
        predictor = Predictor.get_instance()
        predictor.read_data()
    # shopData.sort_values(by=['iDate'], ascending=False, inplace=True)
    result = expenses.data[['Date', 'Description', 'Category', 'Amount', 'Where']]
    return curate_result(result, processType='usage')
Esempio n. 4
0
def predict_item(item):
    expenses = Expenses.get_instance()
    if expenses.data is None:
        predictor = Predictor.get_instance()
        predictor.read_data()
    shopData = expenses.data[(expenses.data['Description'] == item)]
    filteredData = filter_predict_window(shopData)
    result = filteredData[['Description', 'DueDate']]
    return curate_result(result, item=item, processType='predict')
Esempio n. 5
0
def usage_item(item):
    expenses = Expenses.get_instance()
    if expenses.data is None:
        predictor = Predictor.get_instance()
        predictor.read_data()
    shopData = expenses.data[(expenses.data['Description'] == item)]
    result = shopData[['Date', 'Description', 'Where', 'Category', 'Amount']]
    # result.sort_values(by='Date', ascending=False)
    return curate_result(result, item=item, processType='usage')
Esempio n. 6
0
def predict_shop(shop):
    expenses = Expenses.get_instance()
    if expenses.data is None:
        predictor = Predictor.get_instance()
        predictor.read_data()
    shopData = expenses.data[(expenses.data['Where'] == shop)]
    filteredData = filter_predict_window(shopData)
    # print(filteredData)
    result = filteredData[['Description', 'DueDate']]
    return curate_result(result, shop=shop, processType='predict')
Esempio n. 7
0
def usage_shop_item(shop, item):
    expenses = Expenses.get_instance()
    if expenses.data is None:
        predictor = Predictor.get_instance()
        predictor.read_data()
    shopData = expenses.data[(expenses.data['Where'] == shop) & (expenses.data['Description'] == item)]
    # print(shopData)
    # shopData.sort_values(by=['iDate'], ascending=False, inplace=True)
    result = shopData[['Date', 'Description', 'Category', 'Amount']]
    return curate_result(result, shop=shop, item=item, processType='usage')
Esempio n. 8
0
class Predictor:
    log = Logger.get_instance()
    log.log(LogLevel.VERBOSE, 'Started.')
    expenses = Expenses.get_instance()
    log.log(LogLevel.VERBOSE, 'Config Instance fetched.')
    __instance = None

    def __init__(self):
        if Predictor.__instance is not None:
            raise Exception("I'm Singleton")
        else:
            Predictor.__instance = self
            self.cfg = Config.get_instance()
            self.expenses = Expenses.get_instance()

    @staticmethod
    def get_instance():
        if Predictor.__instance is None:
            Predictor.__instance = Predictor()
        return Predictor.__instance

    def read_data(self):
        gsa = GoogleSheetAdaptor(self.cfg.credFileName, 'Expenses_2020')
        curatedData = gsa.get_spreadsheet_data()
        # print(len(curatedData))
        # Sort the data by Dates, so that we can run through the usage.
        curatedData = curatedData.sort_values(by=['iDate'])

        # RowIndex = A sequence running through the dataset
        curatedData['RowIndex'] = np.arange(len(curatedData))

        # StitchIndex = Connecting links to the next usage.
        curatedData['StitchIndex'] = curatedData.apply(lambda row: curatedData[
            (curatedData['RowIndex'] <= row['RowIndex']) & (curatedData[
                'Description'] == row['Description'])]['Description'].count(),
                                                       axis=1)

        minDate = str(min(curatedData['iDate'])) if os.environ.get('PREDICT_FROM') is None \
            else os.environ.get('PREDICT_FROM')

        # DateIndex = A sequence for Dates.
        # 0 = minDate, for example 01-Jan-2020,
        # 1 = minDate + 1, for example 02-Jan-2020, even if purchase is not made.
        curatedData['DateIndex'] = curatedData.apply(lambda row: (dt.strptime(
            str(row['Date']), '%Y%m%d') - dt.strptime(minDate, '%Y%m%d')).days,
                                                     axis=1)

        # UsageIndex = Distance between current purchase and the next purchase, in days
        curatedData['UsageIndex'] = curatedData.apply(
            lambda row: -999 if len(curatedData[
                (curatedData['Description'] == row['Description']) &
                (curatedData['StitchIndex'] == row['StitchIndex'] + 1)][
                    'DateIndex'].values - row['DateIndex']) == 0 else
            (curatedData[(curatedData['Description'] == row['Description']) &
                         (curatedData['StitchIndex'] == row['StitchIndex'] + 1
                          )]['DateIndex'].values - row['DateIndex'])[0],
            axis=1)

        descriptionList = curatedData['Description'].unique()

        # Split the data based on the descriptions.
        descriptionGroupMap = {
            description: curatedData[curatedData['Description'] == description]
            for description in descriptionList
        }

        # for each of these descriptionGroups, fetch y-Intercept and Slope using LinearRegression
        modelValues = {
            description: fit_model(descriptionGroupMap[description])
            for description in descriptionGroupMap
        }

        # merge the y-Intercept and slope into the dataframe.
        # curatedData['Intercept'] = curatedData.apply(lambda row:
        #                                              None if (modelValues[row['Description']] is None
        #                                                       # or
        #                                                       # row['UsageIndex'] == -999
        #                                                      )
        #                                              else modelValues[row['Description']][0], axis=1)
        # curatedData['Slope'] = curatedData.apply(lambda row:
        #                                          None if (modelValues[row['Description']] is None
        #                                                   # or
        #                                                   # row['UsageIndex'] == -999
        #                                                   )
        #                                          else modelValues[row['Description']][1], axis=1)

        # curatedData['PredictedUsageIndex'] = curatedData.apply(lambda row:
        #                                                        None if (modelValues[row['Description']] is None
        #                                                                 # or
        #                                                                 # row['UsageIndex'] == -999
        #                                                                 )
        #                                                        else modelValues[row['Description']][2], axis=1)

        curatedData['DueDate'] = curatedData.apply(
            lambda row: None if (modelValues[row['Description']] is None
                                 # or
                                 # row['UsageIndex'] == -999
                                 ) else
            (dt.strptime(str(row['iDate']), "%Y%m%d") + td(days=modelValues[
                row['Description']][2])).strftime('%Y%m%d'),
            axis=1)

        self.expenses.data = curatedData

    def run_prediction_shop(self, shopName, fromDate=None):
        if self.expenses.data is None:
            self.read_data()
        if fromDate is not None:
            subset = self.expenses.data[
                (self.expenses.data['Where'] == shopName)
                & (self.expenses.data['iDate'] >= fromDate)
                & (self.expenses.data['Description'] == 'Rice - Ponni Boiled')]
        else:
            subset = self.expenses.data[
                (self.expenses.data['Where'] == shopName)
                & (self.expenses.data['Description'] == 'Rice - Ponni Boiled')]

        subset.sort_values(by=['DateIndex'], inplace=True)
Esempio n. 9
0
def read_data():
    predictor = Predictor.get_instance()
    predictor.read_data()
    expenses = Expenses.get_instance()
    expenses.wordCloud = None
    return redirect('/wc/')
Esempio n. 10
0
from wordcloud import (WordCloud, get_single_color_func)
import matplotlib
import matplotlib.pyplot as plt
from InventoryPredictor.src.config import Config
from InventoryPredictor.src.predictor import Predictor
from InventoryPredictor.src.expenses import Expenses
from Authenticator.src.decorator import login_required, is_valid_user
import io
import os
import base64

cfg = Config.get_instance()
ex = Expenses.get_instance()
htmlTemplate = '<!DOCTYPE html>' \
               '<html lang="en">' \
               '    <head>' \
               '        <title>Help me Shop!</title>' \
               '        <meta charset="UTF-8">     ' \
               '        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> ' \
               '        <style>' \
               '        body, html {' \
               '            height: 100%;' \
               '            width: 100%;' \
               '            overflow-x: hidden;' \
               '            margin: 0;' \
               '            -webkit-perspective: 1000;' \
               '            font-family: "Poppins", sans-serif;' \
               '            background: #303030;' \
               '            -webkit-font-smoothing: antialiased;' \
               '        }' \
               '        .overlay {' \