Skip to content

Instantly share code, notes, and snippets.

@mscarey
Last active November 21, 2015 22:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mscarey/bdec4603313dd81da530 to your computer and use it in GitHub Desktop.
Save mscarey/bdec4603313dd81da530 to your computer and use it in GitHub Desktop.
Merging Texas Education Agency statistics
This was my process to try to merge together some suspension and expulsion data from the TEA. Unfortunately this doesn't include disability, special education, or economically disadvantaged status, so some further changes may need to be made. Also, these statistics are at the district level, not the campus level.
1. I downloaded all 20 of the 2013-2014 region files from http://ritter.tea.state.tx.us/adhocrpt/Disciplinary_Data_Products/Download_Region_Districts.html and pasted them together.
2. The TEA provides a bogus value of -99999999 when the number of kids in a certain category is at least 1 but not more than 4. This counts 1 kid in those cases, to avoid the risk of counting any nonexistent kids.
Find
,-99999999\n
Replace
,1\n
3. Using csvkit to delete the first column (because it had the same value for every row), and keeping the rows that categorize students by protected class.
csvcut -c 4,5,7,8 TXSchoolDiscipline.csv | csvgrep -c "HEADING NAME" -r "(WHITE|BLACK OR AFRICAN AMERICAN|AMERICAN INDIAN OR ALASKA NAT|HISPANIC|NATIVE HAWAIIAN|ASIAN|TWO OR MORE RACES|SPEC. ED|ECO. DISAD|ECO DISAD.)" > TX5.csv
4. Getting rid of columns that count students instead of incidents
csvgrep TX5.csv -c "HEADING NAME" -r "(SPEC. ED. STUDENTS|ECO DISAD. STUDENTS)" -i > TX6.csv
5. downloaded "District and Charter Detail Data" (Snapshot 2014) from http://ritter.tea.state.tx.us/perfreport/snapshot/download.html
6. Getting the relevant columns from "District and Charter Detail Data"
csvcut district.csv -c 2,1,4,7,8,9,10,11,12,13,14,15,17 > TXdemo3.csv
7. Loading the CSV of the disciplinary actions and the CSV of the district demographics into Python.
import csv
TXFile = open('TX6.csv')
TXReader = csv.reader(TXFile)
TX = list(TXReader)
TXDemoFile = open('TXdemo3.csv')
DemoReader = csv.reader(TXDemoFile)
TXDemo = list(DemoReader)
8. Making the column names unique in the disciplinary action CSV
for i in TX:
i[1] = "%s=%s" % (i[1], i[2])
for i in TX:
i.pop(2)
9. merging the two CSVs into one big one
for i in TX[1:]:
if i[1] not in TXDemo[0]:
TXDemo[0].append(i[1])
for j in TXDemo[1:]:
j.append(0)
column = TXDemo[0].index(i[1]) # finding index in first row of heading name e.g. 'D-EXPULSION ACTIONS=WHITE'
for row in TXDemo:
if row[0] == i[0]:
row[column] = i[2]
10. using agate in python
import agate # added one more Number column when I fixed the missing Eco. Disad. ISS column
column_types = [agate.Text(), agate.Text(), agate.Text(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number(), agate.Number()]
districts = agate.Table(TXDemo[1:], TXDemo[0], column_types)
11. adding sum columns
def expulsionSum(row):
return (row['D-EXPULSION ACTIONS=HISPANIC/LATINO'] + row['D-EXPULSION ACTIONS=WHITE'] + row['D-EXPULSION ACTIONS=BLACK OR AFRICAN AMERICAN'] + row['D-EXPULSION ACTIONS=TWO OR MORE RACES'] + row['D-EXPULSION ACTIONS=ASIAN'] + row['D-EXPULSION ACTIONS=AMERICAN INDIAN OR ALASKA NAT'] + row['D-EXPULSION ACTIONS=NATIVE HAWAIIAN/OTHER PACIFIC'])
def issSum(row):
return (row['G-IN SCHOOL SUSPENSIONS=HISPANIC/LATINO'] + row['G-IN SCHOOL SUSPENSIONS=WHITE'] + row['G-IN SCHOOL SUSPENSIONS=BLACK OR AFRICAN AMERICAN'] + row['G-IN SCHOOL SUSPENSIONS=TWO OR MORE RACES'] + row['G-IN SCHOOL SUSPENSIONS=ASIAN'] + row['G-IN SCHOOL SUSPENSIONS=AMERICAN INDIAN OR ALASKA NAT'] + row['G-IN SCHOOL SUSPENSIONS=NATIVE HAWAIIAN/OTHER PACIFIC'])
def ossSum(row):
return (row['F-OUT OF SCHOOL SUSPENSIONS=HISPANIC/LATINO'] + row['F-OUT OF SCHOOL SUSPENSIONS=WHITE'] + row['F-OUT OF SCHOOL SUSPENSIONS=BLACK OR AFRICAN AMERICAN'] + row['F-OUT OF SCHOOL SUSPENSIONS=TWO OR MORE RACES'] + row['F-OUT OF SCHOOL SUSPENSIONS=ASIAN'] + row['F-OUT OF SCHOOL SUSPENSIONS=AMERICAN INDIAN OR ALASKA NAT'] + row['F-OUT OF SCHOOL SUSPENSIONS=NATIVE HAWAIIAN/OTHER PACIFIC'])
def daepSum(row):
return (row['E-DAEP PLACEMENTS=HISPANIC/LATINO'] + row['E-DAEP PLACEMENTS=WHITE'] + row['E-DAEP PLACEMENTS=BLACK OR AFRICAN AMERICAN'] + row['E-DAEP PLACEMENTS=TWO OR MORE RACES'] + row['E-DAEP PLACEMENTS=ASIAN'] + row['E-DAEP PLACEMENTS=AMERICAN INDIAN OR ALASKA NAT'] + row['E-DAEP PLACEMENTS=NATIVE HAWAIIAN/OTHER PACIFIC'])
number_type = agate.Number()
sumDistricts = districts.compute([
('total EXPULSION ACTIONS', agate.Formula(number_type, expulsionSum)),
('total IN SCHOOL SUSPENSIONS', agate.Formula(number_type, issSum)),
('total OUT OF SCHOOL SUSPENSIONS', agate.Formula(number_type, ossSum)),
('total DAEP PLACEMENTS', agate.Formula(number_type, daepSum))
])
12. adding ratio columns (finally, the calculation we wanted!)
from decimal import Decimal
def issRatioECO(row):
if row['total IN SCHOOL SUSPENSIONS'] == 0 or row['DPETECOP'] == 0:
return 1
if row['Q-ECO. DISADV. IN SCHOOL SUS.=ECO DISAD. IN SCHOOL SUSPENSIONS'] == 0:
return 0
else:
return((row['Q-ECO. DISADV. IN SCHOOL SUS.=ECO DISAD. IN SCHOOL SUSPENSIONS'] / row['total IN SCHOOL SUSPENSIONS'] / (row['DPETECOP'] / 100)).quantize(Decimal('0.0001')))
def issRatioSPE(row):
if row['total IN SCHOOL SUSPENSIONS'] == 0 or row['DPETSPEP'] == 0:
return 1
if row['L-SPEC. ED. IN SCHOOL SUS.=SPEC. ED. IN SCHOOL SUSPEN'] == 0:
return 0
else:
return((row['L-SPEC. ED. IN SCHOOL SUS.=SPEC. ED. IN SCHOOL SUSPEN'] / row['total IN SCHOOL SUSPENSIONS'] / (row['DPETSPEP'] / 100)).quantize(Decimal('0.0001')))
def issRatioBLA(row):
if row['total IN SCHOOL SUSPENSIONS'] == 0 or row['DPETBLAP'] == 0:
return 1
if row['G-IN SCHOOL SUSPENSIONS=BLACK OR AFRICAN AMERICAN'] == 0:
return 0
else:
return((row['G-IN SCHOOL SUSPENSIONS=BLACK OR AFRICAN AMERICAN'] / row['total IN SCHOOL SUSPENSIONS'] / (row['DPETBLAP'] / 100)).quantize(Decimal('0.0001')))
def issRatioHIS(row):
if row['total IN SCHOOL SUSPENSIONS'] == 0 or row['DPETHISP'] == 0:
return 1
if row['G-IN SCHOOL SUSPENSIONS=HISPANIC/LATINO'] == 0:
return 0
else:
return((row['G-IN SCHOOL SUSPENSIONS=HISPANIC/LATINO'] / row['total IN SCHOOL SUSPENSIONS'] / (row['DPETHISP'] / 100)).quantize(Decimal('0.0001')))
def issRatioWHI(row):
if row['total IN SCHOOL SUSPENSIONS'] == 0 or row['DPETWHIP'] == 0:
return 1
if row['G-IN SCHOOL SUSPENSIONS=WHITE'] == 0:
return 0
else:
return((row['G-IN SCHOOL SUSPENSIONS=WHITE'] / row['total IN SCHOOL SUSPENSIONS'] / (row['DPETWHIP'] / 100)).quantize(Decimal('0.0001')))
def issRatioIND(row):
if row['total IN SCHOOL SUSPENSIONS'] == 0 or row['DPETINDP'] == 0:
return 1
if row['G-IN SCHOOL SUSPENSIONS=AMERICAN INDIAN OR ALASKA NAT'] == 0:
return 0
else:
return((row['G-IN SCHOOL SUSPENSIONS=AMERICAN INDIAN OR ALASKA NAT'] / row['total IN SCHOOL SUSPENSIONS'] / (row['DPETINDP'] / 100)).quantize(Decimal('0.0001')))
def issRatioASI(row):
if row['total IN SCHOOL SUSPENSIONS'] == 0 or row['DPETASIP'] == 0:
return 1
if row['G-IN SCHOOL SUSPENSIONS=ASIAN'] == 0:
return 0
else:
return((row['G-IN SCHOOL SUSPENSIONS=ASIAN'] / row['total IN SCHOOL SUSPENSIONS'] / (row['DPETASIP'] / 100)).quantize(Decimal('0.0001')))
def issRatioPCI(row):
if row['total IN SCHOOL SUSPENSIONS'] == 0 or row['DPETPCIP'] == 0:
return 1
if row['G-IN SCHOOL SUSPENSIONS=NATIVE HAWAIIAN/OTHER PACIFIC'] == 0:
return 0
else:
return((row['G-IN SCHOOL SUSPENSIONS=NATIVE HAWAIIAN/OTHER PACIFIC'] / row['total IN SCHOOL SUSPENSIONS'] / (row['DPETPCIP'] / 100)).quantize(Decimal('0.0001')))
def issRatioTWO(row):
if row['total IN SCHOOL SUSPENSIONS'] == 0 or row['DPETTWOP'] == 0:
return 1
if row['G-IN SCHOOL SUSPENSIONS=TWO OR MORE RACES'] == 0:
return 0
else:
return((row['G-IN SCHOOL SUSPENSIONS=TWO OR MORE RACES'] / row['total IN SCHOOL SUSPENSIONS'] / (row['DPETTWOP'] / 100)).quantize(Decimal('0.0001')))
def ossRatioECO(row):
if row['total OUT OF SCHOOL SUSPENSIONS'] == 0 or row['DPETECOP'] == 0:
return 1
if row['P-ECO. DISADV. OUT OF SCHOOL SUS.=ECO. DISAD. OUT OF SCHOOL SUSPEN'] == 0:
return 0
else:
return((row['P-ECO. DISADV. OUT OF SCHOOL SUS.=ECO. DISAD. OUT OF SCHOOL SUSPEN'] / row['total OUT OF SCHOOL SUSPENSIONS'] / (row['DPETECOP'] / 100)).quantize(Decimal('0.0001')))
def ossRatioSPE(row):
if row['total OUT OF SCHOOL SUSPENSIONS'] == 0 or row['DPETSPEP'] == 0:
return 1
if row['K-SPEC. ED. OUT OF SCHOOL SUS.=SPEC. ED. OUT OF SCHOOL SUSPEN'] == 0:
return 0
else:
return((row['K-SPEC. ED. OUT OF SCHOOL SUS.=SPEC. ED. OUT OF SCHOOL SUSPEN'] / row['total OUT OF SCHOOL SUSPENSIONS'] / (row['DPETSPEP'] / 100)).quantize(Decimal('0.0001')))
def ossRatioBLA(row):
if row['total OUT OF SCHOOL SUSPENSIONS'] == 0 or row['DPETBLAP'] == 0:
return 1
if row['F-OUT OF SCHOOL SUSPENSIONS=BLACK OR AFRICAN AMERICAN'] == 0:
return 0
else:
return((row['F-OUT OF SCHOOL SUSPENSIONS=BLACK OR AFRICAN AMERICAN'] / row['total OUT OF SCHOOL SUSPENSIONS'] / (row['DPETBLAP'] / 100)).quantize(Decimal('0.0001')))
def ossRatioHIS(row):
if row['total OUT OF SCHOOL SUSPENSIONS'] == 0 or row['DPETHISP'] == 0:
return 1
if row['F-OUT OF SCHOOL SUSPENSIONS=HISPANIC/LATINO'] == 0:
return 0
else:
return((row['F-OUT OF SCHOOL SUSPENSIONS=HISPANIC/LATINO'] / row['total OUT OF SCHOOL SUSPENSIONS'] / (row['DPETHISP'] / 100)).quantize(Decimal('0.0001')))
def ossRatioWHI(row):
if row['total OUT OF SCHOOL SUSPENSIONS'] == 0 or row['DPETWHIP'] == 0:
return 1
if row['F-OUT OF SCHOOL SUSPENSIONS=WHITE'] == 0:
return 0
else:
return((row['F-OUT OF SCHOOL SUSPENSIONS=WHITE'] / row['total OUT OF SCHOOL SUSPENSIONS'] / (row['DPETWHIP'] / 100)).quantize(Decimal('0.0001')))
def ossRatioIND(row):
if row['total OUT OF SCHOOL SUSPENSIONS'] == 0 or row['DPETINDP'] == 0:
return 1
if row['F-OUT OF SCHOOL SUSPENSIONS=AMERICAN INDIAN OR ALASKA NAT'] == 0:
return 0
else:
return((row['F-OUT OF SCHOOL SUSPENSIONS=AMERICAN INDIAN OR ALASKA NAT'] / row['total OUT OF SCHOOL SUSPENSIONS'] / (row['DPETINDP'] / 100)).quantize(Decimal('0.0001')))
def ossRatioASI(row):
if row['total OUT OF SCHOOL SUSPENSIONS'] == 0 or row['DPETASIP'] == 0:
return 1
if row['F-OUT OF SCHOOL SUSPENSIONS=ASIAN'] == 0:
return 0
else:
return((row['F-OUT OF SCHOOL SUSPENSIONS=ASIAN'] / row['total OUT OF SCHOOL SUSPENSIONS'] / (row['DPETASIP'] / 100)).quantize(Decimal('0.0001')))
def ossRatioPCI(row):
if row['total OUT OF SCHOOL SUSPENSIONS'] == 0 or row['DPETPCIP'] == 0:
return 1
if row['F-OUT OF SCHOOL SUSPENSIONS=NATIVE HAWAIIAN/OTHER PACIFIC'] == 0:
return 0
else:
return((row['F-OUT OF SCHOOL SUSPENSIONS=NATIVE HAWAIIAN/OTHER PACIFIC'] / row['total OUT OF SCHOOL SUSPENSIONS'] / (row['DPETPCIP'] / 100)).quantize(Decimal('0.0001')))
def ossRatioTWO(row):
if row['total OUT OF SCHOOL SUSPENSIONS'] == 0 or row['DPETTWOP'] == 0:
return 1
if row['F-OUT OF SCHOOL SUSPENSIONS=TWO OR MORE RACES'] == 0:
return 0
else:
return((row['F-OUT OF SCHOOL SUSPENSIONS=TWO OR MORE RACES'] / row['total OUT OF SCHOOL SUSPENSIONS'] / (row['DPETTWOP'] / 100)).quantize(Decimal('0.0001')))
def daepRatioECO(row):
if row['total DAEP PLACEMENTS'] == 0 or row['DPETECOP'] == 0:
return 1
if row['O-ECO. DISADV. DAEP PLACEMENTS=ECO. DISAD. DAEP PLACEMENTS'] == 0:
return 0
else:
return((row['O-ECO. DISADV. DAEP PLACEMENTS=ECO. DISAD. DAEP PLACEMENTS] / row['total DAEP PLACEMENTS'] / (row['DPETECOP'] / 100)).quantize(Decimal('0.0001')))
def daepRatioSPE(row):
if row['total DAEP PLACEMENTS'] == 0 or row['DPETSPEP'] == 0:
return 1
if row['J-SPEC. ED. DAEP PLACEMENTS=SPEC. ED. DAEP PLACEMENTS'] == 0:
return 0
else:
return((row['J-SPEC. ED. DAEP PLACEMENTS=SPEC. ED. DAEP PLACEMENTS'] / row['total DAEP PLACEMENTS'] / (row['DPETSPEP'] / 100)).quantize(Decimal('0.0001')))
def daepRatioBLA(row):
if row['total DAEP PLACEMENTS'] == 0 or row['DPETBLAP'] == 0:
return 1
if row['E-DAEP PLACEMENTS=BLACK OR AFRICAN AMERICAN'] == 0:
return 0
else:
return((row['E-DAEP PLACEMENTS=BLACK OR AFRICAN AMERICAN'] / row['total DAEP PLACEMENTS'] / (row['DPETBLAP'] / 100)).quantize(Decimal('0.0001')))
def daepRatioHIS(row):
if row['total DAEP PLACEMENTS'] == 0 or row['DPETHISP'] == 0:
return 1
if row['E-DAEP PLACEMENTS=HISPANIC/LATINO'] == 0:
return 0
else:
return((row['E-DAEP PLACEMENTS=HISPANIC/LATINO'] / row['total DAEP PLACEMENTS'] / (row['DPETHISP'] / 100)).quantize(Decimal('0.0001')))
def daepRatioWHI(row):
if row['total DAEP PLACEMENTS'] == 0 or row['DPETWHIP'] == 0:
return 1
if row['E-DAEP PLACEMENTS=WHITE'] == 0:
return 0
else:
return((row['E-DAEP PLACEMENTS=WHITE'] / row['total DAEP PLACEMENTS'] / (row['DPETWHIP'] / 100)).quantize(Decimal('0.0001')))
def daepRatioIND(row):
if row['total DAEP PLACEMENTS'] == 0 or row['DPETINDP'] == 0:
return 1
if row['E-DAEP PLACEMENTS=AMERICAN INDIAN OR ALASKA NAT'] == 0:
return 0
else:
return((row['E-DAEP PLACEMENTS=AMERICAN INDIAN OR ALASKA NAT'] / row['total DAEP PLACEMENTS'] / (row['DPETINDP'] / 100)).quantize(Decimal('0.0001')))
def daepRatioASI(row):
if row['total DAEP PLACEMENTS'] == 0 or row['DPETASIP'] == 0:
return 1
if row['E-DAEP PLACEMENTS=ASIAN'] == 0:
return 0
else:
return((row['E-DAEP PLACEMENTS=ASIAN'] / row['total DAEP PLACEMENTS'] / (row['DPETASIP'] / 100)).quantize(Decimal('0.0001')))
def daepRatioPCI(row):
if row['total DAEP PLACEMENTS'] == 0 or row['DPETPCIP'] == 0:
return 1
if row['E-DAEP PLACEMENTS=NATIVE HAWAIIAN/OTHER PACIFIC'] == 0:
return 0
else:
return((row['E-DAEP PLACEMENTS=NATIVE HAWAIIAN/OTHER PACIFIC'] / row['total DAEP PLACEMENTS'] / (row['DPETPCIP'] / 100)).quantize(Decimal('0.0001')))
def daepRatioTWO(row):
if row['total DAEP PLACEMENTS'] == 0 or row['DPETTWOP'] == 0:
return 1
if row['E-DAEP PLACEMENTS=TWO OR MORE RACES'] == 0:
return 0
else:
return((row['E-DAEP PLACEMENTS=TWO OR MORE RACES'] / row['total DAEP PLACEMENTS'] / (row['DPETTWOP'] / 100)).quantize(Decimal('0.0001')))
def expulsionRatioECO(row):
if row['total EXPULSION ACTIONS'] == 0 or row['DPETECOP'] == 0:
return 1
if row['N-ECO. DISADV. EXPULSIONS=ECO. DISAD. EXPULSIONS'] == 0:
return 0
else:
return((row['N-ECO. DISADV. EXPULSIONS=ECO. DISAD. EXPULSIONS] / row['total EXPULSION ACTIONS'] / (row['DPETECOP'] / 100)).quantize(Decimal('0.0001')))
def expulsionRatioSPE(row):
if row['total EXPULSION ACTIONS'] == 0 or row['DPETSPEP'] == 0:
return 1
if row['I-SPEC. ED. EXPULSIONS=SPEC. ED. EXPULSIONS'] == 0:
return 0
else:
return((row['I-SPEC. ED. EXPULSIONS=SPEC. ED. EXPULSIONS'] / row['total EXPULSION ACTIONS'] / (row['DPETSPEP'] / 100)).quantize(Decimal('0.0001')))
def expulsionRatioBLA(row):
if row['total EXPULSION ACTIONS'] == 0 or row['DPETBLAP'] == 0:
return 1
if row['D-EXPULSION ACTIONS=BLACK OR AFRICAN AMERICAN'] == 0:
return 0
else:
return((row['D-EXPULSION ACTIONS=BLACK OR AFRICAN AMERICAN'] / row['total EXPULSION ACTIONS'] / (row['DPETBLAP'] / 100)).quantize(Decimal('0.0001')))
def expulsionRatioHIS(row):
if row['total EXPULSION ACTIONS'] == 0 or row['DPETHISP'] == 0:
return 1
if row['D-EXPULSION ACTIONS=HISPANIC/LATINO'] == 0:
return 0
else:
return((row['D-EXPULSION ACTIONS=HISPANIC/LATINO'] / row['total EXPULSION ACTIONS'] / (row['DPETHISP'] / 100)).quantize(Decimal('0.0001')))
def expulsionRatioWHI(row):
if row['total EXPULSION ACTIONS'] == 0 or row['DPETWHIP'] == 0:
return 1
if row['D-EXPULSION ACTIONS=WHITE'] == 0:
return 0
else:
return((row['D-EXPULSION ACTIONS=WHITE'] / row['total EXPULSION ACTIONS'] / (row['DPETWHIP'] / 100)).quantize(Decimal('0.0001')))
def expulsionRatioIND(row):
if row['total EXPULSION ACTIONS'] == 0 or row['DPETINDP'] == 0:
return 1
if row['D-EXPULSION ACTIONS=AMERICAN INDIAN OR ALASKA NAT'] == 0:
return 0
else:
return((row['D-EXPULSION ACTIONS=AMERICAN INDIAN OR ALASKA NAT'] / row['total EXPULSION ACTIONS'] / (row['DPETINDP'] / 100)).quantize(Decimal('0.0001')))
def expulsionRatioASI(row):
if row['total EXPULSION ACTIONS'] == 0 or row['DPETASIP'] == 0:
return 1
if row['D-EXPULSION ACTIONS=ASIAN'] == 0:
return 0
else:
return((row['D-EXPULSION ACTIONS=ASIAN'] / row['total EXPULSION ACTIONS'] / (row['DPETASIP'] / 100)).quantize(Decimal('0.0001')))
def expulsionRatioPCI(row):
if row['total EXPULSION ACTIONS'] == 0 or row['DPETPCIP'] == 0:
return 1
if row['D-EXPULSION ACTIONS=NATIVE HAWAIIAN/OTHER PACIFIC'] == 0:
return 0
else:
return((row['D-EXPULSION ACTIONS=NATIVE HAWAIIAN/OTHER PACIFIC'] / row['total EXPULSION ACTIONS'] / (row['DPETPCIP'] / 100)).quantize(Decimal('0.0001')))
def expulsionRatioTWO(row):
if row['total EXPULSION ACTIONS'] == 0 or row['DPETTWOP'] == 0:
return 1
if row['D-EXPULSION ACTIONS=TWO OR MORE RACES'] == 0:
return 0
else:
return((row['D-EXPULSION ACTIONS=TWO OR MORE RACES'] / row['total EXPULSION ACTIONS'] / (row['DPETTWOP'] / 100)).quantize(Decimal('0.0001')))
ratioDistricts = sumDistricts.compute([
('ratio ECO. DISADV. IN SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, issRatioECO)),
('ratio SPEC. ED. IN SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, issRatioSPE)),
('ratio ECO. DISADV. OUT OF SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, ossRatioECO)),
('ratio SPEC. ED. OUT OF SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, ossRatioSPE)),
('ratio ECO. DISADV. DAEP PLACEMENTS vs average', agate.Formula(number_type, daepRatioECO)),
('ratio SPEC. ED. DAEP PLACEMENTS vs average', agate.Formula(number_type, daepRatioSPE)),
('ratio ECO. DISADV. EXPULSION ACTIONS vs average', agate.Formula(number_type, expulsionRatioECO)),
('ratio SPEC. ED. EXPULSION ACTIONS vs average', agate.Formula(number_type, expulsionRatioSPE)),
('ratio BLACK OR AFRICAN AMERICAN IN SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, issRatioBLA)),
('ratio HISPANIC/LATINO IN SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, issRatioHIS)),
('ratio WHITE IN SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, issRatioWHI)),
('ratio AMERICAN INDIAN OR ALASKA NAT IN SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, issRatioIND)),
('ratio ASIAN IN SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, issRatioASI)),
('ratio NATIVE HAWAIIAN/OTHER PACIFIC IN SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, issRatioPCI)),
('ratio TWO OR MORE RACES IN SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, issRatioTWO)),
('ratio BLACK OR AFRICAN AMERICAN OUT OF SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, ossRatioBLA)),
('ratio HISPANIC/LATINO OUT OF SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, ossRatioHIS)),
('ratio WHITE OUT OF SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, ossRatioWHI)),
('ratio AMERICAN INDIAN OR ALASKA NAT OUT OF SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, ossRatioIND)),
('ratio ASIAN OUT OF SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, ossRatioASI)),
('ratio NATIVE HAWAIIAN/OTHER PACIFIC OUT OF SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, ossRatioPCI)),
('ratio TWO OR MORE RACES OUT OF SCHOOL SUSPENSIONS vs average', agate.Formula(number_type, ossRatioTWO)),
('ratio BLACK OR AFRICAN AMERICAN DAEP PLACEMENTS vs average', agate.Formula(number_type, daepRatioBLA)),
('ratio HISPANIC/LATINO DAEP PLACEMENTS vs average', agate.Formula(number_type, daepRatioHIS)),
('ratio WHITE DAEP PLACEMENTS vs average', agate.Formula(number_type, daepRatioWHI)),
('ratio AMERICAN INDIAN OR ALASKA NAT DAEP PLACEMENTS vs average', agate.Formula(number_type, daepRatioIND)),
('ratio ASIAN DAEP PLACEMENTS vs average', agate.Formula(number_type, daepRatioASI)),
('ratio NATIVE HAWAIIAN/OTHER PACIFIC DAEP PLACEMENTS vs average', agate.Formula(number_type, daepRatioPCI)),
('ratio TWO OR MORE RACES DAEP PLACEMENTS vs average', agate.Formula(number_type, daepRatioTWO)),
('ratio BLACK OR AFRICAN AMERICAN EXPULSION ACTIONS vs average', agate.Formula(number_type, expulsionRatioBLA)),
('ratio HISPANIC/LATINO EXPULSION ACTIONS vs average', agate.Formula(number_type, expulsionRatioHIS)),
('ratio WHITE EXPULSION ACTIONS vs average', agate.Formula(number_type, expulsionRatioWHI)),
('ratio AMERICAN INDIAN OR ALASKA NAT EXPULSION ACTIONS vs average', agate.Formula(number_type, expulsionRatioIND)),
('ratio ASIAN EXPULSION ACTIONS vs average', agate.Formula(number_type, expulsionRatioASI)),
('ratio NATIVE HAWAIIAN/OTHER PACIFIC EXPULSION ACTIONS vs average', agate.Formula(number_type, expulsionRatioPCI)),
('ratio TWO OR MORE RACES EXPULSION ACTIONS vs average', agate.Formula(number_type, expulsionRatioTWO))
])
13. exporting to CSV
ratioDistricts.to_csv('ratioDistrict.csv')
@johntyree
Copy link

agate looks pretty interesting!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment