library(tidyverse) #setwd("../") PERM <- read_csv("./Data/Raw_Data/TerraPower_Report_Data/Monthly_In_Migration_Operations_Workforce.csv") NUM_YEARS <- ceiling(nrow(PERM)/12) DATES <- as.Date(paste0(2025,"-",8:12,"-",18)) for(YEAR in 2026:(2026+NUM_YEARS)){ DATES <- c(DATES,as.Date(paste0(YEAR,"-",1:12,"-",18))) } PERM$Date <- DATES[1:nrow(PERM)] PERM$Year <- year(PERM$Date) PERM$Add_Emp <- c(0,diff(PERM$In_Migration)) PERM$Perm_Migration_Including_Families <- PERM[,"In_Migration"]*0.8*3.05 #TerraPower assumes 80% have families and the average family is 3.2 people, but in wyoming the average is stated as 3.05 OPERATOR <- PERM %>% group_by(Year) %>% summarize(Operator_Emp_Average =mean(In_Migration),Operator_Emp_Migrated=sum(Add_Emp),Total_Op_and_Fam_Migration=max(Perm_Migration_Including_Families)) OPERATOR[,"Total_Op_and_Fam_Migration"] <- c(0,diff(round(pull(OPERATOR,"Total_Op_and_Fam_Migration")))) TEMP <- read_csv("./Data/Raw_Data/TerraPower_Report_Data/Monthly_In_Migration_Construction_Workforce.csv") TEMP$Date <- DATES[1:nrow(TEMP)] TEMP$Year <- year(TEMP$Date) TEMP[,1] <- 0.41*TEMP[,1] #TerraPower assumes 41% migrate into Lincoln TEMP$Add_Emp <- c(0,diff(TEMP$In_Migration)) TEMP <- TEMP %>% group_by(Year) %>% summarize(Temp_Emp_Migration=round(sum(Add_Emp)),Average_Temp_Workers=round(mean(In_Migration) )) TEMP[,"Total_Migration"] <- round(TEMP[,2]+TEMP[,2]*0.37*3.05) #TerraPower assumes 37% will bring families and the average family is 3.2 people, but states Wyoming averages 3.05 family save CONSTRUCTION <-TEMP %>% select(Year,Construction_Emp_Average=Average_Temp_Workers,Construction_Emp_Migrated=Temp_Emp_Migration,Total_Con_and_Fam_Migration=Total_Migration) TEMP$End_Year_Temp_Workers <- c(cumsum(TEMP$Temp_Emp_Migration)) #Set the total to zero #Employment CONSTRUCTION[4:7,3] <- CONSTRUCTION[4:7,3] -1 CONSTRUCTION[6:7,3] <- CONSTRUCTION[6:7,3] -1 #Family Migration CONSTRUCTION[4:7,4] <- CONSTRUCTION[4:7,4] -3 #colSums(CONSTRUCTION[,3:4]) #colSums(OPERATOR[,3:4]) if(!exists("SAVE_LOC")){SAVE_LOC <-"./Data/Cleaned_Data/TerraPower_Impact/"} dir.create(SAVE_LOC, recursive = TRUE, showWarnings = FALSE) saveRDS(CONSTRUCTION,paste0(SAVE_LOC,"Construction_Related_Migration.Rds")) saveRDS(OPERATOR,paste0(SAVE_LOC,"Operating_Worker_Related_Migration.Rds")) #####Double check that Kemmere can house all people #1,451 tota units required acording to TerraPower REQUIRED_IN_LIN <- 1451*0.41 TOTAL_IN_KEM <- 333 #According to ACS data EXPECTED_NEW_IN_KEM <- 750 #According to TerraPower Kemmerer is agressively zoning and will conservativley add 750 houses available to the project (0.75*TOTAL_IN_KEM+750)/REQUIRED_IN_LIN #Shows a surplus of houses in Kemmerer ############################################################TerraPower IMPLAN estimates CLEAN_IMPLAN <- function(DF){ DF <- DF[,-1] COLNAMES <- c("Industry","Direct","Indirect","Induced","Total") colnames(DF) <- COLNAMES DF<- DF %>% filter(!is.na(Industry)) DF[,1] <- trimws(str_replace_all(str_replace_all(t(DF[,1]), "[:digit:]|-| |A |B ", "")," ","")) return(DF) } KEM_IMPLAN <- CLEAN_IMPLAN(read_csv("Data/Raw_Data/IMPLAN_Employment_Outputs_2_Difit_NAICS/Kemmerer_40_Data_Center_Operators.csv")) LIN_IMPLAN <- CLEAN_IMPLAN(read_csv("Data/Raw_Data/IMPLAN_Employment_Outputs_2_Difit_NAICS/Lincoln_40_Data_Center_Operators.csv")) DIFF <- LIN_IMPLAN %>% mutate(LIN_TOTAL=Total-Direct) %>% select(Industry,LIN_TOTAL) %>% full_join(KEM_IMPLAN %>% mutate(KEM_TOTAL=Total-Direct) %>% select(Industry,KEM_TOTAL)) LIN_IMPLAN %>% full_join(KEM_IMPLAN) DIFF[,"Gap"] <- DIFF[,2]-DIFF[,3] DIFF$Adjustable_Industry <- DIFF$Industry %in% c('Accommodation and Food Services','Retail Trade','Health Care and Social Assistance','Real Estate and Rental and Leasing','Arts, Entertainment, and Recreation','Manufacturing','Other Services (except Public Administration)') DIFF[which(DIFF$Adjustable_Industry),] ADDED_JOBS <- DIFF %>% mutate(KEM_POSSIBLE_INDUCED=Gap*Adjustable_Industry) %>% select(KEM_INDUCED= KEM_TOTAL,KEM_POSSIBLE_INDUCED) ADDED_JOBS <- colSums(ADDED_JOBS) POP_WORK_RATIO <-3716/1920.54 #Total population of Kemmerer in 2024 divided total employment both are found in IMPLAN region details for zip code 83101 ADDED_PEOPLE <- POP_WORK_RATIO*ADDED_JOBS ADDED_PEOPLE[2]-ADDED_PEOPLE[1] KEM_OP_IMPLAN <- CLEAN_IMPLAN(read_csv("Data/Raw_Data/IMPLAN_Employment_Outputs_2_Difit_NAICS/Kemmerer_100_Nuclear_Operators.csv")) LIN_OP_IMPLAN <- CLEAN_IMPLAN(read_csv("Data/Raw_Data/IMPLAN_Employment_Outputs_2_Difit_NAICS/Lincoln_100_Nuclear_Operators.csv")) OP_DIFF <- LIN_OP_IMPLAN %>% mutate(LIN_OP_TOTAL=Total-Direct) %>% select(Industry,LIN_OP_TOTAL) %>% full_join(KEM_OP_IMPLAN %>% mutate(KEM_OP_TOTAL=Total-Direct) %>% select(Industry,KEM_OP_TOTAL)) OP_DIFF OP_DIFF[,"Gap"] <- OP_DIFF[,2]-OP_DIFF[,3] OP_DIFF$Adjustable_Industry <- OP_DIFF$Industry %in% c('Accommodation and Food Services','Retail Trade','Health Care and Social Assistance','Real Estate and Rental and Leasing','Arts, Entertainment, and Recreation','Manufacturing','Other Services (except Public Administration)') OP_DIFF OPERATION_ADDED_JOBS <- OP_DIFF %>% mutate(KEM_POSSIBLE_INDUCED=Gap*Adjustable_Industry) %>% select(KEM_INDUCED= KEM_OP_TOTAL,KEM_POSSIBLE_INDUCED) OPERATION_ADDED_JOBS <- colSums(OPERATION_ADDED_JOBS ) OPERATION_ADDED_PEOPLE <- OPERATION_ADDED_JOBS*POP_WORK_RATIO OPERATION_ADDED_PEOPLE[2]-OPERATION_ADDED_PEOPLE[1] RES <- rbind(CONSTRUCTION_ADDED_JOBS,OPERATION_ADDED_JOBS) %>% as_tibble RES*POP_WORK_RATIO #Total family included migration, converted per person (rather than per 100 jobs) RES$Job_Type <- c("Construction","Operator") RES <- RES[,c(3,1:2)] saveRDS(RES,paste0(SAVE_LOC,"Induced_Jobs.Rds"))