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.
Files changed (79) hide show
  1. {ltc_code-0.2.22 → ltc_code-0.2.24}/PKG-INFO +1 -1
  2. {ltc_code-0.2.22 → ltc_code-0.2.24}/pyproject.toml +1 -1
  3. ltc_code-0.2.24/pyproject.toml.orig +19 -0
  4. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/build_nsc_outcomes.py +65 -52
  5. ltc_code-0.2.22/src/ltc_code/.DS_Store +0 -0
  6. ltc_code-0.2.22/src/ltc_code/nsc/.DS_Store +0 -0
  7. ltc_code-0.2.22/src/ltc_code/nsc/naics.csv +0 -25
  8. ltc_code-0.2.22/src/ltc_code/nsc/naics_raw.xlsx +0 -0
  9. ltc_code-0.2.22/src/ltc_code/nsc/raw/.DS_Store +0 -0
  10. ltc_code-0.2.22/src/ltc_code/nsc/raw/CREDENTIAL_LEVEL_LOOKUP_TABLE.xlsx +0 -0
  11. ltc_code-0.2.22/src/ltc_code/nsc/raw/IPEDS_IC_2013.csv +0 -7647
  12. ltc_code-0.2.22/src/ltc_code/nsc/raw/IPEDS_IC_manual.xlsx +0 -0
  13. ltc_code-0.2.22/src/ltc_code/nsc/raw/chetty/mrc_table11.dta +0 -0
  14. ltc_code-0.2.22/src/ltc_code/nsc/raw/chetty/mrc_table2.dta +0 -0
  15. ltc_code-0.2.22/src/ltc_code/nsc/raw/college_crosswalk.xls +0 -0
  16. ltc_code-0.2.22/src/ltc_code/nsc/raw/directory.dta +0 -0
  17. {ltc_code-0.2.22 → ltc_code-0.2.24}/README.md +0 -0
  18. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/aspire.py +0 -0
  19. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/check_cmo_apps.do +0 -0
  20. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/christel_house.py +0 -0
  21. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/democracy_prep.py +0 -0
  22. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/green_dot.py +0 -0
  23. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/helpers.py +0 -0
  24. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/ilt.py +0 -0
  25. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/kipp_nj.py +0 -0
  26. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/main.py +0 -0
  27. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/mappings.py +0 -0
  28. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/rocketship.py +0 -0
  29. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260614_new_build_scripts_update/yes_prep.py +0 -0
  30. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/aspire.py +0 -0
  31. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/christel_house.py +0 -0
  32. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/democracy_prep.py +0 -0
  33. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/green_dot.py +0 -0
  34. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/ilt.py +0 -0
  35. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/kipp.py +0 -0
  36. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/kipp_nj.py +0 -0
  37. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/rocketship.py +0 -0
  38. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260630_census_disclosure/yes_prep.py +0 -0
  39. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/BALANCE.do +0 -0
  40. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/FS.do +0 -0
  41. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/ITT.do +0 -0
  42. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/TOT.do +0 -0
  43. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/apps_helpers.py +0 -0
  44. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/harmony.py +0 -0
  45. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260706_ceprscripts/main.py +0 -0
  46. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260712_uncommon_scripts/main.py +0 -0
  47. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260712_uncommon_scripts/mappings.py +0 -0
  48. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/20260712_uncommon_scripts/uncommon.py +0 -0
  49. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/__init__.py +0 -0
  50. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/aspire.py +0 -0
  51. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/check_cmo_apps.do +0 -0
  52. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/christel_house.py +0 -0
  53. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/green_dot.py +0 -0
  54. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/helpers.py +0 -0
  55. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june13.py +0 -0
  56. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june2.py +0 -0
  57. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june30.py +0 -0
  58. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june5.py +0 -0
  59. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/june7.py +0 -0
  60. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/kipp_nj.py +0 -0
  61. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/kipp_tx.py +0 -0
  62. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/main.py +0 -0
  63. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/make_summary_stats_table.py +0 -0
  64. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/mappings.py +0 -0
  65. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/may27.py +0 -0
  66. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/__init__.py +0 -0
  67. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/input/.gitkeep +0 -0
  68. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/naics.py +0 -0
  69. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/output/.gitkeep +0 -0
  70. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/raw/ipeds_data.dta +0 -0
  71. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/nsc/run_nsc_outcomes.py +0 -0
  72. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/polars_dates.py +0 -0
  73. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/rocketship.py +0 -0
  74. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/schema_mapping.py +0 -0
  75. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/school_name_xwalk/__init__.py +0 -0
  76. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/school_name_xwalk/all_schools_with_ccd.csv +0 -0
  77. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/school_name_xwalk/merge_school_ccd.py +0 -0
  78. {ltc_code-0.2.22 → ltc_code-0.2.24}/src/ltc_code/signal_var_calcs.py +0 -0
  79. {ltc_code-0.2.22 → ltc_code-0.2.24}/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.22
3
+ Version: 0.2.24
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.22"
3
+ version = "0.2.24"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9"
@@ -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. Apply the same residual fill only when an attendee is still missing.
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("att_any_byY2") == 1)
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
- # Sarah removes the raw school-specific rate for students who were not observed
1647
- # attending by Y2 before creating cmp_rate.
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("att_any_byY2") == 0)
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("att_any_byY2") == 0)
1659
+ pl.when(pl.col("att_any_byY4").is_null())
1660
1660
  .then(None)
1661
- .when(pl.col("college_years_firstinst") == 4)
1661
+ .when(pl.col("att_4yr_byY4") == 1)
1662
1662
  .then(cmp_rate_4yr_coarse)
1663
- .when(pl.col("college_years_firstinst").is_in([1, 2]))
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("cmp_rate").is_null())
1697
- .then(pl.lit(late_enrollee_mean, dtype=pl.Float64))
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.when(pl.col("cmp_rate_coarse").is_null())
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("att_4yr_byY2").is_null())
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("att_4yr_byY2").is_null())
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("att_4yr_byY2").is_null())
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("att_4yr_byY2").is_null())
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
- # Preserve the package's existing name as an alias for Sarah's adjusted rate.
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
- f"nonattender completion imputation={late_enrollee_mean:.4f}, "
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
- observable_y2 = nsc_outcomes.filter(pl.col("att_4yr_byY2").is_not_null())
1818
- coarse_audit = observable_y2.select(
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