ltc-code 0.2.15__tar.gz → 0.2.17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {ltc_code-0.2.15 → ltc_code-0.2.17}/PKG-INFO +1 -1
  2. {ltc_code-0.2.15 → ltc_code-0.2.17}/pyproject.toml +1 -1
  3. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/build_nsc_outcomes.py +127 -42
  4. ltc_code-0.2.17/src/ltc_code/nsc/raw/chetty/mrc_table11.dta +0 -0
  5. ltc_code-0.2.15/src/ltc_code/.DS_Store +0 -0
  6. ltc_code-0.2.15/src/ltc_code/nsc/.DS_Store +0 -0
  7. ltc_code-0.2.15/src/ltc_code/nsc/raw/.DS_Store +0 -0
  8. {ltc_code-0.2.15 → ltc_code-0.2.17}/README.md +0 -0
  9. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/aspire.py +0 -0
  10. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/check_cmo_apps.do +0 -0
  11. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/christel_house.py +0 -0
  12. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/democracy_prep.py +0 -0
  13. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/green_dot.py +0 -0
  14. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/helpers.py +0 -0
  15. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/ilt.py +0 -0
  16. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/kipp_nj.py +0 -0
  17. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/main.py +0 -0
  18. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/mappings.py +0 -0
  19. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/rocketship.py +0 -0
  20. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/yes_prep.py +0 -0
  21. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/aspire.py +0 -0
  22. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/christel_house.py +0 -0
  23. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/democracy_prep.py +0 -0
  24. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/green_dot.py +0 -0
  25. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/ilt.py +0 -0
  26. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/kipp.py +0 -0
  27. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/kipp_nj.py +0 -0
  28. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/rocketship.py +0 -0
  29. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/yes_prep.py +0 -0
  30. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/BALANCE.do +0 -0
  31. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/FS.do +0 -0
  32. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/ITT.do +0 -0
  33. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/TOT.do +0 -0
  34. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/apps_helpers.py +0 -0
  35. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/harmony.py +0 -0
  36. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/main.py +0 -0
  37. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260712_uncommon_scripts/main.py +0 -0
  38. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260712_uncommon_scripts/mappings.py +0 -0
  39. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260712_uncommon_scripts/uncommon.py +0 -0
  40. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/__init__.py +0 -0
  41. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/aspire.py +0 -0
  42. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/check_cmo_apps.do +0 -0
  43. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/christel_house.py +0 -0
  44. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/green_dot.py +0 -0
  45. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/helpers.py +0 -0
  46. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june13.py +0 -0
  47. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june2.py +0 -0
  48. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june30.py +0 -0
  49. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june5.py +0 -0
  50. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june7.py +0 -0
  51. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/kipp_nj.py +0 -0
  52. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/kipp_tx.py +0 -0
  53. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/main.py +0 -0
  54. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/mappings.py +0 -0
  55. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/may27.py +0 -0
  56. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/__init__.py +0 -0
  57. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/input/.gitkeep +0 -0
  58. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/naics.csv +0 -0
  59. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/naics.py +0 -0
  60. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/naics_raw.xlsx +0 -0
  61. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/output/.gitkeep +0 -0
  62. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/CREDENTIAL_LEVEL_LOOKUP_TABLE.xlsx +0 -0
  63. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/IPEDS_IC_2013.csv +0 -0
  64. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/IPEDS_IC_manual.xlsx +0 -0
  65. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/chetty/mrc_table2.dta +0 -0
  66. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/college_crosswalk.xls +0 -0
  67. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/directory.dta +0 -0
  68. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/run_nsc_outcomes.py +0 -0
  69. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/polars_dates.py +0 -0
  70. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/rocketship.py +0 -0
  71. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/schema_mapping.py +0 -0
  72. {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/yes_prep.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: ltc-code
3
- Version: 0.2.15
3
+ Version: 0.2.17
4
4
  Summary: Add your description here
5
5
  Requires-Dist: fastexcel>=0.16,<0.20
6
6
  Requires-Dist: polars>=1.36.1,<1.42
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ltc-code"
3
- version = "0.2.15"
3
+ version = "0.2.17"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9"
@@ -43,25 +43,32 @@ CHETTY_MRC_TABLE2 = next(
43
43
  )
44
44
  # Chetty/Barron college tier lookup. Numeric tier 1/2 identifies elite colleges.
45
45
 
46
- INPUT_NSC = PACKAGE_NSC / "input"
47
- # Folder for secured Census inputs that are not packaged with the code.
46
+ CHETTY_MRC_TABLE11_CANDIDATES = [
47
+ RAW_NSC / "chetty" / "mrc_table11.dta",
48
+ RAW_NSC / "mrc_table11.dta",
49
+ PACKAGE_NSC.parents[3] / "College" / "chetty" / "mrc_table11.dta",
50
+ ]
51
+ CHETTY_MRC_TABLE11 = next(
52
+ (path for path in CHETTY_MRC_TABLE11_CANDIDATES if path.exists()),
53
+ CHETTY_MRC_TABLE11_CANDIDATES[0],
54
+ )
55
+ # Chetty OPE-to-super-OPE crosswalk used to attach tier to NSC schools.
56
+
48
57
 
49
58
  APPS = INPUT_NSC / "apps.csv"
50
59
  # Application/student records; source for unique sid_cepr/cohort_lottery.
51
60
 
52
- NSC_RECORDS = INPUT_NSC / "nsc_records.csv"
53
- # Long NSC enrollment and degree records.
61
+ INPUT_NSC = PACKAGE_NSC / "input"
62
+ # Folder for secured Census inputs that are not packaged with the code.
63
+
54
64
 
55
65
  INPUT_NSC_OLD = INPUT_NSC / "nsc_records_old.dta"
56
66
  # Older NSC pull, kept so the build can append old and new NSC versions.
57
67
 
58
- INPUT_NSC_NEW = INPUT_NSC / "nsc_records_new.dta"
68
+ INPUT_NSC_NEW = INPUT_NSC / "nsc_records_new.csv"
59
69
  # Newer NSC pull with studyid-based rows.
60
70
 
61
- OUTPUT_NSC = PACKAGE_NSC / "output"
62
- # Package-local output folder for NSC outcome files.
63
-
64
- OUTCOMES = OUTPUT_NSC / "nsc_outcomes.parquet"
71
+ OUTCOMES_OUTPUT = OUTPUT_NSC / "nsc_outcomes.parquet"
65
72
  # Final student-level NSC outcomes file.
66
73
 
67
74
 
@@ -85,12 +92,15 @@ COLLEGE_TYPES = ["any", "4yr", "2yr", "elite"]
85
92
  college_crosswalk = (
86
93
  pl.read_excel(
87
94
  COLLEGE_CROSSWALK,
88
- columns=["ID_IPEDS", "ID_OPE", "ID_FSC_long", "name"],
95
+ columns=["ID_IPEDS", "ID_OPE", "ID_FSC", "ID_FSC_long", "name"],
89
96
  )
90
97
  .with_columns(
91
- pl.col("ID_FSC_long")
92
- .cast(pl.String)
93
- .str.strip_chars()
98
+ pl.coalesce(
99
+ [
100
+ pl.col("ID_FSC_long").cast(pl.String).str.strip_chars(),
101
+ pl.col("ID_FSC").cast(pl.String).str.strip_chars() + pl.lit("-00")
102
+ ]
103
+ )
94
104
  .str.replace(r"\.0$", "")
95
105
  .alias("ID_FSC"),
96
106
  pl.col("ID_IPEDS").cast(pl.Int64, strict=False).alias("unitid"),
@@ -98,8 +108,11 @@ college_crosswalk = (
98
108
  )
99
109
  .select("ID_FSC", "unitid", "ID_OPE", "name")
100
110
  .rename({"name": "college_name_crosswalk"})
101
- .drop_nulls("ID_FSC")
111
+ .drop_nulls(["ID_FSC", "unitid"])
102
112
  .unique("ID_FSC", keep="first")
113
+ .with_columns(
114
+ pl.col("ID_FSC").str.slice(0, 6).cast(pl.Int64, strict=False).alias("opeid")
115
+ )
103
116
  )
104
117
 
105
118
 
@@ -210,24 +223,42 @@ directory = (
210
223
  .select("unitid", "college_name_directory", "years_directory", "ownership_directory")
211
224
  )
212
225
 
213
- # Chetty/Barron tiers are keyed at the super-OPE level. The NSC college
214
- # crosswalk carries OPE IDs, so joining tier onto college_ref makes the tier
215
- # available on each enrollment spell.
226
+ # Chetty/Barron tiers are keyed at super-OPE level. Table 11 maps school OPE IDs
227
+ # to those super-OPE groups, which is the same route Sarah's Stata code uses.
216
228
  chetty_tiers = (
217
229
  scan_readstat(
218
230
  CHETTY_MRC_TABLE2,
219
231
  missing_string_as_null=True,
220
232
  value_labels_as_strings=False,
221
233
  )
222
- .select("super_opeid", "tier")
234
+ .select("super_opeid", "tier", "tier_name")
223
235
  .collect()
224
236
  .with_columns(
225
- pl.col("super_opeid").cast(pl.Int64, strict=False).alias("ID_OPE"),
237
+ pl.col("super_opeid").cast(pl.Int64, strict=False),
226
238
  pl.col("tier").cast(pl.Int8, strict=False),
227
239
  )
228
- .select("ID_OPE", "tier")
229
- .drop_nulls("ID_OPE")
230
- .unique("ID_OPE", keep="first")
240
+ .drop_nulls("super_opeid")
241
+ .unique("super_opeid", keep="first")
242
+ )
243
+
244
+ chetty_ope_crosswalk = (
245
+ scan_readstat(
246
+ CHETTY_MRC_TABLE11,
247
+ missing_string_as_null=True,
248
+ value_labels_as_strings=False,
249
+ )
250
+ .select("opeid", "super_opeid", "superopeid_name")
251
+ .collect()
252
+ .with_columns(
253
+ pl.col("opeid").cast(pl.Int64, strict=False),
254
+ pl.col("super_opeid").cast(pl.Int64, strict=False),
255
+ )
256
+ .drop_nulls("opeid")
257
+ )
258
+
259
+ chetty_by_opeid = (
260
+ chetty_ope_crosswalk.join(chetty_tiers, on="super_opeid", how="left")
261
+ .unique("opeid", keep="first")
231
262
  )
232
263
 
233
264
 
@@ -240,7 +271,7 @@ college_ref = (
240
271
  college_crosswalk.join(ipeds_2013, on="unitid", how="left")
241
272
  .join(ipeds_manual, on="unitid", how="left")
242
273
  .join(directory, on="unitid", how="left")
243
- .join(chetty_tiers, on="ID_OPE", how="left", validate="m:1")
274
+ .join(chetty_by_opeid, on="opeid", how="left", validate="m:1")
244
275
  .with_columns(
245
276
  pl.coalesce(
246
277
  [
@@ -297,22 +328,25 @@ college_ref = (
297
328
 
298
329
  # Start from unique students. cohort_lottery is the birth cohort; cohort_18 is
299
330
  # the year the student turns 18 and anchors Sarah's Y1/Y2/... outcome windows.
300
- if str(APPS).endswith(".dta"):
301
- apps_raw = scan_readstat(
302
- APPS, missing_string_as_null=True, value_labels_as_strings=True
303
- ).collect()
304
- else:
305
- apps_raw = pl.read_csv(APPS)
331
+
306
332
 
307
333
  apps = (
308
- apps_raw.select("sid_cepr", "cohort_lottery")
334
+ scan_readstat(
335
+ APPS, missing_string_as_null=True, value_labels_as_strings=True
336
+ )
337
+ .select("sid_cepr", "cohort_lottery")
309
338
  .drop_nulls(["sid_cepr", "cohort_lottery"])
310
339
  .with_columns(
311
340
  pl.col("sid_cepr").cast(pl.Int64),
312
341
  pl.col("cohort_lottery").cast(pl.Int64),
313
342
  )
314
- .unique(["sid_cepr", "cohort_lottery"])
343
+ .filter(
344
+ pl.col("cohort_lottery").is_between(1990, 2005)
345
+ )
346
+ .sort("cohort_lottery")
347
+ .unique(["sid_cepr"])
315
348
  .with_columns((pl.col("cohort_lottery") + 18).alias("cohort_18"))
349
+ .collect()
316
350
  )
317
351
 
318
352
  # These branch-code fixes mirror the Sarah code path that maps known bad FSC
@@ -398,7 +432,11 @@ fsc_branch_fixes = [
398
432
  # The real NSC file uses raw NSC names; Sarah renames these before building
399
433
  # outcomes. This block makes those same names explicit in Polars.
400
434
  nsc_old = (
401
- scan_readstat(INPUT_NSC_OLD, missing_string_as_null=True, value_labels_as_strings=True)
435
+ scan_readstat(INPUT_NSC_OLD, missing_string_as_null=True, value_labels_as_strings=True, schema_overrides={
436
+ "searchdate": pl.String
437
+ }
438
+ )
439
+ .collect()
402
440
  .with_columns(
403
441
  pl.lit(2023).alias("NSCdatayear"),
404
442
 
@@ -407,15 +445,45 @@ nsc_old = (
407
445
  .cast(pl.Int32)
408
446
  .alias("searchbeginyear")
409
447
  )
410
- .collect()
411
448
  )
412
449
 
413
450
  nsc_new = (
414
- scan_readstat(INPUT_NSC_NEW, missing_string_as_null=True, value_labels_as_strings=True)
451
+ pl.scan_csv(INPUT_NSC_NEW, infer_schema=False, null_values=[""], try_parse_dates=False, ignore_errors=False,)
452
+ .rename({
453
+ "Study ID": "studyid",
454
+ "Record Found Y/N": "recordfoundyn",
455
+ "College Code/Branch": "collegecodebranch",
456
+ "College Name": "collegename",
457
+ "College State": "collegestate",
458
+ "2-year / 4-year": "2year4year",
459
+ "Public / Private": "publicprivate",
460
+ "Enrollment Begin": "enrollmentbegin",
461
+ "Enrollment End": "enrollmentend",
462
+ "Enrollment Status": "enrollmentstatus",
463
+ "Class Level": "classlevel",
464
+ "Enrollment Major 1": "enrollmentmajor1",
465
+ "Enrollment CIP 1": "enrollmentcip1",
466
+ "Enrollment Major 2": "enrollmentmajor2",
467
+ "Enrollment CIP 2": "enrollmentcip2",
468
+ "Graduated?": "graduated",
469
+ "Graduation Date": "graduationdate",
470
+ "Degree Title": "degreetitle",
471
+ "Degree Major 1": "degreemajor1",
472
+ "Degree CIP 1": "degreecip1",
473
+ "Degree Major 2": "degreemajor2",
474
+ "Degree CIP 2": "degreecip2",
475
+ "Degree Major 3": "degreemajor3",
476
+ "Degree CIP 3": "degreecip3",
477
+ "Degree Major 4": "degreemajor4",
478
+ "Degree CIP 4": "degreecip4",
479
+ "College Sequence": "collegesequence",
480
+ "Student Age at start of term": "studentageatstartofterm",
481
+
482
+ })
415
483
  .with_row_index("origsrt", offset=1)
416
484
  .filter(pl.col("studyid").is_not_null())
417
485
  .with_columns(
418
- pl.col("studyid").cast(pl.String).str.replace_all("_", "").alias("sid_cepr")
486
+ pl.col("studyid").cast(pl.String).str.split("_").alias("sid_cepr")
419
487
  )
420
488
  .explode("sid_cepr")
421
489
  .filter(pl.col("sid_cepr") != "")
@@ -759,8 +827,15 @@ for year in range(1, N_YEARS_OUT + 1):
759
827
  end_month, end_day = 6, 30
760
828
 
761
829
  bounded = enroll.with_columns(
762
- pl.date(start_year, start_month, start_day).alias("_window_start"),
763
- pl.date(end_year, end_month, end_day).alias("_window_end"),
830
+ start_year.alias("_window_start_year"),
831
+ end_year.alias("_window_end_year"),
832
+ ).with_columns(
833
+ pl.date(pl.col("_window_start_year"), start_month, start_day).alias(
834
+ "_window_start"
835
+ ),
836
+ pl.date(pl.col("_window_end_year"), end_month, end_day).alias(
837
+ "_window_end"
838
+ ),
764
839
  ).with_columns(
765
840
  (
766
841
  (pl.col("term_start_date") <= pl.col("_window_end"))
@@ -870,6 +945,7 @@ degree_title = pl.col("_degree_title_clean").fill_null("")
870
945
  degrees = (
871
946
  nsc.filter(pl.col("graduated") == "Y")
872
947
  .filter(pl.col("graduated_date").is_not_null())
948
+ .filter(pl.col("graduated_date") <= NSC_CUTOFF_DATE)
873
949
  .with_columns(
874
950
  pl.col("degree_title")
875
951
  .cast(pl.String)
@@ -1148,6 +1224,13 @@ for year in range(1, N_YEARS_OUT + 1):
1148
1224
  (pl.col("_by_end") * pl.col("_degree").is_in(["AA", "BA"]).cast(pl.Int8))
1149
1225
  .max()
1150
1226
  .alias(f"cmp_any_byY{year}"),
1227
+ (
1228
+ pl.col("_by_end")
1229
+ * pl.col("_degree").is_in(["AA", "BA"]).cast(pl.Int8)
1230
+ * pl.col("college_elite").fill_null(0).cast(pl.Int8)
1231
+ )
1232
+ .max()
1233
+ .alias(f"cmp_elite_byY{year}"),
1151
1234
  )
1152
1235
  )
1153
1236
 
@@ -1206,8 +1289,8 @@ degree_outcomes = degree_outcomes.join(degree_details, on="sid_cepr", how="left"
1206
1289
 
1207
1290
  # Merge enrollment and degree outcomes back to the unique application universe.
1208
1291
  nsc_outcomes = (
1209
- apps.join(enrollment_outcomes, on="sid_cepr", how="left")
1210
- .join(degree_outcomes, on="sid_cepr", how="left")
1292
+ apps.join(enrollment_outcomes, on="sid_cepr", how="left", validate="m:1")
1293
+ .join(degree_outcomes, on="sid_cepr", how="left", validate="m:1")
1211
1294
  )
1212
1295
 
1213
1296
  for year in range(1, N_YEARS_OUT + 1):
@@ -1274,20 +1357,22 @@ for year in range(1, N_YEARS_OUT + 1):
1274
1357
  ###########################################################
1275
1358
 
1276
1359
  outcome_columns = [
1277
- "att_any_inY1", "att_any_inY2", "att_any_inY3", "att_any_inY4",
1278
- "att_4yr_inY1", "att_4yr_inY2", "att_4yr_inY3", "att_4yr_inY4",
1360
+ "att_any_inY1", "att_any_inY2", "att_any_inY3", "att_any_inY4", "att_any_inY5", "att_any_inY6", "att_any_inY7", "att_any_inY8",
1361
+ "att_4yr_inY1", "att_4yr_inY2", "att_4yr_inY3", "att_4yr_inY4", "att_4yr_inY5", "att_4yr_inY6", "att_4yr_inY7", "att_4yr_inY8",
1279
1362
  "att_2yr_inY1", "att_2yr_inY2", "att_2yr_inY3", "att_2yr_inY4",
1280
1363
  "att_elite_inY1", "att_elite_inY2", "att_elite_inY3", "att_elite_inY4",
1281
1364
 
1282
1365
  "att_any_byY2", "att_any_byY3", "att_any_byY4",
1283
1366
  "att_4yr_byY2", "att_4yr_byY3", "att_4yr_byY4",
1284
1367
  "att_2yr_byY2", "att_2yr_byY3", "att_2yr_byY4",
1285
- "att_elite_byY2", "att_elite_byY3", "att_elite_byY4",
1368
+ "att_elite_byY2", "att_elite_byY3", "att_elite_byY4", "att_elite_byY5", "att_elite_byY6"
1286
1369
 
1287
1370
  "cmp_any_byY4", "cmp_any_byY5", "cmp_any_byY6", "cmp_any_byY7", "cmp_any_byY8",
1288
1371
  "cmp_AA_byY4", "cmp_AA_byY5", "cmp_AA_byY6", "cmp_AA_byY7", "cmp_AA_byY8",
1289
1372
  "cmp_BA_byY4", "cmp_BA_byY5", "cmp_BA_byY6", "cmp_BA_byY7", "cmp_BA_byY8",
1290
1373
 
1374
+ "cmp_elite_byY4", "cmp_elite_byY5", "cmp_elite_byY6", "cmp_elite_byY7", "cmp_elite_byY8"
1375
+
1291
1376
 
1292
1377
  ]
1293
1378
 
Binary file
Binary file
File without changes