[BLD] enable cython coverage, use cythonize
State: closed

- [x] closes #18089

Doesn't close #12624, but merits a mention.

Usage:
```
$ export PANDAS_CYTHON_COVERAGE=TRUE
$ python setup.py build_ext --inplace
$ coverage erase
$ pytest pandas/tests/scalar --cov=pandas/_libs
[...]
Name                                      Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------
pandas/_libs/__init__.py                      1      0   100%
pandas/_libs/algos.pyx                      162    116    28%   43, 45-47, 58, 66, 82-107, 132-145, 149-153, 160-181, 183, 198-206, 209, 212-244, 263-275, 278-284, 288-289, 292-299, 302-310
pandas/_libs/algos_common_helper.pxi       1884   1851     2%   25-1203, 1214-1942, 1958-1962, 1964, 1967, 1974-1976, 1981-1987, 1989-1991, 1999-3171, 3177-3227, 3232-3243
pandas/_libs/groupby.pyx                    168    148    12%   29-94, 113-134, 143-163, 165-171, 190-207, 210-213, 224-257, 260-265, 293-303, 306-314, 317-323, 354-380
pandas/_libs/hashing.pyx                     97     94     3%   48-190
pandas/_libs/hashtable.pyx                   83     75    10%   59-142, 154-177
pandas/_libs/hashtable_class_helper.pxi     846    828     2%   19-805, 810, 813, 818-829, 837-864, 878-1423
pandas/_libs/index.pyx                      384    300    22%   34, 36-39, 46, 49-71, 81-89, 95-100, 110, 114, 126, 130, 135-143, 147, 153-202, 204, 211-214, 221, 223, 227, 233-236, 245-258, 261, 277, 280, 289, 293-314, 318-403, 406, 409, 411, 415-429, 433-434, 440-525, 536-542, 546, 549-694
pandas/_libs/index_class_helper.pxi          95     90     5%   14-115, 117, 120, 122-123, 126-165
[...]
```

(I'll post results from a full test run in a bit)

Apparently there is an issue with the Cython.Coverage plugin that causes cdef function/class definition lines to not get covered.  Not sure if that's going to be fixed or if we need to find a workaround.

To make `cythonize` work I had to move `util.pxd` to `tslibs`, then cimport everything into a _libs.util pxd namespace.  There may be a way around this that I haven't found.  If not, there are parts of `tslibs.util` that are not used in `tslibs`, can be moved to `_libs.util`.

We _could_ remove a whole bunch more from the `ext_data` dictionary, but I'm saving that until after the first pass of the review process.  (I think doing so will lighten the build, not sure)

This will have a merge conflict with #21878, but it'll be easy to resolve when the time comes.


Labels:
name: Testing
description: pandas testing functions or related to the test suite
name: Build
description: Library building on various platforms
name: Internals
description: Related to non-user accessible pandas implementation

Comments:
Full results, took 108 minutes (yikes!)

```
$ time pytest pandas/tests --cov=pandas
[...]
---------- coverage: platform linux2, python 2.7.12-final-0 ----------
Name                                      Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------
pandas/__init__.py                           38      3    92%   14-15, 18
pandas/_libs/__init__.py                      1      0   100%
pandas/_libs/algos.pxd                        5      1    80%   6
pandas/_libs/algos.pyx                      162      1    99%   43
pandas/_libs/algos_common_helper.pxi       1884   1169    38%   25-49, 63-67, 70, 84-91, 97, 112-114, 123, 128-132, 138, 148-150, 159, 165, 167, 211-212, 226-230, 233, 241, 250, 261, 276-278, 287, 292-296, 302, 312-314, 323, 329, 331, 350, 375, 382-384, 407, 423-548, 557, 562-566, 574, 609-712, 721, 726-730, 738, 748-845, 859-863, 908-910, 919, 925, 927, 944-946, 955, 961, 963, 1007-1008, 1022-1026, 1072-1074, 1083, 1089, 1091, 1108-1110, 1119, 1125, 1127, 1146, 1164, 1171, 1178-1180, 1203, 1219-1641, 1656, 1658, 1704-1742, 1751, 1756-1760, 1768, 1803-1804, 1819, 1821, 1868-1906, 1915, 1920-1924, 1932, 1942, 1985-1987, 1999-2039, 2053-2057, 2060, 2102-2202, 2216-2220, 2223, 2235, 2266-2340, 2358, 2365, 2372-2374, 2383-2385, 2397-2815, 2824-2830, 2835, 2844, 2858-2872, 2880-2895, 2898-2904, 2909, 2915-3100, 3112, 3120, 3129, 3137, 3143-3160, 3171, 3182, 3191-3200, 3209, 3218, 3225-3227, 3236
pandas/_libs/algos_rank_helper.pxi          542    152    72%   16-17, 43, 99, 102, 105-110, 124-125, 159, 179-182, 214, 217, 220-226, 232-235, 246-247, 325, 328, 331, 334, 337, 351-352, 433, 436, 439, 442, 445, 451-454, 465-466, 505-507, 512, 530, 534-549, 552-555, 560-662, 714, 745, 748, 751, 754-757, 771-772, 820, 853, 856, 859, 862-865
pandas/_libs/algos_take_helper.pxi         2056   1267    38%   14-17, 41-44, 68, 76-79, 99-108, 123-126, 155-164, 169-170, 179-182, 191, 207-210, 229, 237, 245-277, 301-304, 320-339, 383-386, 400-442, 451, 467-470, 485-537, 561-564, 596-599, 619-628, 643-646, 675-684, 689-690, 699-702, 711, 727-730, 749, 757, 765-1379, 1423-1426, 1440-1577, 1601-1604, 1628, 1636-1639, 1659-1668, 1683-1686, 1715-1724, 1729-1730, 1739-1742, 1751, 1767-1770, 1789, 1797, 1805-2617, 2641-2644, 2668, 2676-2679, 2702-2703, 2723-2726, 2755-2764, 2769-2770, 2779-2782, 2791, 2807-2810, 2829, 2837, 2845-3137, 3161-3164, 3180-3199, 3243-3246, 3260-3302, 3311, 3327-3330, 3345-3397, 3421-3424, 3448, 3456-3459, 3482-3483, 3503-3506, 3535-3544, 3549-3550, 3559-3562, 3587-3590, 3609, 3617, 3625-3628, 3642-3643, 3647, 3654-3657, 3681-3684, 3700-3719, 3763-3766, 3780-3822, 3831, 3847-3850, 3865-3888, 3914-3917, 3941-3944, 3976-3979, 4002-4003, 4023-4026, 4055-4064, 4079-4082, 4091, 4107-4110, 4129, 4145-4437, 4461-4464, 4496-4499, 4543-4546, 4575-4584, 4599-4602, 4627-4630, 4649, 4665-4668, 4694-4697, 4721-4724, 4756-4759, 4803-4806, 4859-4862, 4887-4890, 4909, 4925-4955, 4969-4983, 4997
pandas/_libs/groupby.pyx                    168      9    95%   29, 69, 143, 161, 198, 238-240, 369
pandas/_libs/groupby_helper.pxi             898    329    63%   9-18, 32, 65, 79, 112, 125, 164, 209, 230, 233, 241, 258-352, 365, 378, 404-449, 465, 470, 473, 481, 502, 519, 530, 550, 567, 578, 593, 599, 764-1026, 1043, 1054, 1074, 1091, 1123, 1288, 1305, 1316, 1336, 1353, 1364, 1392, 1408, 1443, 1459, 1494, 1516, 1530, 1552, 1565-1738, 1754, 1789, 1805, 1840, 1862, 1868, 1878, 1900, 1905
pandas/_libs/hashing.pyx                     97     16    84%   70, 95, 99-106, 117, 135-144
pandas/_libs/hashtable.pyx                   83     26    69%   59-63, 68, 71-72, 88, 97-107, 112, 115-116, 123-125, 132-139
pandas/_libs/hashtable_class_helper.pxi     846    301    64%   19, 28, 41-54, 66, 80, 84, 91, 96, 101-104, 108, 114-134, 138, 145-150, 155-158, 162, 168-184, 188, 195, 200, 205, 208, 212, 218, 222, 227, 237-307, 314, 317, 329, 332, 338, 353, 358, 361, 366, 371, 377, 385-412, 426, 445-453, 474, 508-551, 577-578, 584, 589, 592, 597, 602, 608, 616-643, 657, 676-684, 731, 739-779, 798-799, 805, 810, 813, 818, 823, 829, 837, 847-850, 864, 878, 897-905, 960, 1003, 1031-1033, 1038, 1043-1105, 1140-1146, 1163, 1179, 1207-1209, 1266-1270, 1274, 1279, 1282, 1290, 1296, 1306, 1314, 1320-1322, 1338, 1360, 1388-1390
pandas/_libs/hashtable_func_helper.pxi      374     42    89%   14, 41, 73, 84, 121, 172, 199, 231, 242, 279-330, 356, 384, 394, 428, 477, 504, 536, 547, 584, 643, 679, 715, 751
pandas/_libs/index.pyx                      384     99    74%   34, 46, 49, 54, 59-61, 81-89, 95, 100, 114, 130, 136, 156, 168, 175, 192, 198-202, 214, 221, 227, 245, 248-254, 258, 261, 277, 280, 289, 293, 360, 377, 388, 391-403, 406, 409, 425-429, 448-450, 455, 458, 462, 464, 468, 470, 478, 484, 487, 490, 493-525, 542, 592, 622, 642-643, 662, 678, 687
pandas/_libs/index_class_helper.pxi          95     38    60%   14, 17, 21, 25, 27, 30, 55, 58, 62, 66, 68, 71, 73-74, 77-104, 107, 111, 115, 117, 123, 126, 153, 156, 160, 164
pandas/_libs/indexing.pyx                    11      3    73%   8-10, 16
pandas/_libs/internals.pyx                  232     33    86%   29, 52-59, 63, 70, 80, 83, 88, 95, 100, 110, 114, 126, 129, 136, 173, 180, 183-186, 193, 256, 276, 301-302, 309, 319, 325, 336
pandas/_libs/interval.pyx                   144     34    76%   21, 36, 51, 66, 81, 87-92, 102, 211-220, 239, 242, 248, 270-274, 293, 301, 308, 313, 320-325, 330-339
pandas/_libs/intervaltree.pxi              1905   1486    22%   11-47, 63, 79, 87, 94, 104, 118, 131, 154, 174-185, 191, 206-393, 409-410, 421-479, 498-903, 919-920, 949, 973, 989, 1023, 1029-1073, 1089-1090, 1119, 1143, 1159, 1184, 1199-1243, 1259-1260, 1289, 1313, 1329, 1369-1413, 1429-1430, 1459, 1483, 1499, 1524, 1533, 1539-1753, 1769-1770, 1781-1839, 1858-2263, 2279-2280, 2291-2349, 2368-2433, 2449-2450, 2461-2519, 2538-2603, 2619-2620, 2631-2689, 2708-2773, 2789-2790, 2801-2859, 2874-3113, 3129-3130, 3141-3199, 3218-3605
pandas/_libs/join.pyx                       133      1    99%   75
pandas/_libs/join_func_helper.pxi          3690   3105    16%   15-1267, 1326-1332, 1345-1346, 1360, 1369-1372, 1384-1386, 1391-1397, 1439-1801, 1814-1815, 1829, 1838-1841, 1853-1855, 1860-1979, 1992-1993, 2007, 2016-2019, 2031-2033, 2038-2157, 2170-2171, 2185, 2194-2197, 2209-2211, 2216-2335, 2348-2349, 2363, 2372-2375, 2387-2389, 2394-2513, 2526-2527, 2541, 2550-2553, 2565-2567, 2572-2691, 2704-2705, 2719, 2728-2731, 2743-2745, 2750-2869, 2882-2883, 2897, 2906-2909, 2921-2923, 2928-3047, 3060-3061, 3075, 3084-3087, 3099-3101, 3106-3225, 3238-3239, 3253, 3262-3265, 3277-3279, 3284-3403, 3416-3417, 3431, 3440-3443, 3455-3457, 3462-5364, 5375-5376, 5388, 5396-5398, 5407-5409, 5414-5509, 5520-5521, 5533, 5541-5543, 5552-5554, 5559-5654, 5665-5666, 5678, 5686-5688, 5697-5699, 5704-5799, 5810-5811, 5823, 5831-5833, 5842-5844, 5849-5944, 5955-5956, 5968, 5976-5978, 5987-5989, 5994-6089, 6100-6101, 6113, 6121-6123, 6132-6134, 6139-6234, 6245-6246, 6258, 6266-6268, 6277-6279, 6284-6379, 6429-6433, 6484-6488, 6520-6524, 6535-6536, 6548, 6556-6558, 6567-6569, 6574-6669, 6680-6681, 6693, 6701-6703, 6712-6714, 6719-6807
pandas/_libs/join_helper.pxi               1596    601    62%   18-168, 188, 198, 203-213, 227, 240, 245-255, 262, 295, 362, 396-640, 664-665, 672-677, 684, 689-690, 722-728, 739-744, 751, 759-763, 774, 806-807, 820, 855-861, 903-909, 924, 954, 996, 1018, 1051, 1118, 1152-1396, 1420-1421, 1428-1433, 1440, 1445-1446, 1478-1484, 1495-1500, 1507, 1515-1519, 1530, 1562-1563, 1576, 1680, 1774, 1908, 1926-1928, 1940-1941, 1954, 1989-2000, 2037-2051, 2058, 2088, 2130, 2152, 2167, 2169, 2173-2174, 2185, 2191-2193, 2214-2217, 2219-2222, 2226-2232, 2252, 2258-2260
pandas/_libs/lib.pyx                        365     31    92%   68, 151, 179, 219, 282, 418, 460, 473, 549, 553, 556, 594-600, 603-608, 616-630, 725
pandas/_libs/missing.pyx                    116     15    87%   25, 43, 75, 80, 108, 112, 114, 119, 123-124, 283, 290, 297, 309, 321
pandas/_libs/ops.pyx                        144     21    85%   60, 75-76, 128-129, 144, 188-204, 229-230, 243, 251
pandas/_libs/parsers.pyx                   1188    155    87%   86-87, 289, 292-314, 318-357, 362, 393, 419, 432, 454-455, 550-553, 563, 580-583, 607, 616, 654-663, 676, 682-684, 697, 706, 713-716, 766, 768, 867, 883, 905, 921, 934, 948, 986, 989, 994, 997-1000, 1105, 1113, 1174, 1228-1229, 1250, 1258, 1261, 1265, 1275, 1299, 1306, 1310, 1313, 1341, 1349, 1351, 1385, 1398, 1452, 1506, 1539-1541, 1565, 1624, 1628, 1637, 1655, 1676, 1717, 1788, 1813, 1824, 1853-1858, 1863, 1892, 1932, 1960, 2004, 2024, 2029, 2046, 2053, 2073, 2095, 2106, 2110, 2186, 2208-2218, 2230
pandas/_libs/properties.pyx                  35     11    69%   12-14, 19, 29-30, 40, 50-53, 57, 68
pandas/_libs/reduction.pyx                  358     45    87%   25, 44-45, 69, 89, 91-92, 96, 138, 187-190, 214, 218-219, 223, 225, 228, 232, 315-318, 327, 338, 342-343, 349, 352, 356, 432, 440, 454, 458, 472, 475, 482, 485, 556-564, 582, 585, 603
pandas/_libs/reshape.pyx                      4      0   100%
pandas/_libs/reshape_helper.pxi             131     66    50%   14-254, 302, 350, 398, 446, 494
pandas/_libs/skiplist.pyx                    73     65    11%   19-20, 33, 50-147
pandas/_libs/sparse.pyx                     408     75    82%   28-58, 65, 69, 74, 111, 123, 126, 129, 133, 168, 184, 208, 238, 259, 269-277, 328-336, 354, 358, 366, 369, 384, 389, 400-402, 414, 417, 434, 517, 536, 562, 592-635, 640, 656-659, 679, 727, 739, 804-816
pandas/_libs/sparse_op_helper.pxi          3017    708    77%   11, 16, 22, 25, 30-33, 38, 44, 49, 55, 58, 64, 77, 178, 236, 248-258, 359, 417, 429-439, 540, 598, 610-620, 721, 779, 791-801, 902, 960, 972-982, 1083, 1141, 1153-1525, 1626, 1684, 1696-1706, 1751-1759, 1807, 1865, 1877-1887, 1988, 2046, 2058-2068, 2169, 2227, 2239-2249, 2350, 2408, 2420-2430, 2475-2483, 2531, 2589, 2601-2611, 2712, 2770, 2782-2792, 2893, 2951, 2963-2973, 3018-3026, 3074, 3102-3104, 3132, 3144-3154, 3199-3207, 3255, 3283-3285, 3313, 3325-3335, 3380-3388, 3436, 3464-3466, 3494, 3506-3516, 3561-3569, 3617, 3645-3647, 3675, 3687-3697, 3742-3750, 3798, 3826-3828, 3856, 3868-3878, 3923-3931, 3979, 4007-4009, 4037, 4049-4059, 4104-4112, 4160, 4188-4190, 4218, 4230-4240, 4285-4293, 4341, 4369-4371, 4399, 4411-4421, 4466-4474, 4522, 4550-4552, 4580, 4592-4602, 4647-4655, 4703, 4731-4733, 4761, 4773-4783, 4828-4836, 4884, 4912-4914, 4942, 4954-4964, 5009-5017, 5065, 5093-5095, 5123, 5135-5326, 5359-5367, 5427, 5461-5463, 5485, 5497-5688, 5721-5729, 5789, 5823-5825, 5847, 5859-5864
pandas/_libs/src/inference.pyx              759    176    77%   1-37, 41, 45, 49, 53, 57, 61, 65, 69-136, 159, 192, 199, 221, 225, 229, 233, 244, 366, 381, 413, 422-423, 430, 467-468, 488, 569, 579, 582, 585, 588, 599-603, 609, 625, 638, 649, 652, 655-662, 665, 668, 671, 679, 682, 686, 698, 701, 705, 716, 719, 723, 734, 737, 741, 748, 751, 755, 767, 770, 774, 786-811, 818-828, 835, 841, 844, 848, 859, 863, 872, 882, 902, 905, 909, 920, 924, 935, 939, 951, 955, 962, 966, 973, 976, 980, 987, 991, 1005-1013, 1113-1114, 1127, 1155, 1163, 1173-1180, 1225-1226, 1228-1229, 1240-1242, 1345-1348, 1352-1353, 1355-1356, 1360, 1362-1363, 1365-1370, 1375, 1405, 1418, 1457, 1499, 1516, 1547
pandas/_libs/testing.pyx                    124     17    86%   25, 28, 31, 34, 37, 43, 59-62, 121-123, 127, 156, 178-180, 191
pandas/_libs/tslib.pyx                      412     49    88%   60, 67, 73, 120, 126, 142, 197, 199, 205-207, 213, 295, 392, 399-401, 408-411, 443, 448-451, 487-491, 549-550, 598-603, 622-626, 650, 666, 669, 681, 685-686, 703-706
pandas/_libs/tslibs/__init__.py               6      0   100%
pandas/_libs/tslibs/ccalendar.pyx            48      6    88%   58, 81, 117, 134, 181, 211
pandas/_libs/tslibs/conversion.pyx          516     57    89%   57, 110-112, 192, 228, 232, 253, 321, 384-386, 481, 501, 509, 561, 566, 575, 583, 613-614, 659, 665-666, 699, 713, 740, 754, 796-801, 815, 933-936, 952-953, 959-961, 1005, 1015, 1028, 1067, 1099-1100, 1109, 1134-1135, 1141-1142, 1156-1157, 1163-1164, 1171
pandas/_libs/tslibs/fields.pyx              466     69    85%   56-61, 89, 133, 138, 190-191, 217-218, 253-254, 281-282, 318-319, 346-347, 379, 542, 572-580, 583-591, 605-613, 619-620, 627-635, 638-646, 652-653, 659-662
pandas/_libs/tslibs/frequencies.pyx         188     26    86%   133, 185, 210, 225, 251-254, 269, 305, 327, 361, 363, 376-380, 403, 406-408, 419, 436, 456, 462, 467, 472, 477, 484
pandas/_libs/tslibs/nattype.pyx             227     32    86%   71, 76-79, 94-101, 108-112, 118, 133, 160-163, 166, 169-175, 181, 184-186, 268, 271, 276, 587, 593, 610
pandas/_libs/tslibs/np_datetime.pyx          78     13    83%   45, 55, 62, 81, 104, 128, 134, 141, 149, 162, 172, 185, 189
pandas/_libs/tslibs/offsets.pyx             485     41    92%   93, 109, 130, 140, 161, 181, 192, 249, 377, 461, 511, 526, 551, 556, 597-598, 621-622, 650-651, 681-682, 709, 739-740, 756-757, 780-781, 802-803, 822-823, 839, 845, 901, 941-942, 951, 975, 1018
pandas/_libs/tslibs/parsing.pyx             360     57    84%   26-27, 64, 89, 99, 146, 174, 178, 196, 252, 303, 330-331, 341, 344-357, 359, 367, 380, 393, 412, 415-417, 424, 435-436, 443, 454, 460, 479, 505, 539, 586, 595-605, 619, 623-626, 663, 676
pandas/_libs/tslibs/period.pyx              738    143    81%   90, 129, 133, 140, 218, 240, 254-255, 260, 289, 335, 359, 398, 417, 479, 490, 497, 502, 541, 550, 579, 585, 591, 625, 630, 641, 647, 649, 651, 656, 659, 661, 663, 665, 667, 669-672, 678-682, 687, 697, 715, 719-721, 723, 725, 727-728, 741-744, 752, 759, 766, 773, 780, 787, 794, 801, 808, 815, 822, 837, 851, 854, 856, 858, 860, 862, 864, 866, 868, 870, 872, 874, 876, 923, 933, 945-946, 953-954, 966-971, 975-976, 995-996, 1000, 1031, 1050, 1053, 1077-1079, 1104-1106, 1132-1134, 1165, 1195, 1201, 1234, 1239, 1244, 1268, 1298, 1322, 1346, 1351, 1381, 1417, 1421, 1456, 1461, 1505, 1539-1561, 1569, 1573, 1576, 1581, 1593-1597, 1601, 1764-1765, 1824, 1829-1831, 1840, 1858
pandas/_libs/tslibs/resolution.pyx          355     43    88%   53, 65, 73, 84, 90-97, 106-112, 116, 125, 160, 346, 370, 374, 386-392, 426, 478, 534, 571, 586, 597, 604, 617, 646, 651-653
pandas/_libs/tslibs/strptime.pyx            344     90    74%   14-21, 66, 104, 109-110, 120-129, 146-147, 162-163, 171-175, 205-206, 208, 210-213, 216, 219, 222, 231-238, 240, 242, 249-253, 259-261, 269, 271, 297-301, 317-321, 395, 399-404, 451-455, 472, 486, 492, 511, 560, 601, 622, 627, 653-658
pandas/_libs/tslibs/timedeltas.pyx          651     81    88%   110, 122, 124, 139, 162-163, 171, 179, 181, 198, 209, 235, 264, 279, 287, 336-337, 365-367, 372-373, 386, 404-405, 429, 454, 467, 491, 500, 567, 634, 665, 674, 691-694, 699, 705, 722-730, 745, 748, 771, 778, 782, 788-793, 801, 831, 866, 910, 912, 918, 925, 957, 1004, 1007, 1010, 1013, 1132, 1150-1151, 1191, 1201, 1222, 1273, 1282-1283, 1287, 1408, 1412, 1417, 1442
pandas/_libs/tslibs/timestamps.pyx          494     64    87%   47, 115-119, 124, 140-141, 156-158, 161, 174, 180, 205-227, 236, 250, 254, 265, 267, 278, 287-288, 291, 332, 341, 354-355, 362, 373, 378, 384, 395, 404-407, 411, 419, 588, 728-730, 951-952, 1045, 1061-1063
pandas/_libs/tslibs/timezones.pyx           147     25    83%   32, 36, 40, 45, 49, 67, 87, 100, 104, 117, 137, 154, 161, 169-170, 176, 191, 209, 233, 261-263, 288, 292, 321
pandas/_libs/window.pyx                     834     61    93%   35-36, 66, 68, 75, 108, 139-141, 177-179, 223-225, 242, 288, 296, 411, 422, 431, 516, 524, 527, 535, 547, 632, 645, 652, 668, 787, 818, 831, 919, 953, 967, 1075, 1091, 1109, 1125, 1135, 1142, 1147, 1152, 1157, 1163, 1173, 1215, 1262, 1265, 1350, 1412, 1461, 1463, 1465, 1477, 1502, 1526, 1586, 1608, 1632, 1673, 1742-1743
pandas/_libs/writers.pyx                     83     11    87%   11, 79, 140, 158-172
pandas/_version.py                          263    146    44%   74-85, 88, 90-92, 99-107, 118-133, 139, 143, 145-176, 189-191, 195, 203, 207, 223, 232-235, 240-247, 258-261, 268, 286-292, 302-309, 321-335, 344-355, 365-374, 384-392, 397, 403, 407-418, 446-447, 454-463
pandas/api/__init__.py                        1      0   100%
pandas/api/extensions/__init__.py             4      0   100%
pandas/api/types/__init__.py                  4      0   100%
pandas/compat/__init__.py                   244     67    73%   58, 70, 95, 105, 114-117, 124-125, 128-134, 205-214, 239, 253-302, 352, 368-370, 384, 394, 401-404, 422, 430-431, 446
pandas/compat/chainmap.py                    21      6    71%   17-21, 26
pandas/compat/chainmap_impl.py               75     33    56%   5-6, 16-24, 69, 79, 82, 92, 99, 108-110, 115, 118, 121-124, 132-135, 142-145, 150
pandas/compat/numpy/__init__.py              33      2    94%   20, 66
pandas/compat/numpy/function.py             165     19    88%   48, 56, 69-70, 129-130, 150-151, 180-181, 255-256, 270-281, 362
pandas/compat/pickle_compat.py               82     27    67%   36-54, 129-135, 160, 171-180, 207
pandas/computation/__init__.py                0      0   100%
pandas/computation/expressions.py             5      5     0%   1-15
pandas/conftest.py                          102     11    89%   28, 31, 34, 72-73, 151-152, 190-191, 302, 346
pandas/core/__init__.py                       0      0   100%
pandas/core/accessor.py                      78      1    99%   54
pandas/core/algorithms.py                   641     34    95%   839-840, 918-922, 1042, 1051-1056, 1062, 1285, 1293, 1295, 1609-1610, 1623, 1646, 1681-1684, 1688, 1692, 1697-1698, 1706, 1715, 1730-1732, 1788
pandas/core/api.py                           39      0   100%
pandas/core/apply.py                        218      7    97%   56-67, 350-351
pandas/core/arrays/__init__.py                5      0   100%
pandas/core/arrays/base.py                  140     15    89%   105, 123, 158, 213, 232, 254, 284, 372, 387, 571, 586, 611, 630, 738-739
pandas/core/arrays/categorical.py           763     31    96%   208, 537, 696, 820-823, 1059-1060, 1251, 1582-1583, 1663, 1751, 1815-1822, 1886, 1983-1989, 2107, 2226, 2244-2245, 2286-2288, 2337, 2482
pandas/core/arrays/datetimelike.py          190     12    94%   31-32, 36-37, 73, 144, 270, 276, 279, 314, 355, 427
pandas/core/arrays/datetimes.py             264     12    95%   97-100, 119, 123-125, 152, 302, 314, 347
pandas/core/arrays/period.py                266     23    91%   125, 139-143, 159, 279-280, 300-310, 367-372, 377
pandas/core/arrays/timedelta.py             164     24    85%   62, 79, 82-85, 89-93, 98-100, 121-122, 128-133, 144, 146, 191, 199, 351
pandas/core/base.py                         423     13    97%   50, 61, 92, 102, 215, 262, 287, 317, 588-589, 629, 687, 1263
pandas/core/categorical.py                    4      0   100%
pandas/core/common.py                       282     19    93%   69-70, 244-247, 502-506, 509, 519-528, 537
pandas/core/computation/__init__.py           0      0   100%
pandas/core/computation/align.py             95      0   100%
pandas/core/computation/api.py                6      0   100%
pandas/core/computation/check.py             11      1    91%   13
pandas/core/computation/common.py            14      3    79%   9, 18-20
pandas/core/computation/engines.py           63      7    89%   98, 126-130, 148
pandas/core/computation/eval.py             104      3    97%   40, 52, 271
pandas/core/computation/expr.py             388     63    84%   53-54, 442, 479-489, 517, 534-539, 546-591, 597, 599, 612, 615, 621, 630-643, 690, 752
pandas/core/computation/expressions.py      119      7    94%   114, 144-148, 223
pandas/core/computation/ops.py              273     12    96%   122, 149, 153, 337-340, 407, 421, 430, 501-502, 519
pandas/core/computation/pytables.py         328    230    30%   33-35, 38, 42-52, 56, 62, 66, 74-78, 81, 85-126, 130-134, 139, 145, 150, 155, 160, 164-165, 171-219, 223, 229, 234-238, 242, 246-280, 283-286, 295, 301, 314, 318-343, 349-352, 359-373, 392-396, 400, 403-405, 410-420, 424-446, 450, 453, 476, 525-526, 529-535, 541-545, 548-550, 555-568, 576-578, 583-591, 596-601
pandas/core/computation/scope.py            102      9    91%   36-38, 75-77, 138-141
pandas/core/config.py                       304     39    87%   85, 115-116, 148, 158, 161, 171-172, 185, 209, 231-233, 393, 445-446, 471, 665-689, 787, 810
pandas/core/config_init.py                  132      3    98%   42-43, 321
pandas/core/datetools.py                     38      5    87%   27-31
pandas/core/dtypes/__init__.py                0      0   100%
pandas/core/dtypes/api.py                    13      0   100%
pandas/core/dtypes/base.py                   39      3    92%   137, 162, 204
pandas/core/dtypes/cast.py                  619     71    89%   52, 81, 94, 96, 204-205, 211-227, 239-248, 252-253, 267-269, 282-285, 289-293, 327, 539-540, 558, 610, 626, 635, 654, 668, 682, 697-698, 724-725, 737, 746, 748, 770-775, 792-793, 812, 817, 819, 822-823, 853-854, 892, 894-895, 936-937, 1034, 1202
pandas/core/dtypes/common.py                386     18    95%   192-193, 1169-1170, 1232, 1235, 1443, 1526-1527, 1618, 1773-1775, 1783, 1874, 1908, 1958, 1988
pandas/core/dtypes/concat.py                242      2    99%   467, 503
pandas/core/dtypes/dtypes.py                374     12    97%   35, 101, 236, 298-299, 624, 678-680, 802-804
pandas/core/dtypes/generic.py                33      0   100%
pandas/core/dtypes/inference.py              63      1    98%   155
pandas/core/dtypes/missing.py               174     13    93%   149-156, 201-202, 239, 247, 479, 481
pandas/core/frame.py                       1927     52    97%   479, 513, 624, 641, 692, 848-849, 908, 912, 1197-1198, 1243, 1247-1248, 1487-1490, 1923, 1926, 1951-1952, 2322, 2690, 2695-2696, 2723-2724, 2727, 2738, 3156, 3189, 3244, 3267-3268, 3403-3404, 4247, 4550, 5082, 5108-5111, 6758, 7065, 7118, 7140, 7560, 7671, 7711, 7761, 7785
pandas/core/generic.py                     2062     83    96%   79, 90, 203, 208-209, 224, 294-295, 333-335, 359, 444, 523, 682, 707, 880-881, 1030, 1690, 1751, 1753, 2085-2086, 2427-2444, 2605, 2609, 2669, 2700, 2817-2818, 3144, 3807, 3908-3914, 4276, 4492, 4496, 4732, 5210, 5518, 5856, 5869, 5947, 5972, 6087, 6386, 7561-7563, 7576, 7727-7728, 7734-7741, 7918, 7939, 8005, 8056, 8263, 8653, 8657-8665, 8672, 8724-8725
pandas/core/groupby/__init__.py               3      0   100%
pandas/core/groupby/base.py                  45      0   100%
pandas/core/groupby/categorical.py           22      1    95%   98
pandas/core/groupby/generic.py              795     43    95%   249, 341, 350, 391-392, 471, 542, 834-836, 961, 1000, 1028-1033, 1079, 1091, 1418, 1584-1598, 1641-1657, 1660
pandas/core/groupby/groupby.py              647     26    96%   375, 418, 671, 708, 790, 813, 852, 1005-1006, 1222, 1227, 1256, 1260, 1474-1477, 1508, 1542, 1734, 1743, 1789, 1793, 1796, 1798, 1812, 1859, 1873
pandas/core/groupby/grouper.py              273      5    98%   199, 288, 317, 361, 633
pandas/core/groupby/ops.py                  439     16    96%   525-534, 583-586, 710-711, 720, 849, 852, 870-872
pandas/core/index.py                          2      0   100%
pandas/core/indexes/__init__.py               0      0   100%
pandas/core/indexes/accessors.py            101     10    90%   27, 50-53, 65, 101, 316, 336-338
pandas/core/indexes/api.py                   92      3    97%   74-75, 122
pandas/core/indexes/base.py                1814     57    97%   78-81, 257, 476-478, 529, 538-539, 564, 574, 606, 988, 998, 1003, 1152, 1244, 1359, 1363, 1596, 1632, 1634, 1636-1638, 1652, 1743-1745, 1886-1888, 1905, 1994, 2128, 2357-2358, 2870-2871, 2930-2931, 3287, 3388, 3416, 3478, 3645, 3931, 4246, 4625, 4632, 4683, 4698, 4716, 4726, 4868
pandas/core/indexes/category.py             368     10    97%   82, 201, 209, 211, 237, 299, 434, 573, 641, 784
pandas/core/indexes/datetimelike.py         425     13    97%   268, 270, 307, 320-324, 561, 648, 653, 656, 718
pandas/core/indexes/datetimes.py            922     43    95%   459-460, 471, 515, 518, 521, 538, 541, 545, 715, 718, 757, 773-774, 784, 872, 994-995, 1035-1036, 1039-1042, 1105, 1130-1134, 1138, 1162, 1169, 1209, 1222, 1306, 1423, 1494, 1498, 1787, 2109-2114, 2118
pandas/core/indexes/frozen.py                68      6    91%   41, 57, 65, 89, 139-140
pandas/core/indexes/interval.py             631     43    93%   67, 82, 95, 228, 278-280, 292-294, 755-759, 799, 802, 962, 1019, 1081, 1179, 1183, 1197-1198, 1207-1210, 1221-1222, 1321-1326, 1347, 1351-1352, 1367, 1369-1370, 1372-1374, 1378-1381, 1416
pandas/core/indexes/multi.py               1190     55    95%   269, 297, 301, 400, 516, 622, 731-737, 741, 758, 830, 834, 854-857, 871, 903-917, 993-1003, 1228, 1428-1429, 1549-1552, 1585, 1724, 1870, 1931, 1962, 2457, 2582, 2774, 2879
pandas/core/indexes/numeric.py              218      6    97%   255, 264, 277, 334, 396-397
pandas/core/indexes/period.py               427     29    93%   204, 305, 320, 334, 355-356, 359-364, 367, 378, 573-574, 659-660, 683-688, 694, 698-704, 711, 784, 804
pandas/core/indexes/range.py                326     12    96%   114, 124, 142-146, 153, 500, 504, 538, 546, 634
pandas/core/indexes/timedeltas.py           409     32    92%   90, 207, 290-293, 336, 385-386, 417-418, 424, 432, 451, 472, 495-496, 501, 508, 522, 539-548, 552, 632, 638, 691
pandas/core/indexing.py                    1069     69    94%   143, 149, 154, 185, 219, 263, 281, 295-298, 412, 504-514, 595, 734, 781-783, 808, 823, 825, 863-865, 891, 959, 964, 1000, 1080, 1083, 1199, 1323, 1326-1328, 1370, 1381, 1384, 1390, 1466, 1470-1471, 1486-1487, 1523, 1535, 1817, 2105, 2146, 2156, 2165, 2175, 2191, 2200, 2221, 2245, 2253, 2262, 2278, 2405, 2435, 2591-2595, 2705-2706
pandas/core/internals.py                   2842    129    95%   163, 286, 343, 477, 496, 535, 554, 670-671, 682, 705, 724-733, 872, 931, 1061, 1121-1124, 1187-1190, 1215, 1268-1272, 1377, 1399-1400, 1497, 1511-1520, 1544, 1566, 1640-1641, 1668-1671, 1715, 1719, 1722, 1771, 1775, 1960, 2040, 2214, 2383-2387, 2390-2398, 2450-2458, 2494, 2741-2742, 2781, 2829, 2864, 2891, 3037, 3042, 3066-3067, 3098, 3310, 3410, 3441, 3537, 3664-3665, 3879, 3980, 4132, 4138, 4349, 4382, 4425, 4542, 4586, 4651, 4661-4666, 4675-4677, 4680, 4698, 4703, 4708, 4712, 4745, 4748, 4770, 4780, 5060, 5120, 5169, 5337, 5389, 5480, 5557, 5707, 5850
pandas/core/missing.py                      383     32    92%   37-38, 220, 258-259, 274, 279-280, 286-287, 308, 310, 312, 357-362, 411-413, 416-419, 481, 489, 493, 507, 515, 519, 542, 573, 620
pandas/core/nanops.py                       514     19    96%   35, 126, 140, 160, 210, 249, 404-408, 501-505, 708-709, 776
pandas/core/ops.py                          681     22    97%   106, 142, 158, 1232-1234, 1241-1243, 1246, 1253, 1362, 1388, 1457, 1507, 1511, 1604, 1740-1741, 1777-1778, 1790, 1842
pandas/core/panel.py                        665     17    97%   168, 458, 467-468, 509, 559, 685, 887-888, 1053-1054, 1101, 1152-1153, 1168, 1206, 1320
pandas/core/resample.py                     563     22    96%   98, 140, 274, 277, 829, 916, 979, 999, 1106, 1113, 1127, 1142, 1286, 1325-1326, 1378, 1404, 1408-1410, 1426, 1482, 1487
pandas/core/reshape/__init__.py               0      0   100%
pandas/core/reshape/api.py                    6      0   100%
pandas/core/reshape/concat.py               249      6    98%   467-469, 488, 538, 547
pandas/core/reshape/melt.py                 113      3    97%   30, 62, 129
pandas/core/reshape/merge.py                662     33    95%   97-103, 113-123, 133-134, 231, 850-851, 1009-1010, 1056, 1249, 1287, 1298, 1302, 1304, 1322, 1328, 1371, 1476, 1597
pandas/core/reshape/pivot.py                304      9    97%   198, 240, 340-347, 575
pandas/core/reshape/reshape.py              462      1    99%   671
pandas/core/reshape/tile.py                 171      9    95%   201-203, 372-376, 422
pandas/core/reshape/util.py                  31      3    90%   11-13
pandas/core/series.py                      1053     62    94%   183, 254, 271, 334-335, 351-352, 567, 687, 721, 749-760, 805, 833-835, 840, 897, 909, 913-920, 932, 966-969, 978, 994, 1005, 1040-1044, 1221, 1298-1300, 2071, 2075, 2492-2495, 2528, 2672, 3475, 3917, 4035-4037, 4150-4151, 4184, 4199
pandas/core/sorting.py                      223      5    98%   137, 197, 210, 265, 448
pandas/core/sparse/__init__.py                0      0   100%
pandas/core/sparse/api.py                     3      0   100%
pandas/core/sparse/array.py                 418     25    94%   52-53, 161, 163, 204, 223, 248, 276, 309-310, 420, 464, 517, 519, 569-574, 704-705, 746-748, 828
pandas/core/sparse/frame.py                 460     24    95%   63, 65, 67, 69, 78, 125, 258-259, 528-529, 568, 571, 646, 743, 764-775
pandas/core/sparse/scipy_sparse.py           68      2    97%   65-66
pandas/core/sparse/series.py                313     15    95%   76, 120, 138, 146, 159, 246, 248, 278, 290-291, 352, 373-375, 380, 512
pandas/core/strings.py                      730     10    99%   172, 736, 1356, 1370, 1604, 1727, 1734-1735, 2945-2946
pandas/core/tools/__init__.py                 0      0   100%
pandas/core/tools/datetimes.py              318     25    92%   188, 197-198, 214, 216, 243-244, 256-258, 266, 315-316, 628, 675-676, 746-749, 787, 833-836, 841, 848
pandas/core/tools/numeric.py                 67      0   100%
pandas/core/tools/timedeltas.py              63      1    98%   79
pandas/core/util/__init__.py                  0      0   100%
pandas/core/util/hashing.py                 121      2    98%   270, 275
pandas/core/window.py                       833     31    96%   88, 92, 121, 166, 245-246, 305, 311, 609-610, 618, 628, 649, 679-681, 854, 1919, 2220, 2242-2244, 2254, 2458, 2504-2505, 2532, 2535, 2556, 2569, 2579
pandas/errors/__init__.py                    26      2    92%   172-174
pandas/formats/__init__.py                    0      0   100%
pandas/formats/style.py                       3      0   100%
pandas/io/__init__.py                         0      0   100%
pandas/io/api.py                             19      0   100%
pandas/io/clipboard/__init__.py              51     31    39%   46, 56, 58, 60, 63-98, 106-115
pandas/io/clipboard/clipboards.py            85     68    20%   11-22, 26-42, 49-69, 73-84, 88-99, 103-127, 138-141
pandas/io/clipboard/exceptions.py             7      2    71%   11-12
pandas/io/clipboard/windows.py               86     76    12%   14, 17-20, 23, 27-153
pandas/io/clipboards.py                       4      0   100%
pandas/io/common.py                         259     37    86%   33-39, 70, 145, 152-153, 158, 160, 207, 213-214, 221, 346, 363-364, 385, 405-412, 420-428, 434-436, 443-448, 504, 531
pandas/io/date_converters.py                 38      0   100%
pandas/io/excel.py                          621    114    82%   253, 269, 278-279, 366-367, 382, 399-402, 409, 413, 569-578, 596, 617, 643, 739, 860, 883, 888, 907, 914, 943, 947, 993-996, 1033-1036, 1053-1063, 1173, 1195, 1243, 1247, 1250-1254, 1258-1259, 1289, 1291, 1330, 1332, 1500, 1686-1737, 1748-1759, 1766, 1771-1805
pandas/io/feather_format.py                  35     28    20%   13-34, 47-83, 106-112
pandas/io/formats/__init__.py                 0      0   100%
pandas/io/formats/console.py                 33     10    70%   24-25, 29-32, 36, 72-74
pandas/io/formats/css.py                    113      0   100%
pandas/io/formats/csvs.py                   171      3    98%   84, 101, 132
pandas/io/formats/excel.py                  305      8    97%   165, 171, 411, 461, 482-484, 548, 580
pandas/io/formats/format.py                 857     15    98%   129-131, 137, 153, 488, 499, 720, 761, 781, 1020, 1031, 1275, 1278, 1570
pandas/io/formats/html.py                   323     36    89%   166-168, 202, 211-216, 253-259, 275-283, 300, 323-324, 473, 485, 491-500
pandas/io/formats/latex.py                  123      0   100%
pandas/io/formats/printing.py               188     13    93%   62-64, 119, 135, 148, 196, 208, 220, 231-232, 238, 296
pandas/io/formats/style.py                  417     16    96%   16-20, 37-39, 47, 333, 385, 1145, 1147-1150, 1225-1229
pandas/io/formats/terminal.py                81     41    49%   34, 39-41, 48, 63-66, 70-91, 98-112, 132-133, 135-139
pandas/io/gbq.py                             12      9    25%   7-21, 110-111, 122-123
pandas/io/gcs.py                             10      6    40%   8-16
pandas/io/html.py                           351     32    91%   42-43, 48-49, 54-55, 141, 256, 271, 286, 305, 320, 346, 365, 376, 461, 480, 567, 621, 723-724, 738, 832, 838, 840, 849, 859, 864-870, 900
pandas/io/json/__init__.py                    4      0   100%
pandas/io/json/json.py                      425     32    92%   40, 96, 426-427, 501-502, 563-564, 608, 641, 657, 679-680, 703-707, 728-729, 770, 795-799, 810, 833-837, 894, 903
pandas/io/json/normalize.py                  96      4    96%   18, 71, 83, 224
pandas/io/json/table_schema.py              117      2    98%   67, 254
pandas/io/msgpack/__init__.py                24      5    79%   13, 15, 17, 32-33
pandas/io/msgpack/_packer.pyx               183     32    83%   80, 84, 88-89, 98, 105, 110, 115, 118, 132, 164, 177, 186, 197, 211, 217, 231, 235, 237, 243, 247, 252, 254, 260, 262, 265, 267, 273, 288, 290, 296, 300
pandas/io/msgpack/_unpacker.pyx             203     45    78%   48, 70, 77, 83, 88, 96-97, 101, 128, 133, 143-144, 151-249, 252, 256-258, 277, 289, 300, 305, 309, 317, 321, 329, 354, 369, 379, 405, 412-417, 427, 437, 447, 455, 463, 466
pandas/io/msgpack/_version.py                 1      0   100%
pandas/io/msgpack/exceptions.py              18      3    83%   20-21, 24
pandas/io/packers.py                        339     37    89%   80-82, 98-99, 144, 161, 193-198, 290, 297-305, 335-337, 498, 520, 531, 537, 564, 687, 690, 701-702, 705-708, 806-813
pandas/io/parquet.py                        117     63    46%   19-29, 38, 64, 67, 70, 78-103, 107-119, 124-138, 143-167, 181-182, 190, 210-212, 225-229
pandas/io/parsers.py                       1564     69    96%   453-454, 888-890, 892-896, 919-924, 1027, 1137, 1324, 1335, 1345, 1438-1439, 1473, 1476, 1603-1605, 1654, 1756, 1775, 1786-1787, 1834, 1841, 1844, 1938-1945, 2157, 2164, 2173, 2263-2264, 2296-2298, 2383, 2440, 2503, 2514, 2543, 2565-2566, 2584, 2621, 2706, 2718, 3015-3016, 3023, 3112, 3312-3319, 3325, 3390, 3398, 3412
pandas/io/pickle.py                          48      9    81%   178, 186-191, 195-203
pandas/io/pytables.py                      2381   1915    20%   68-70, 75-78, 88-90, 106-117, 247-264, 273-284, 347-405, 410-419, 469-492, 495, 500-501, 505, 508, 511, 514, 518-522, 529-534, 537, 540, 543, 546, 554, 557, 563-564, 577-638, 644-646, 653-655, 673-679, 693-696, 722-742, 756-757, 778, 804-861, 888-891, 914-941, 978-987, 1013-1070, 1085-1093, 1099-1101, 1139-1155, 1159-1165, 1169-1175, 1194-1226, 1234-1259, 1263-1264, 1268-1277, 1283-1363, 1367-1418, 1421-1423, 1429-1436, 1462-1489, 1494-1505, 1508-1509, 1514-1533, 1589-1591, 1597, 1601-1602, 1605-1612, 1616, 1620, 1625-1628, 1631-1632, 1636-1641, 1647-1669, 1673-1674, 1678, 1682, 1687, 1692, 1695, 1701-1707, 1711, 1714, 1717-1722, 1728-1741, 1745-1748, 1755-1781, 1785-1787, 1791, 1795, 1799, 1803-1808, 1813-1814, 1823, 1828-1829, 1832, 1835, 1860-1875, 1890-1897, 1901, 1907-1912, 1916-1917, 1922, 1928-1951, 1957-2004, 2007, 2013-2054, 2058-2065, 2068, 2071-2075, 2078-2080, 2086-2105, 2108, 2111-2115, 2119-2131, 2134, 2137-2141, 2145, 2150, 2154-2164, 2173-2243, 2247-2250, 2254-2257, 2266-2267, 2270, 2273, 2276, 2279, 2287, 2309-2313, 2317, 2322-2329, 2333, 2338, 2342-2348, 2352-2354, 2357-2358, 2362, 2366, 2370, 2374, 2378, 2382, 2386, 2390, 2394, 2398, 2402, 2407, 2411, 2415, 2419-2421, 2425, 2431-2435, 2450-2454, 2466, 2472, 2475-2489, 2496-2508, 2512, 2516-2517, 2521-2524, 2527, 2531-2560, 2563-2573, 2578-2605, 2608-2610, 2613-2616, 2619-2620, 2623-2625, 2628-2647, 2650-2666, 2670-2706, 2712-2715, 2719, 2722-2806, 2812-2815, 2822-2825, 2831-2835, 2844-2847, 2850-2853, 2856-2859, 2868-2872, 2880-2884, 2890-2896, 2904-2912, 2918-2929, 2938-2965, 2970-2991, 2994-3013, 3027-3028, 3063-3071, 3075, 3079, 3083-3091, 3098-3101, 3105-3126, 3133, 3137, 3144-3149, 3155, 3160, 3164, 3169, 3173, 3177, 3181, 3186, 3190, 3195, 3202, 3212, 3216, 3220, 3233-3234, 3240-3242, 3246, 3250-3260, 3264-3282, 3287-3292, 3298-3310, 3317-3341, 3362-3410, 3418-3434, 3438, 3445-3471, 3495-3683, 3689-3743, 3750-3768, 3776-3793, 3801-3830, 3871, 3878-3958, 3969, 3989-4025, 4031-4096, 4113-4146, 4151-4206, 4219, 4223-4225, 4229-4273, 4286, 4289, 4293-4297, 4302-4316, 4326-4331, 4343, 4347, 4351-4359, 4364-4377, 4393, 4396-4404, 4409-4417, 4429-4431, 4435, 4439-4456, 4461-4465, 4472-4475, 4491-4504, 4508-4584, 4593-4617, 4622-4632, 4653-4663, 4683-4706, 4710-4714, 4718-4724, 4731-4734, 4751-4794, 4798-4807, 4822-4828, 4834-4852, 4858-4865
pandas/io/s3.py                              22     22     0%   2-39
pandas/io/sas/__init__.py                     1      0   100%
pandas/io/sas/sas.pyx                       289     64    78%   13, 28-45, 51-57, 63, 69, 75-81, 88, 93, 98, 104-105, 108-109, 117, 187, 190-191, 233, 263-265, 280, 296, 306, 318, 330-333, 341-344, 385-388, 419
pandas/io/sas/sas7bdat.py                   449     41    91%   117-118, 150, 161, 191-192, 242-243, 251-252, 260-266, 269-270, 278, 280-281, 330-331, 387, 422, 456-461, 598, 625, 635-638, 643, 647, 687-688
pandas/io/sas/sas_constants.py              106      0   100%
pandas/io/sas/sas_xport.py                  216     23    89%   124-125, 250-255, 271-272, 279-280, 293-294, 333-335, 348-349, 383, 397, 457-458
pandas/io/sas/sasreader.py                   29      4    86%   48-50, 63
pandas/io/sql.py                            608     38    94%   57-64, 70, 98, 114, 129, 252, 489-490, 510, 546, 570, 584-585, 629, 658, 784, 849, 889-891, 908, 912, 1138-1144, 1148, 1160, 1202-1203, 1221, 1376, 1400, 1433, 1495
pandas/io/stata.py                         1462     63    96%   301, 356, 411, 429-430, 451, 548-549, 654, 805, 821-828, 1007-1008, 1037, 1110-1111, 1121-1122, 1147, 1206, 1219, 1224, 1251, 1255-1256, 1260-1261, 1306, 1410, 1428, 1521, 1558-1559, 1564, 1579-1581, 1720, 1765, 1865, 1983, 2005, 2013-2016, 2214-2215, 2391-2392, 2442, 2487, 2504-2507, 2571, 2574, 2739
pandas/json.py                                3      0   100%
pandas/lib.py                                 3      0   100%
pandas/parser.py                              4      0   100%
pandas/plotting/__init__.py                   9      2    78%   19-20
pandas/plotting/_compat.py                   22      2    91%   13-14
pandas/plotting/_converter.py               693     65    91%   152, 168, 171, 176, 246, 253, 255, 260, 274, 310-311, 318, 337, 368, 374-375, 427-428, 431, 462, 483-484, 493-518, 530, 534, 537, 607, 677, 709, 711, 715, 719, 721, 723, 735, 737, 750, 768, 783, 854-858, 921-925, 1036, 1052-1059, 1099, 1120, 1123, 1130
pandas/plotting/_core.py                   1393     57    96%   45-46, 56, 70-71, 211, 367-368, 378, 413-414, 423, 761-762, 812, 929, 1010-1012, 1153, 1167-1171, 1306, 1328, 1353, 1494-1498, 1627, 1655, 1706, 1731, 1766, 1805-1806, 2220, 2302-2326, 2648
pandas/plotting/_misc.py                    277     18    94%   93-98, 143, 145, 265, 519, 527-529, 531-535
pandas/plotting/_style.py                   106     15    86%   27, 31, 41-42, 45, 57, 83-86, 134, 144-148, 162-163
pandas/plotting/_timeseries.py              194     22    89%   114, 125, 203, 209, 215, 241, 258-260, 279, 295-305, 352
pandas/plotting/_tools.py                   179     15    92%   50, 292-293, 348-356, 360-365
pandas/testing.py                             2      0   100%
pandas/tools/__init__.py                      0      0   100%
pandas/tools/merge.py                         8      8     0%   1-17
pandas/tools/plotting.py                     11      0   100%
pandas/tseries/__init__.py                    0      0   100%
pandas/tseries/api.py                         2      0   100%
pandas/tseries/converter.py                   7      0   100%
pandas/tseries/frequencies.py               122      5    96%   53-54, 144-145, 267
pandas/tseries/holiday.py                   203     14    93%   20, 35, 46, 55, 357, 376, 407, 436-437, 440, 458-462
pandas/tseries/offsets.py                  1159     33    97%   106, 244, 277, 289, 362, 420, 425-426, 432, 434, 445, 535, 684, 792, 848-852, 1044, 1078, 1082, 1296, 1455-1460, 1706, 1709, 1771, 1832, 1906, 2138, 2325
pandas/tseries/plotting.py                    1      0   100%
pandas/tslib.py                               4      0   100%
pandas/types/__init__.py                      0      0   100%
pandas/types/common.py                        3      3     0%   1-8
pandas/types/concat.py                        5      0   100%
pandas/util/__init__.py                       2      0   100%
pandas/util/_decorators.py                  124     26    79%   172-175, 190-204, 258, 268-270, 310, 361-364, 371-375, 378, 382-386
pandas/util/_depr_module.py                  43      9    79%   39-40, 50, 54-59, 79, 98
pandas/util/_doctools.py                     99     99     0%   1-163
pandas/util/_print_versions.py               70     59    16%   14-56, 60-138, 142-155
pandas/util/_test_decorators.py              82      4    95%   78, 89, 98, 106
pandas/util/_tester.py                       17     12    29%   11-22
pandas/util/_validators.py                   94      3    97%   58-63
pandas/util/decorators.py                     3      3     0%   1-8
pandas/util/testing.py                      968    132    86%   64, 69-71, 130-135, 193-194, 202-206, 333, 343, 365, 404, 410-413, 420-421, 457-458, 468, 473-474, 510-511, 566, 585, 696-704, 708-709, 713-718, 749, 753-755, 762-763, 768-769, 906-907, 950-952, 978, 1016-1019, 1247, 1255-1257, 1484, 1611, 1637, 1639, 1854, 1868, 1873, 1997, 2037-2048, 2069-2072, 2102, 2146, 2164-2170, 2269-2270, 2276, 2279, 2284-2285, 2288, 2294-2297, 2526, 2572, 2603-2627, 2682, 2732, 2767-2768, 2803
-----------------------------------------------------------------------
TOTAL                                     82317  16723    80%
```
It will be easier to tell if/when the cdef-lines issue is resolved, but tentatively it looks like a bunch of the not-hit code is generate code for uncommon dtypes.
# [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/21879?src=pr&el=h1) Report
> Merging [#21879](https://codecov.io/gh/pandas-dev/pandas/pull/21879?src=pr&el=desc) into [master](https://codecov.io/gh/pandas-dev/pandas/commit/1f6ddc4592728c1a09fc0a81ca2a00c685b60a8e?src=pr&el=desc) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/pandas-dev/pandas/pull/21879/graphs/tree.svg?width=650&height=150&src=pr&token=eZ4WkYLtcO)](https://codecov.io/gh/pandas-dev/pandas/pull/21879?src=pr&el=tree)

```diff
@@           Coverage Diff           @@
##           master   #21879   +/-   ##
=======================================
  Coverage   91.96%   91.96%           
=======================================
  Files         166      166           
  Lines       50334    50334           
=======================================
  Hits        46292    46292           
  Misses       4042     4042
```

| Flag | Coverage Δ | |
|---|---|---|
| #multiple | `90.36% <ø> (ø)` | :arrow_up: |
| #single | `42.22% <ø> (ø)` | :arrow_up: |


------

[Continue to review full report at Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/21879?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/21879?src=pr&el=footer). Last update [1f6ddc4...5582fef](https://codecov.io/gh/pandas-dev/pandas/pull/21879?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

Without cython coverage enabled, the test suite took took 29 minutes.
> Without cython coverage enabled, the test suite took took 29 minutes.

Hmm...that's awkward...can you try adding an allowed failure build to Travis to see how long it takes?
> Hmm...that's awkward...can you try adding an allowed failure build to Travis to see how long it takes?

Keep in mind this is without `--skip-slow`.  The travis.yml is outside my wheelhouse.  Little help?

Especially if this is slow, this probably isn't something to run in the CI, but something to run daily like the asvs.

@jbrockmendel : 

> The travis.yml is outside my wheelhouse. Little help?

Actually, let's cross that bridge once we have a better idea of the timing.  Could you run the tests locally with `--skip-slow`?  Perhaps we could do that on Travis, but we might consider the `pandas-ci` repo if it takes awhile (cc @jreback )
With `--skip-slow` and coverage 47 minutes.
Hmmm...I might consider this in the `pandas-ci` repository.  Not sure...

@jreback : Thoughts?
can you change so that coverage is turned off by default for cython. Then in another PR can make it depend on a env variable (how we do everything else), and then only enable in the pandas-ci build.
alternatatively could string out the coverage entirely to another PR and just do the cythonize changes here
> can you change so that coverage is turned off by default for cython. 

It is off by default as it is.


The remaining thing to do here is to go through the ext_data dict and remove pieces that are now unnecessary.  We can do that in one swoop or piece-by-piece in follow-ups.

I've gone through and removed the pxdfiles entries.  I _think_ that many of the `depends` entries are also unnecessary, but would like to save those for follow-ups so I can check more carefully.

Related: it tentatively looks like a lot of duplicate build errors, compile time, and possible even .so size are caused by using .pxd files _without_ accompanying .pyx files (util.pxd and khash.pxd mainly).  Those don't get their own .so files, so get re-compiled in every file they are used in.  (I think something similar happens for lib_depends and tseries_depends)

don't we have an issue for this? can you change the top to close it
Done.
It looks like `annotate=True` can be passed to `cythonize` to generate HTML files.  Will save for follow-up.
can you rebase again. just want to see this hit the CI after the lastest merges.
@jbrockmendel lgtm. merge on green.
i think this broke the wheel building: 
https://travis-ci.org/MacPython/pandas-wheels/builds

pls have a look
No idea why this would cause numpy deprecation warnings.