Exercise 2, Chapter 1


In [1]:
from __future__ import print_function

import thinkstats2
import nsfg

Read the file 2002FemResp.dat.gz:


In [2]:
# From nsfg.py
dct_file='2002FemResp.dct'
dat_file='2002FemResp.dat.gz'

dct_resp = thinkstats2.ReadStataDct(dct_file)
df_resp = dct_resp.ReadFixedWidth(dat_file, compression='gzip')

In [3]:
df_resp


Out[3]:
caseid rscrinf rdormres rostscrn rscreenhisp rscreenrace age_a age_r cmbirth agescrn ... pubassis_i basewgt adj_mod_basewgt finalwgt secu_r sest cmintvw cmlstyr screentime intvlngth
0 2298 1 5 5 1 5 27 27 902 27 ... 0 3247.916977 5123.759559 5556.717241 2 18 1234 1222 18:26:36 110.492667
1 5012 1 5 1 5 5 42 42 718 42 ... 0 2335.279149 2846.799490 4744.191350 2 18 1233 1221 16:30:59 64.294000
2 11586 1 5 1 5 5 43 43 708 43 ... 0 2335.279149 2846.799490 4744.191350 2 18 1234 1222 18:19:09 75.149167
3 6794 5 5 4 1 5 15 15 1042 15 ... 0 3783.152221 5071.464231 5923.977368 2 18 1234 1222 15:54:43 28.642833
4 616 1 5 4 1 5 20 20 991 20 ... 0 5341.329968 6437.335772 7229.128072 2 18 1233 1221 14:19:44 69.502667
5 845 1 5 4 1 5 42 42 727 42 ... 0 2335.279149 3725.796795 4705.681352 2 18 1234 1222 17:10:13 95.488000
6 10333 5 5 3 1 5 17 17 1029 17 ... 0 2335.279149 2687.399758 3139.151658 2 18 1236 1224 14:14:38 61.204333
7 855 5 5 4 5 5 22 22 965 22 ... 0 4670.558298 7122.614751 10019.382170 2 18 1235 1223 14:42:52 59.756333
8 8656 5 5 4 1 5 38 38 780 38 ... 0 5198.652195 6027.568848 6520.021223 2 18 1237 1225 15:32:34 56.978833
9 3566 5 5 4 5 5 21 21 974 21 ... 0 2764.142038 3240.986558 4559.095792 2 18 1231 1219 16:22:25 104.744667
10 5917 1 5 3 1 5 44 43 714 43 ... 0 2418.624283 2762.143030 3488.586646 2 18 1233 1221 15:38:06 96.850167
11 9200 5 5 3 1 5 26 26 923 26 ... 0 2418.624283 2754.293339 2987.031126 2 18 1237 1225 14:12:31 61.060667
12 6320 5 5 5 5 1 23 23 952 23 ... 0 5497.225851 6448.332868 7241.477811 1 18 1236 1224 14:27:20 69.906500
13 11700 1 5 4 1 5 34 34 822 34 ... 0 3362.448309 3677.062170 4666.559600 1 18 1236 1224 11:35:31 77.493333
14 7354 1 5 4 1 5 28 28 896 28 ... 0 2417.628123 2790.899197 3026.730179 1 18 1235 1223 14:40:18 79.018500
15 3697 5 5 4 5 5 28 28 896 28 ... 0 9670.512492 18559.585881 31215.367494 1 18 1236 1224 11:59:26 45.963500
16 4881 1 5 5 1 5 23 23 948 23 ... 0 3292.089359 3935.302679 4419.344908 1 18 1234 1222 20:37:54 110.416833
17 5862 1 5 4 1 5 33 33 831 33 ... 0 3056.771190 3456.489520 4386.630850 1 18 1234 1222 16:42:13 107.819667
18 8542 5 5 5 5 5 16 16 1036 16 ... 0 5900.163872 6697.056170 7822.831313 1 18 1237 1225 13:04:36 72.481500
19 2054 1 5 4 5 1 24 24 939 24 ... 0 2417.628123 2570.384230 2886.541491 1 18 1236 1224 13:58:43 87.417500
20 3719 5 5 2 5 5 22 22 972 22 ... 1 4168.324350 4879.253694 5479.401898 1 18 1238 1226 12:50:26 53.782000
21 11740 1 5 5 1 5 32 32 843 32 ... 0 2417.628123 2790.899197 3541.930171 1 18 1234 1222 14:23:08 92.950500
22 11343 1 5 5 1 5 41 41 741 41 ... 0 2417.628123 4394.216361 5549.895265 1 18 1237 1225 20:29:06 70.791667
23 7075 1 5 4 1 5 37 37 782 37 ... 0 4308.038516 5562.306199 6016.746616 2 18 1232 1220 16:30:34 80.659000
24 5422 1 5 2 1 5 38 38 773 38 ... 0 3363.768618 3948.605534 4271.206606 1 18 1234 1222 17:07:52 45.171500
25 2178 5 5 3 1 5 29 29 877 29 ... 0 3363.768618 5306.521605 5754.922681 1 18 1234 1222 18:28:12 77.489833
26 8358 5 5 4 5 5 21 21 977 21 ... 0 2418.624283 2688.131135 3018.771264 2 18 1237 1225 16:10:17 28.934833
27 5083 1 5 4 1 5 37 37 789 37 ... 0 2418.624283 3119.659072 3374.535218 2 18 1236 1224 15:14:10 58.307000
28 1545 5 5 4 1 5 39 39 762 39 ... 0 8034.280664 8972.807739 9705.886131 2 18 1237 1225 14:09:31 53.124833
29 5656 5 5 3 5 5 26 26 921 26 ... 0 4170.041867 6582.846660 7139.097203 2 18 1238 1226 11:20:54 61.501000
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
7613 4640 5 5 6 5 5 18 18 1016 18 ... 0 2273.045919 5800.771072 10202.976239 1 76 1234 1222 12:01:09 84.903833
7614 3998 5 5 2 5 5 24 24 935 24 ... 0 3544.869231 4031.967457 5671.768622 1 76 1228 1216 17:11:53 106.922500
7615 2432 5 5 5 5 5 15 15 1048 15 ... 0 7576.875171 8452.387480 14866.904339 2 76 1234 1222 16:41:31 40.803333
7616 5438 1 5 3 5 5 30 30 862 30 ... 0 2273.062551 2559.633775 4440.964600 2 76 1229 1217 12:50:02 86.785000
7617 9643 1 5 2 5 5 24 24 929 24 ... 0 2597.785773 2969.368501 4177.010670 2 76 1229 1217 12:26:15 89.036000
7618 3030 1 5 1 5 5 34 34 811 34 ... 0 2273.062551 2525.629369 4381.966956 2 76 1229 1217 14:23:39 80.175667
7619 11585 1 5 4 5 5 34 34 814 34 ... 0 1720.605492 2260.899193 3922.660100 1 76 1228 1216 15:59:28 113.677500
7620 6677 1 5 4 1 5 26 26 909 26 ... 0 3613.271533 4035.558807 4376.563526 1 76 1227 1215 16:35:57 110.918333
7621 10744 5 5 8 5 1 22 22 968 22 ... 0 3082.751506 3278.300013 4611.584628 1 76 1234 1222 14:08:25 95.713167
7622 8403 5 5 4 5 5 19 19 995 19 ... 0 2408.847688 2563.254954 4508.509139 1 76 1228 1216 17:36:32 62.217000
7623 7574 5 5 4 5 5 19 19 997 19 ... 0 2272.098197 2482.173894 4365.895661 2 76 1228 1216 16:09:34 96.809833
7624 8000 1 5 5 5 5 37 37 780 37 ... 0 4544.196393 4924.699453 8987.084031 2 76 1227 1215 16:40:18 140.088333
7625 6288 5 1 3 5 2 20 20 986 20 ... 0 2272.098197 2585.825443 3637.480651 2 76 1227 1215 17:40:15 93.622333
7626 5856 5 5 6 5 3 23 23 958 23 ... 0 12456.163382 31787.898176 44716.036364 1 76 1238 1226 16:04:09 69.623500
7627 8794 1 5 3 5 5 23 23 945 23 ... 0 6818.699775 7950.887074 11184.512847 1 76 1228 1216 18:23:51 77.508000
7628 6365 5 5 3 5 2 17 17 1028 17 ... 0 2272.899925 3456.977988 6080.478584 1 76 1235 1223 17:15:36 46.016667
7629 3537 1 5 3 5 2 36 36 797 36 ... 0 3918.792974 5258.971089 9597.096340 1 76 1239 1227 15:19:09 85.378000
7630 1515 1 5 1 5 5 44 44 688 44 ... 0 2272.899925 2680.745920 4467.463075 1 76 1228 1216 16:23:34 147.769667
7631 9174 1 5 3 5 3 32 32 834 32 ... 0 2272.899925 2608.931475 4526.496109 1 76 1228 1216 17:30:08 171.005000
7632 4213 1 5 3 5 2 40 40 748 40 ... 0 2272.948899 2659.474205 4432.013762 2 76 1229 1217 09:47:43 99.248667
7633 6804 5 5 3 5 2 35 35 805 35 ... 0 3247.069856 3814.222882 6960.575338 2 76 1229 1217 14:20:39 103.929167
7634 1282 1 5 4 5 3 35 35 798 35 ... 0 2068.394620 2222.154405 4055.209574 1 76 1228 1216 16:31:47 105.509000
7635 2954 1 5 4 5 3 30 30 862 30 ... 0 2068.394620 2356.019463 4087.693768 1 76 1228 1216 19:40:51 85.290167
7636 4964 1 5 3 5 3 41 41 727 41 ... 0 2068.394620 2222.154405 3703.220316 1 76 1227 1215 12:38:19 306.238000
7637 143 1 5 1 5 2 35 35 808 35 ... 0 2273.211779 2463.724427 4496.050707 2 76 1230 1218 17:45:36 83.798833
7638 11018 1 5 2 5 3 34 34 811 34 ... 0 3247.445399 3784.333145 6565.818007 2 76 1228 1216 15:57:38 82.907333
7639 6075 5 5 3 5 3 17 17 1014 17 ... 0 2273.211779 2497.234491 4392.385746 2 76 1228 1216 18:23:53 54.044833
7640 5649 1 5 2 5 5 29 29 873 29 ... 0 3247.445399 3569.313710 6003.228729 2 76 1228 1216 18:42:41 68.168000
7641 501 5 5 3 5 2 16 16 1034 16 ... 0 5304.160818 5954.644352 10473.623950 2 76 1228 1216 16:02:45 32.717333
7642 10252 1 5 2 5 2 28 28 889 28 ... 0 3247.445399 3476.637428 5847.356491 2 76 1230 1218 12:45:19 74.061500

7643 rows × 3087 columns

Print the value counts for pregnum:


In [4]:
df_resp.pregnum.value_counts().sort_index()


Out[4]:
0     2610
1     1267
2     1432
3     1110
4      611
5      305
6      150
7       80
8       40
9       21
10       9
11       3
12       2
14       2
19       1
dtype: int64

Compare PREGNUM in the codebook.

Print the counts for 7 or more pregnancies:


In [5]:
len(df_resp[df_resp.pregnum>=7])


Out[5]:
158

Cross-validate the respondant and pregnancy files.

Read the file 2002FemPreg.dat.gz:


In [6]:
df_preg = nsfg.ReadFemPreg()

In [7]:
df_preg


Out[7]:
caseid pregordr howpreg_n howpreg_p moscurrp nowprgdk pregend1 pregend2 nbrnaliv multbrth ... laborfor_i religion_i metro_i basewgt adj_mod_basewgt finalwgt secu_p sest cmintvw totalwgt_lb
0 1 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3410.389399 3869.349602 6448.271112 2 9 NaN 8.8125
1 1 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3410.389399 3869.349602 6448.271112 2 9 NaN 7.8750
2 2 1 NaN NaN NaN NaN 5 NaN 3 5 ... 0 0 0 7226.301740 8567.549110 12999.542264 2 12 NaN 9.1250
3 2 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 7226.301740 8567.549110 12999.542264 2 12 NaN 7.0000
4 2 3 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 7226.301740 8567.549110 12999.542264 2 12 NaN 6.1875
5 6 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 4870.926435 5325.196999 8874.440799 1 23 NaN 8.5625
6 6 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 4870.926435 5325.196999 8874.440799 1 23 NaN 9.5625
7 6 3 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 4870.926435 5325.196999 8874.440799 1 23 NaN 8.3750
8 7 1 NaN NaN NaN NaN 5 NaN 1 NaN ... 0 0 0 3409.579565 3787.539000 6911.879921 2 14 NaN 7.5625
9 7 2 NaN NaN NaN NaN 5 NaN 1 NaN ... 0 0 0 3409.579565 3787.539000 6911.879921 2 14 NaN 6.6250
10 12 1 NaN NaN NaN NaN 5 NaN 1 NaN ... 0 0 0 3612.781968 4146.013572 6909.331618 1 31 NaN 7.8125
11 14 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2418.069494 2810.302771 3039.904507 2 56 NaN 7.0000
12 14 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2418.069494 2810.302771 3039.904507 2 56 NaN 4.0000
13 14 3 NaN NaN NaN NaN 3 NaN NaN NaN ... 0 0 0 2418.069494 2810.302771 3039.904507 2 56 NaN NaN
14 15 1 NaN NaN NaN NaN 1 NaN NaN NaN ... 0 0 0 1667.816099 3200.862017 5553.495599 1 33 NaN NaN
15 15 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 1667.816099 3200.862017 5553.495599 1 33 NaN 7.6875
16 15 3 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 1667.816099 3200.862017 5553.495599 1 33 NaN 7.5000
17 18 1 NaN NaN NaN NaN 5 NaN 1 NaN ... 0 0 0 2957.257457 3404.403067 4153.371741 2 14 NaN 6.3125
18 18 2 NaN NaN NaN NaN 1 NaN NaN NaN ... 0 0 0 2957.257457 3404.403067 4153.371741 2 14 NaN NaN
19 21 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3408.342437 3965.763949 7237.122630 1 48 NaN 8.7500
20 21 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3408.342437 3965.763949 7237.122630 1 48 NaN 8.1875
21 23 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 6210.373020 8120.841310 13533.382043 2 64 NaN 5.5625
22 23 2 NaN NaN NaN NaN 1 NaN NaN NaN ... 0 0 0 6210.373020 8120.841310 13533.382043 2 64 NaN NaN
23 24 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3409.573258 4068.628645 7424.840414 1 27 NaN 6.7500
24 24 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3409.573258 4068.628645 7424.840414 1 27 NaN 7.3750
25 24 3 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3409.573258 4068.628645 7424.840414 1 27 NaN 6.8125
26 28 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3407.794208 3808.343516 6949.846082 2 57 NaN 8.1250
27 31 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3405.679025 4272.084519 5211.943113 1 2 NaN 7.1250
28 31 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3405.679025 4272.084519 5211.943113 1 2 NaN 6.0625
29 31 3 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3405.679025 4272.084519 5211.943113 1 2 NaN 7.4375
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
13563 12547 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3453.545517 6628.022524 11499.619080 1 52 NaN 7.6875
13564 12547 3 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3453.545517 6628.022524 11499.619080 1 52 NaN 7.6250
13565 12550 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3080.452699 3745.326058 5268.550165 1 79 NaN 8.1250
13566 12551 1 NaN NaN NaN NaN 5 NaN 1 NaN ... 0 0 0 2418.538866 3653.453268 3951.940400 2 75 NaN 7.5000
13567 12554 1 NaN NaN NaN NaN 3 NaN NaN NaN ... 0 0 0 1914.676604 2177.957240 2764.045534 2 75 NaN NaN
13568 12554 2 NaN NaN NaN NaN 4 NaN NaN NaN ... 0 0 0 1914.676604 2177.957240 2764.045534 2 75 NaN NaN
13569 12556 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2474.619764 3250.573384 3965.699528 1 44 NaN 5.8125
13570 12556 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2474.619764 3250.573384 3965.699528 1 44 NaN 6.6875
13571 12556 3 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2474.619764 3250.573384 3965.699528 1 44 NaN 6.0000
13572 12556 4 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2474.619764 3250.573384 3965.699528 1 44 NaN 5.8125
13573 12561 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2418.089703 2698.650781 4497.301527 1 10 NaN 6.5625
13574 12561 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2418.089703 2698.650781 4497.301527 1 10 NaN 6.1250
13575 12564 1 NaN NaN NaN NaN 3 NaN NaN NaN ... 0 0 0 1820.850938 2129.214067 2768.191208 2 44 NaN NaN
13576 12565 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 3195.641221 3834.241709 6652.409365 1 78 NaN 6.4375
13577 12565 2 35 1 8 NaN NaN NaN NaN NaN ... 0 0 0 3195.641221 3834.241709 6652.409365 1 78 NaN NaN
13578 12566 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2080.317155 2422.820274 2627.548587 2 2 NaN 6.0000
13579 12566 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2080.317155 2422.820274 2627.548587 2 2 NaN 7.0000
13580 12568 1 NaN NaN NaN NaN 1 NaN NaN NaN ... 0 0 0 2734.687353 4258.980140 7772.212858 2 28 NaN NaN
13581 12568 2 NaN NaN NaN NaN 5 NaN 1 NaN ... 0 0 0 2734.687353 4258.980140 7772.212858 2 28 NaN 6.3750
13582 12568 3 NaN NaN NaN NaN 4 NaN NaN NaN ... 0 0 0 2734.687353 4258.980140 7772.212858 2 28 NaN NaN
13583 12569 1 NaN NaN NaN NaN 3 NaN NaN NaN ... 0 0 0 2580.967613 2925.167116 5075.164946 2 61 NaN NaN
13584 12569 2 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 2580.967613 2925.167116 5075.164946 2 61 NaN 6.3750
13585 12570 1 NaN NaN NaN NaN 3 NaN NaN NaN ... 0 0 0 5181.311509 6205.829154 11325.017623 2 40 NaN NaN
13586 12570 2 NaN NaN NaN NaN 3 NaN NaN NaN ... 0 0 0 5181.311509 6205.829154 11325.017623 2 40 NaN NaN
13587 12570 3 NaN NaN NaN NaN 3 NaN NaN NaN ... 0 0 0 5181.311509 6205.829154 11325.017623 2 40 NaN NaN
13588 12571 1 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 4670.540953 5795.692880 6269.200989 1 78 NaN 6.1875
13589 12571 2 NaN NaN NaN NaN 3 NaN NaN NaN ... 0 0 0 4670.540953 5795.692880 6269.200989 1 78 NaN NaN
13590 12571 3 NaN NaN NaN NaN 3 NaN NaN NaN ... 0 0 0 4670.540953 5795.692880 6269.200989 1 78 NaN NaN
13591 12571 4 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 4670.540953 5795.692880 6269.200989 1 78 NaN 7.5000
13592 12571 5 NaN NaN NaN NaN 6 NaN 1 NaN ... 0 0 0 4670.540953 5795.692880 6269.200989 1 78 NaN 7.5000

13593 rows × 244 columns

Use nsfg.MakePregMap to make a dictionary that maps from each caseid to a list of indices in the pregnancy DataFrame:


In [8]:
dct_preg = nsfg.MakePregMap(df_preg)

For example, the indices of pregnancies that the person with caseid==12571 corresponds to:


In [9]:
dct_preg[12571]


Out[9]:
[13588, 13589, 13590, 13591, 13592]

In [10]:
df_resp[['caseid', 'pregnum']]


Out[10]:
caseid pregnum
0 2298 4
1 5012 1
2 11586 1
3 6794 0
4 616 0
5 845 8
6 10333 0
7 855 0
8 8656 3
9 3566 0
10 5917 2
11 9200 1
12 6320 2
13 11700 2
14 7354 7
15 3697 0
16 4881 3
17 5862 4
18 8542 2
19 2054 3
20 3719 1
21 11740 5
22 11343 3
23 7075 3
24 5422 2
25 2178 2
26 8358 0
27 5083 2
28 1545 2
29 5656 2
... ... ...
7613 4640 0
7614 3998 0
7615 2432 0
7616 5438 2
7617 9643 1
7618 3030 0
7619 11585 2
7620 6677 1
7621 10744 0
7622 8403 0
7623 7574 0
7624 8000 3
7625 6288 0
7626 5856 0
7627 8794 0
7628 6365 0
7629 3537 2
7630 1515 3
7631 9174 4
7632 4213 2
7633 6804 1
7634 1282 2
7635 2954 1
7636 4964 6
7637 143 2
7638 11018 1
7639 6075 0
7640 5649 0
7641 501 0
7642 10252 0

7643 rows × 2 columns

Validates the files:


In [11]:
error_count = 0
for index, (caseid, pregnum) in df_resp[['caseid', 'pregnum']].iterrows():
    if len(dct_preg[caseid]) != pregnum:
        print('Error: caseid = {0}'.format(caseid))
        error_count += 1
print('Number of errors = {0}'.format(error_count))


Number of errors = 0

In [12]:
import pandas
pandas.__version__


Out[12]:
'0.16.1'

In [12]: