ltc-code 0.2.22__tar.gz → 0.2.24__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.22 → ltc_code-0.2.24}/PKG-INFO +1 -1
- {ltc_code-0.2.22 → ltc_code-0.2.24}/pyproject.toml +1 -1
- ltc_code-0.2.24/pyproject.toml.orig +19 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/build_nsc_outcomes.py +65 -52
- ltc_code-0.2.22/src/ltc_code/.DS_Store +0 -0
- ltc_code-0.2.22/src/ltc_code/nsc/.DS_Store +0 -0
- ltc_code-0.2.22/src/ltc_code/nsc/naics.csv +0 -25
- ltc_code-0.2.22/src/ltc_code/nsc/naics_raw.xlsx +0 -0
- ltc_code-0.2.22/src/ltc_code/nsc/raw/.DS_Store +0 -0
- ltc_code-0.2.22/src/ltc_code/nsc/raw/CREDENTIAL_LEVEL_LOOKUP_TABLE.xlsx +0 -0
- ltc_code-0.2.22/src/ltc_code/nsc/raw/IPEDS_IC_2013.csv +0 -7647
- ltc_code-0.2.22/src/ltc_code/nsc/raw/IPEDS_IC_manual.xlsx +0 -0
- ltc_code-0.2.22/src/ltc_code/nsc/raw/chetty/mrc_table11.dta +0 -0
- ltc_code-0.2.22/src/ltc_code/nsc/raw/chetty/mrc_table2.dta +0 -0
- ltc_code-0.2.22/src/ltc_code/nsc/raw/college_crosswalk.xls +0 -0
- ltc_code-0.2.22/src/ltc_code/nsc/raw/directory.dta +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/README.md +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/aspire.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/check_cmo_apps.do +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/christel_house.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/democracy_prep.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/green_dot.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/helpers.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/ilt.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/kipp_nj.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/main.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/mappings.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/rocketship.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/yes_prep.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/aspire.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/christel_house.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/democracy_prep.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/green_dot.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/ilt.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/kipp.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/kipp_nj.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/rocketship.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/yes_prep.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/BALANCE.do +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/FS.do +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/ITT.do +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/TOT.do +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/apps_helpers.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/harmony.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/main.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260712_uncommon_scripts/main.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260712_uncommon_scripts/mappings.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260712_uncommon_scripts/uncommon.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/__init__.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/aspire.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/check_cmo_apps.do +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/christel_house.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/green_dot.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/helpers.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june13.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june2.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june30.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june5.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june7.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/kipp_nj.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/kipp_tx.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/main.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/make_summary_stats_table.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/mappings.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/may27.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/__init__.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/input/.gitkeep +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/naics.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/output/.gitkeep +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/raw/ipeds_data.dta +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/run_nsc_outcomes.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/polars_dates.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/rocketship.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/schema_mapping.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/school_name_xwalk/__init__.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/school_name_xwalk/all_schools_with_ccd.csv +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/school_name_xwalk/merge_school_ccd.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/signal_var_calcs.py +0 -0
- {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/yes_prep.py +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "ltc-code"
|
|
3
|
+
version = "0.2.24"
|
|
4
|
+
description = "Add your description here"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.9"
|
|
7
|
+
dependencies = [
|
|
8
|
+
"fastexcel>=0.16,<0.20",
|
|
9
|
+
"polars>=1.36.1,<1.42",
|
|
10
|
+
"polars-readstat>=0.20.2",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[project.scripts]
|
|
14
|
+
ltc-code = "ltc_code:main"
|
|
15
|
+
ltc-summary-stats = "ltc_code.make_summary_stats_table:main"
|
|
16
|
+
|
|
17
|
+
[build-system]
|
|
18
|
+
requires = ["uv_build>=0.11.16,<0.12.0"]
|
|
19
|
+
build-backend = "uv_build"
|
|
@@ -1529,7 +1529,7 @@ nsc_outcomes = (
|
|
|
1529
1529
|
)
|
|
1530
1530
|
|
|
1531
1531
|
# Sarah's later cleanup takes medians over the student-level analysis file by
|
|
1532
|
-
# tier.
|
|
1532
|
+
# tier. Use the by-Y4 window for the completion-rate fill.
|
|
1533
1533
|
tier_medians = (
|
|
1534
1534
|
nsc_outcomes.group_by("tier_firstinst")
|
|
1535
1535
|
.agg(
|
|
@@ -1555,7 +1555,7 @@ nsc_outcomes = (
|
|
|
1555
1555
|
.alias("k_mean"),
|
|
1556
1556
|
pl.when(
|
|
1557
1557
|
pl.col("completion_rate_150pct_ip").is_null()
|
|
1558
|
-
& (pl.col("
|
|
1558
|
+
& (pl.col("att_any_byY4") == 1)
|
|
1559
1559
|
)
|
|
1560
1560
|
.then(pl.col("completion_rate_150pct_tier_median"))
|
|
1561
1561
|
.otherwise(pl.col("completion_rate_150pct_ip"))
|
|
@@ -1643,83 +1643,58 @@ for age in AGE_ATTENDANCE_RANGE:
|
|
|
1643
1643
|
)
|
|
1644
1644
|
|
|
1645
1645
|
|
|
1646
|
-
#
|
|
1647
|
-
#
|
|
1646
|
+
# Define expected completion over the cumulative by-Y4 attendance window. The
|
|
1647
|
+
# detailed measure uses the first institution's rate (with the tier-median fill
|
|
1648
|
+
# above), gives observed nonattenders zero, and leaves attendee rates missing
|
|
1649
|
+
# when neither the institution rate nor its tier median is available.
|
|
1648
1650
|
nsc_outcomes = nsc_outcomes.with_columns(
|
|
1649
|
-
pl.when(pl.col("
|
|
1651
|
+
pl.when(pl.col("att_any_byY4") == 0)
|
|
1650
1652
|
.then(None)
|
|
1651
1653
|
.otherwise(pl.col("completion_rate_150pct_ip"))
|
|
1652
1654
|
.alias("completion_rate_150pct_ip")
|
|
1653
1655
|
)
|
|
1654
1656
|
|
|
1655
|
-
# Sarah creates cmp_rate as a copy of the restricted raw completion rate, then
|
|
1656
|
-
# fills missing cmp_rate values with the late-enrollee/control-group mean.
|
|
1657
1657
|
nsc_outcomes = nsc_outcomes.with_columns(
|
|
1658
1658
|
pl.col("completion_rate_150pct_ip").alias("cmp_rate"),
|
|
1659
|
-
pl.when(pl.col("
|
|
1659
|
+
pl.when(pl.col("att_any_byY4").is_null())
|
|
1660
1660
|
.then(None)
|
|
1661
|
-
.when(pl.col("
|
|
1661
|
+
.when(pl.col("att_4yr_byY4") == 1)
|
|
1662
1662
|
.then(cmp_rate_4yr_coarse)
|
|
1663
|
-
.when(pl.col("
|
|
1663
|
+
.when(pl.col("att_2yr_byY4") == 1)
|
|
1664
1664
|
.then(cmp_rate_2yr_coarse)
|
|
1665
|
+
.when(pl.col("att_any_byY4") == 0)
|
|
1666
|
+
.then(0.0)
|
|
1665
1667
|
.otherwise(None)
|
|
1666
1668
|
.alias("cmp_rate_coarse"),
|
|
1667
1669
|
)
|
|
1668
1670
|
|
|
1669
|
-
late_enrollee_means = (
|
|
1670
|
-
nsc_outcomes
|
|
1671
|
-
.filter(
|
|
1672
|
-
(pl.col("att_4yr_inY2") == 0)
|
|
1673
|
-
& (pl.col("att_4yr_inY3") == 1)
|
|
1674
|
-
& (
|
|
1675
|
-
(pl.col("cmp_BA_byY6") == 1)
|
|
1676
|
-
| (pl.col("cmp_BA_byY7") == 1)
|
|
1677
|
-
| (pl.col("cmp_BA_byY8") == 1)
|
|
1678
|
-
)
|
|
1679
|
-
& (pl.col("offer") == 0)
|
|
1680
|
-
)
|
|
1681
|
-
.select(
|
|
1682
|
-
pl.col("cmp_rate").mean().alias("cmp_rate"),
|
|
1683
|
-
pl.col("cmp_rate_coarse").mean().alias("cmp_rate_coarse"),
|
|
1684
|
-
)
|
|
1685
|
-
)
|
|
1686
|
-
|
|
1687
|
-
late_enrollee_mean = late_enrollee_means.item(0, "cmp_rate")
|
|
1688
|
-
late_enrollee_coarse_mean = late_enrollee_means.item(0, "cmp_rate_coarse")
|
|
1689
|
-
|
|
1690
|
-
if late_enrollee_mean is None or late_enrollee_coarse_mean is None:
|
|
1691
|
-
raise ValueError(
|
|
1692
|
-
"The late-enrollee control donor group has no usable completion-rate values."
|
|
1693
|
-
)
|
|
1694
|
-
|
|
1695
1671
|
nsc_outcomes = nsc_outcomes.with_columns(
|
|
1696
|
-
pl.when(pl.col("
|
|
1697
|
-
.then(
|
|
1672
|
+
pl.when(pl.col("att_any_byY4").is_null())
|
|
1673
|
+
.then(None)
|
|
1674
|
+
.when(pl.col("att_any_byY4") == 0)
|
|
1675
|
+
.then(0.0)
|
|
1698
1676
|
.otherwise(pl.col("cmp_rate"))
|
|
1699
1677
|
.alias("adj_cmp_rate"),
|
|
1700
|
-
pl.
|
|
1701
|
-
.then(pl.lit(late_enrollee_coarse_mean, dtype=pl.Float64))
|
|
1702
|
-
.otherwise(pl.col("cmp_rate_coarse"))
|
|
1678
|
+
pl.col("cmp_rate_coarse")
|
|
1703
1679
|
.alias("adj_cmp_rate_coarse"),
|
|
1704
1680
|
).with_columns(
|
|
1705
|
-
pl.when(pl.col("
|
|
1681
|
+
pl.when(pl.col("att_any_byY4").is_null())
|
|
1706
1682
|
.then(None)
|
|
1707
1683
|
.otherwise(pl.col("cmp_rate"))
|
|
1708
1684
|
.alias("cmp_rate"),
|
|
1709
|
-
pl.when(pl.col("
|
|
1685
|
+
pl.when(pl.col("att_any_byY4").is_null())
|
|
1710
1686
|
.then(None)
|
|
1711
1687
|
.otherwise(pl.col("adj_cmp_rate"))
|
|
1712
1688
|
.alias("adj_cmp_rate"),
|
|
1713
|
-
pl.when(pl.col("
|
|
1689
|
+
pl.when(pl.col("att_any_byY4").is_null())
|
|
1714
1690
|
.then(None)
|
|
1715
1691
|
.otherwise(pl.col("cmp_rate_coarse"))
|
|
1716
1692
|
.alias("cmp_rate_coarse"),
|
|
1717
|
-
pl.when(pl.col("
|
|
1693
|
+
pl.when(pl.col("att_any_byY4").is_null())
|
|
1718
1694
|
.then(None)
|
|
1719
1695
|
.otherwise(pl.col("adj_cmp_rate_coarse"))
|
|
1720
1696
|
.alias("adj_cmp_rate_coarse"),
|
|
1721
|
-
|
|
1722
|
-
pl.when(pl.col("att_4yr_byY2").is_null())
|
|
1697
|
+
pl.when(pl.col("att_any_byY4").is_null())
|
|
1723
1698
|
.then(None)
|
|
1724
1699
|
.otherwise(pl.col("adj_cmp_rate"))
|
|
1725
1700
|
.alias("predicted_completion"),
|
|
@@ -1809,13 +1784,12 @@ print(
|
|
|
1809
1784
|
f"k_mean 4yr={k_mean_4yr_coarse:.2f}, "
|
|
1810
1785
|
f"k_mean 2yr-or-less={k_mean_2yr_coarse:.2f}, "
|
|
1811
1786
|
f"completion 4yr={cmp_rate_4yr_coarse:.4f}, "
|
|
1812
|
-
f"completion 2yr-or-less={cmp_rate_2yr_coarse:.4f}
|
|
1813
|
-
|
|
1814
|
-
f"coarse nonattender imputation={late_enrollee_coarse_mean:.4f}"
|
|
1787
|
+
f"completion 2yr-or-less={cmp_rate_2yr_coarse:.4f}; "
|
|
1788
|
+
"observed by-Y4 nonattender completion=0"
|
|
1815
1789
|
)
|
|
1816
1790
|
|
|
1817
|
-
|
|
1818
|
-
coarse_audit =
|
|
1791
|
+
observable_y4 = nsc_outcomes.filter(pl.col("att_any_byY4").is_not_null())
|
|
1792
|
+
coarse_audit = observable_y4.select(
|
|
1819
1793
|
pl.len().alias("students"),
|
|
1820
1794
|
pl.col("k_mean_coarse").null_count().alias("k_mean_coarse_missing"),
|
|
1821
1795
|
pl.col("k_mean_coarse").min().alias("k_mean_coarse_min"),
|
|
@@ -1836,6 +1810,45 @@ if coarse_audit.item(0, "adj_cmp_rate_coarse_missing") > 0:
|
|
|
1836
1810
|
|
|
1837
1811
|
print("Coarse outcome audit:")
|
|
1838
1812
|
print(coarse_audit)
|
|
1813
|
+
|
|
1814
|
+
attendee_completion_audit = (
|
|
1815
|
+
observable_y4.filter(pl.col("att_any_byY4") == 1)
|
|
1816
|
+
.select(
|
|
1817
|
+
pl.len().alias("by_y4_attendees"),
|
|
1818
|
+
pl.col("completion_rate_150pct_firstinst")
|
|
1819
|
+
.is_null()
|
|
1820
|
+
.sum()
|
|
1821
|
+
.alias("missing_first_institution_rate"),
|
|
1822
|
+
(
|
|
1823
|
+
pl.col("completion_rate_150pct_firstinst").is_null()
|
|
1824
|
+
& pl.col("completion_rate_150pct_ip").is_not_null()
|
|
1825
|
+
)
|
|
1826
|
+
.sum()
|
|
1827
|
+
.alias("filled_by_tier_median"),
|
|
1828
|
+
pl.col("predicted_completion")
|
|
1829
|
+
.is_null()
|
|
1830
|
+
.sum()
|
|
1831
|
+
.alias("missing_after_tier_median"),
|
|
1832
|
+
pl.col("predicted_completion")
|
|
1833
|
+
.is_null()
|
|
1834
|
+
.mean()
|
|
1835
|
+
.alias("missing_after_tier_median_share"),
|
|
1836
|
+
(
|
|
1837
|
+
pl.col("predicted_completion").is_null()
|
|
1838
|
+
& pl.col("tier_firstinst").is_null()
|
|
1839
|
+
)
|
|
1840
|
+
.sum()
|
|
1841
|
+
.alias("missing_after_tier_median_no_tier"),
|
|
1842
|
+
(
|
|
1843
|
+
pl.col("predicted_completion").is_null()
|
|
1844
|
+
& pl.col("tier_firstinst").is_not_null()
|
|
1845
|
+
)
|
|
1846
|
+
.sum()
|
|
1847
|
+
.alias("missing_after_tier_median_with_tier"),
|
|
1848
|
+
)
|
|
1849
|
+
)
|
|
1850
|
+
print("By-Y4 attendee completion-rate audit:")
|
|
1851
|
+
print(attendee_completion_audit)
|
|
1839
1852
|
print(
|
|
1840
1853
|
nsc_outcomes.select("sid_cepr", "cohort_lottery", "recovered_nsc_outcome").sort(
|
|
1841
1854
|
"sid_cepr"
|
|
Binary file
|
|
Binary file
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
naics_code,sector
|
|
2
|
-
11,"Agriculture, Forestry, Fishing and Hunting"
|
|
3
|
-
21,"Mining, Quarrying, and Oil and Gas Extraction"
|
|
4
|
-
22,Utilities
|
|
5
|
-
23,Construction
|
|
6
|
-
31,Manufacturing
|
|
7
|
-
32,Manufacturing
|
|
8
|
-
33,Manufacturing
|
|
9
|
-
42,Wholesale Trade
|
|
10
|
-
44,Retail Trade
|
|
11
|
-
45,Retail Trade
|
|
12
|
-
48,Transportation and Warehousing
|
|
13
|
-
49,Transportation and Warehousing
|
|
14
|
-
51,Information
|
|
15
|
-
52,Finance and Insurance
|
|
16
|
-
53,Real Estate and Rental and Leasing
|
|
17
|
-
54,"Professional, Scientific, and Technical Services"
|
|
18
|
-
55,Management of Companies and Enterprises
|
|
19
|
-
56,Administrative and Support and Waste Management and Remediation Services
|
|
20
|
-
61,Educational Services
|
|
21
|
-
62,Health Care and Social Assistance
|
|
22
|
-
71,"Arts, Entertainment, and Recreation"
|
|
23
|
-
72,Accommodation and Food Services
|
|
24
|
-
81,Other Services (except Public Administration)
|
|
25
|
-
92,Public Administration
|
|
Binary file
|
|
Binary file
|
|
Binary file
|