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
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
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
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
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