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.
- {ltc_code-0.2.15 → ltc_code-0.2.17}/PKG-INFO +1 -1
- {ltc_code-0.2.15 → ltc_code-0.2.17}/pyproject.toml +1 -1
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/build_nsc_outcomes.py +127 -42
- ltc_code-0.2.17/src/ltc_code/nsc/raw/chetty/mrc_table11.dta +0 -0
- ltc_code-0.2.15/src/ltc_code/.DS_Store +0 -0
- ltc_code-0.2.15/src/ltc_code/nsc/.DS_Store +0 -0
- ltc_code-0.2.15/src/ltc_code/nsc/raw/.DS_Store +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/README.md +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/aspire.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/check_cmo_apps.do +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/christel_house.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/democracy_prep.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/green_dot.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/helpers.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/ilt.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/kipp_nj.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/main.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/mappings.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/rocketship.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/yes_prep.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/aspire.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/christel_house.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/democracy_prep.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/green_dot.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/ilt.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/kipp.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/kipp_nj.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/rocketship.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/yes_prep.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/BALANCE.do +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/FS.do +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/ITT.do +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/TOT.do +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/apps_helpers.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/harmony.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260706_ceprscripts/main.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260712_uncommon_scripts/main.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260712_uncommon_scripts/mappings.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260712_uncommon_scripts/uncommon.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/__init__.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/aspire.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/check_cmo_apps.do +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/christel_house.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/green_dot.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/helpers.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june13.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june2.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june30.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june5.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/june7.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/kipp_nj.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/kipp_tx.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/main.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/mappings.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/may27.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/__init__.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/input/.gitkeep +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/naics.csv +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/naics.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/naics_raw.xlsx +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/output/.gitkeep +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/CREDENTIAL_LEVEL_LOOKUP_TABLE.xlsx +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/IPEDS_IC_2013.csv +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/IPEDS_IC_manual.xlsx +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/chetty/mrc_table2.dta +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/college_crosswalk.xls +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/raw/directory.dta +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/nsc/run_nsc_outcomes.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/polars_dates.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/rocketship.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/schema_mapping.py +0 -0
- {ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/yes_prep.py +0 -0
|
@@ -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
|
-
|
|
47
|
-
|
|
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
|
-
|
|
53
|
-
#
|
|
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.
|
|
68
|
+
INPUT_NSC_NEW = INPUT_NSC / "nsc_records_new.csv"
|
|
59
69
|
# Newer NSC pull with studyid-based rows.
|
|
60
70
|
|
|
61
|
-
|
|
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.
|
|
92
|
-
|
|
93
|
-
|
|
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
|
|
214
|
-
#
|
|
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)
|
|
237
|
+
pl.col("super_opeid").cast(pl.Int64, strict=False),
|
|
226
238
|
pl.col("tier").cast(pl.Int8, strict=False),
|
|
227
239
|
)
|
|
228
|
-
.
|
|
229
|
-
.
|
|
230
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
763
|
-
|
|
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
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/aspire.py
RENAMED
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/check_cmo_apps.do
RENAMED
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/christel_house.py
RENAMED
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/democracy_prep.py
RENAMED
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/green_dot.py
RENAMED
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/kipp_nj.py
RENAMED
|
File without changes
|
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/mappings.py
RENAMED
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/rocketship.py
RENAMED
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260614_new_build_scripts_update/yes_prep.py
RENAMED
|
File without changes
|
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/christel_house.py
RENAMED
|
File without changes
|
{ltc_code-0.2.15 → ltc_code-0.2.17}/src/ltc_code/20260630_census_disclosure/democracy_prep.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|