Exemple #1
0
def SOHA_WriteGasNettingFactorsFromDB(Update_User, Update_Date, wellnames=[]):
    from Model import BPXDatabase as bpx
    from Model import QueryFile as qf
    from Model import ModelLayer as m
    import datetime as datetime

    Success = True
    Messages = []

    try:
        config = m.GetConfig()
        DBObj = bpx.BPXDatabase(config['server'], config['database'],
                                config['UID'])
        TeamOpsObj = bpx.GetDBEnvironment('OnPrem', 'OVERRIDE')
        EDWObj = bpx.GetDBEnvironment('ProdEDW', 'OVERRIDE')

        #Get Well List of required netting values from data that is already in database.
        query = qf.GetNettingFactorsfromDB(wellnames)
        res, res_df = TeamOpsObj.Query(query)

        count = 1
        for idx, item in res_df.iterrows():
            wellquery = qf.EDWKeyQueryFromWellName([item['WellName']])
            res, well_row = EDWObj.Query(wellquery)
            if not well_row.empty:
                corpID = well_row['CorpID'].values[0]
                NettingObj = m.GasNettingRow(item['WellName'], corpID,
                                             item['NF'],
                                             item['FirstSalesDateInput'],
                                             DBObj)
                Success, Message = NettingObj.Write(Update_User, Update_Date)
                if not Success:
                    Messages.append(Message)

            callprogressbar(count, res_df.shape[0])
            count = count + 1

    except Exception as ex:
        Success = False
        Messages.append('Error during write of netting factors to DB. ' +
                        str(ex))

    return Success, Messages
Exemple #2
0
def SOHA_WriteGFOToDB_2019Database(ForecastName,
                                   ForecastYear,
                                   User,
                                   start_date,
                                   end_date,
                                   WellFlac=['ALL'],
                                   GFO=False):
    #Part of to be deprecated methods to convert SoHa internal GFO data to standard
    from Model import BPXDatabase as bpxdb
    from Model import QueryFile as qf
    from Model import ImportUtility as imp
    from Model import ModelLayer as m
    import datetime as dt
    import numpy as np

    Sucess = True
    Messages = []

    try:
        config = m.GetConfig()
        #Create DB Object
        return_df, Success, Message = imp.ImportGFOFromDB2019(
            start_date, end_date, WellFlac)
        if not Success:
            Messages.append(Message)
        Production_Column_Name = '2019Zmcfd'
        Success, Message = WriteInternalForecasttoDB(return_df, ForecastName,
                                                     ForecastYear,
                                                     Production_Column_Name,
                                                     User, GFO)
        if not Success:
            Messages.append(Message)

    except Exception as ex:
        Success = False
        Messages.append('Error writing GFO to DB. ' + str(ex))

    return Success, Messages
Exemple #3
0
def WriteDefaultMultipliers(LE_Name, DefaultValue, Update_User, Update_Date,
                            SuppressMessages):
    import datetime as datetime
    from Model import BPXDatabase as bpx
    from Model import ModelLayer as m

    Success = True
    Messages = []

    try:
        config = m.GetConfig()
        DBObj = bpx.BPXDatabase(config['server'], config['database'],
                                config['UID'])

        #Query the LE results
        LE_query = 'select * from [LEForecastDatabase].[dbo].[LE_Data] where HeaderName = \'' + LE_Name + '\''
        res, df = DBObj.Query(LE_query)

        count = 1
        for idx, row in df.iterrows():
            FracHitObj = m.FracHitMultipliersRow(row['HeaderName'],
                                                 row['CorpID'],
                                                 row['Date_Key'],
                                                 str(DefaultValue), DBObj)
            Success, Message = FracHitObj.Write(Update_User, Update_Date)
            if not Success:
                Messages.append(Message)

            if not SuppressMessages:
                callprogressbar(count, df.shape[0])
            count = count + 1

    except Exception as ex:
        Success = False
        Messages.append(
            'Error during write of default frac hit multipliers. ' + str(ex))

    return Success, Messages
Exemple #4
0
def WriteAriesScenarioToDB(scenarioName,
                           ForecastName,
                           ForecastYear,
                           start_date,
                           end_date,
                           User,
                           Area,
                           GFO=False,
                           CorpID=['ALL']):
    from Model import ImportUtility as i
    from Model import BPXDatabase as bpxdb
    from Model import ModelLayer as m
    import datetime as dt

    Success = True
    Messages = []

    try:
        #Query the Aries database using import methods
        scenario_results, Success, Messages = i.ImportAriesByScenario(
            scenarioName, start_date, end_date, Area)

        #Create NF columns for oil and gas (replace nan with 0)
        scenario_results['OilNF'] = scenario_results[
            'C754'] / scenario_results['GasProduction']
        scenario_results['GasNF'] = scenario_results[
            'C753'] / scenario_results['OilProduction']

        scenario_results = scenario_results.fillna(0)

        #Obtain list from scenario query results
        CorpID_list = scenario_results['CorpID'].to_list()
        CorpID_list = list(set(CorpID_list))

        config = m.GetConfig()
        DBObj = bpxdb.BPXDatabase(config['server'], config['database'],
                                  config['UID'])

        #Linearly regress the data
        #Two segments: previous month's mid average and next month's mid average - regress to both to get the values.
        count = 1
        for corpID in CorpID_list:
            #Get the subset of results that match this wellflac
            corpid_scenario_df = scenario_results.query('CorpID == @corpID')
            corpid_scenario_df = corpid_scenario_df.sort_values(by=['Date'],
                                                                ascending=True)

            if corpid_scenario_df.shape[0] > 1:
                df_previous_row = (0, corpid_scenario_df.iloc[1])

                wellflac_count = 1
                header_corpID = ''
                for df_row in corpid_scenario_df.iterrows():

                    if wellflac_count == 1:
                        df_next_row = corpid_scenario_df.iloc[wellflac_count]
                        results = InterpolateDailyRatesFromMonthlyVolumes(
                            CurrentMonthVal=df_row[1],
                            NextMonthVal=df_next_row)
                    else:
                        results = InterpolateDailyRatesFromMonthlyVolumes(
                            CurrentMonthVal=df_row[1],
                            PreviousMonthVal=df_previous_row[1])

                    Success, Message = WriteInterpolatedForecastToDB(
                        df_row[1]['WellName'], corpID, ForecastName,
                        ForecastYear, scenarioName, GFO, User, results)

                    if not Success:
                        Messages.append(Message)
                        break

                    df_previous_row = df_row

                    wellflac_count = wellflac_count + 1

            callprogressbar(count, len(CorpID_list))
            count = count + 1

    except Exception as ex:
        Success = False
        Messages.append(
            'Failed to write the results from chosen scenario in Aries database. '
            + str(ex))

    return Success, Messages
Exemple #5
0
def SOHA_WriteInternalForecasttoDB(df,
                                   ForecastName,
                                   ForecastYear,
                                   Production_Column_Name,
                                   User,
                                   GFO=True):
    #Part of to be deprecated methods to convert SoHa internal GFO data to standard
    from Model import BPXDatabase as bpx
    from Model import ModelLayer as m
    import datetime as dt
    from Model import QueryFile as qf

    Success = True
    Messages = []

    try:
        config = m.GetConfig()
        DBObj = bpx.BPXDatabase(config['server'], config['database'],
                                config['UID'])
        EDWObj = bpx.GetDBEnvironment('ProdEDW', 'OVERRIDE')

        wellname_list = df['WellName'].unique()
        wellname_list = list(wellname_list)
        if '' in wellname_list:
            wellname_list.remove('')
        count = 1
        for name in wellname_list:
            monthly_df = df.query('WellName == @name')
            monthly_df = monthly_df.sort_values(by=['Date'], ascending=True)
            df_previous_row = (0, monthly_df.iloc[1])
            nettingFactor = monthly_df['NettingFactor'].values[0]
            well_count = 1
            header_corpid = ''
            for df_row in monthly_df.iterrows():
                if well_count == 1:
                    df_next_row = monthly_df.iloc[well_count]
                    results = InterpolateDailyRatesFromMonthlyRates(
                        CurrentMonthVal=df_row[1],
                        NextMonthVal=df_next_row,
                        GasRateField=Production_Column_Name)
                elif well_count != monthly_df.shape[0] and well_count != 1:
                    df_next_row = monthly_df.iloc[well_count]
                    results = InterpolateDailyRatesFromMonthlyRates(
                        CurrentMonthVal=df_row[1],
                        NextMonthVal=df_next_row,
                        PreviousMonthVal=df_previous_row[1],
                        GasRateField=Production_Column_Name)
                elif well_count == monthly_df.shape[0]:
                    results = InterpolateDailyRatesFromMonthlyRates(
                        CurrentMonthVal=df_row[1],
                        PreviousMonthVal=df_previous_row[1],
                        GasRateField=Production_Column_Name)

                for row in results.iterrows():
                    corpid_query = qf.EDWKeyQueryFromWellName([name])
                    corpid_results = EDWObj.Query(corpid_query)
                    if not corpid_results[1].empty:
                        CorpID = corpid_results[1].at[0, 'CorpID']
                    else:
                        CorpID = name
                    WellName = name
                    Update_Date = dt.datetime.now().strftime(
                        "%Y-%m-%d %H:%M:%S")
                    Update_User = User
                    if header_corpid != CorpID:
                        #Create Header entry
                        header_corpid = CorpID
                        ForecastHeaderObj = m.ForecastHeaderRow(
                            WellName, CorpID, ForecastName, ForecastYear, '',
                            [], GFO, DBObj)
                        Success, Message = ForecastHeaderObj.Write(
                            Update_User, Update_Date)
                        if not Success:
                            Messages.append(Message)

                    Date_Key = row[1]['Date'].strftime('%m/%d/%Y')
                    Gas_Production = row[1]['GasProduction']
                    GasNF = row[1]['GasNF']
                    if Gas_Production >= 0 and Date_Key:
                        ForecastDataObj = m.ForecastDataRow(
                            ForecastName, CorpID, Date_Key, Gas_Production, 0,
                            0, GasNF, 0, 0, DBObj)
                        Success, Message = ForecastDataObj.Write(
                            Update_User, Update_Date)
                        if not Success:
                            Messages.append(Message)

                    df_previous_row = df_row

                well_count = well_count + 1

            callprogressbar(count, len(wellname_list))
            count = count + 1

    except Exception as ex:
        Success = False
        Messages.append('Error writing Forecast to Database. ' + str(ex))

    return Success, Messages