Skip to content

[BLD] enable cython coverage, use cythonize #21879

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Jul 20, 2018

Conversation

jbrockmendel
Copy link
Member

@jbrockmendel jbrockmendel commented Jul 12, 2018

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.

@@ -534,8 +582,7 @@ def pxd(name):
'depends': _pxi_dep['sparse']},
'_libs.tslib': {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For demonstration purposes: note that util has been removed entirely from the pxdfiles entries for tslib/tslibs (as opposed to changed to _libs/util). If you go and edit tslibs/util.pxd and re-run build_ext, you'll messages to the effect of:

Compiling pandas/_libs/tslibs/resolution.pyx because it depends on ./pandas/_libs/tslibs/util.pxd.
Compiling pandas/_libs/algos.pyx because it depends on ./pandas/_libs/tslibs/util.pxd.
Compiling pandas/_libs/tslibs/nattype.pyx because it depends on ./pandas/_libs/tslibs/util.pxd.
[...]

@jbrockmendel
Copy link
Member Author

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%

@jbrockmendel
Copy link
Member Author

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
Copy link

codecov bot commented Jul 12, 2018

Codecov Report

Merging #21879 into master will not change coverage.
The diff coverage is n/a.

Impacted file tree graph

@@           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% <ø> (ø) ⬆️
#single 42.22% <ø> (ø) ⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 1f6ddc4...5582fef. Read the comment docs.

@jbrockmendel
Copy link
Member Author

Without cython coverage enabled, the test suite took took 29 minutes.

@gfyoung gfyoung added Testing pandas testing functions or related to the test suite Build Library building on various platforms Internals Related to non-user accessible pandas implementation labels Jul 12, 2018
@gfyoung
Copy link
Member

gfyoung commented Jul 12, 2018

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?

@jbrockmendel
Copy link
Member Author

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.

@gfyoung
Copy link
Member

gfyoung commented Jul 12, 2018

@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 )

@jbrockmendel
Copy link
Member Author

With --skip-slow and coverage 47 minutes.

@gfyoung
Copy link
Member

gfyoung commented Jul 12, 2018

Hmmm...I might consider this in the pandas-ci repository. Not sure...

@jreback : Thoughts?

@jreback
Copy link
Contributor

jreback commented Jul 14, 2018

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.

@jreback
Copy link
Contributor

jreback commented Jul 14, 2018

alternatatively could string out the coverage entirely to another PR and just do the cythonize changes here

@jbrockmendel
Copy link
Member Author

can you change so that coverage is turned off by default for cython.

It is off by default as it is.

@jbrockmendel
Copy link
Member Author

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.

@jbrockmendel
Copy link
Member Author

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)

setup.py Outdated

# enable coverage by building cython files by setting the environment variable
# "linetrace" (with a Truthy value)
linetrace = os.environ.get('linetrace', False)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah this need to be uppercase and should be like PANDAS_CYTHON_COVERAGE or somesuch

@jreback jreback added this to the 0.24.0 milestone Jul 16, 2018
@jreback
Copy link
Contributor

jreback commented Jul 16, 2018

don't we have an issue for this? can you change the top to close it

@jbrockmendel
Copy link
Member Author

Done.

@jbrockmendel
Copy link
Member Author

It looks like annotate=True can be passed to cythonize to generate HTML files. Will save for follow-up.

@jreback
Copy link
Contributor

jreback commented Jul 20, 2018

can you rebase again. just want to see this hit the CI after the lastest merges.

setup.py Outdated
# "PANDAS_CYTHON_COVERAGE" (with a Truthy value)
linetrace = os.environ.get('PANDAS_CYTHON_COVERAGE', False)
CYTHON_TRACE = str(int(bool(linetrace)))
# TODO: Maybe make this a CLI option for build_ext?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you create an issue for this

@jreback
Copy link
Contributor

jreback commented Jul 20, 2018

@jbrockmendel lgtm. merge on green.

@jbrockmendel jbrockmendel merged commit df2ccef into pandas-dev:master Jul 20, 2018
@jbrockmendel jbrockmendel deleted the cysetup2 branch July 20, 2018 20:28
@jreback
Copy link
Contributor

jreback commented Jul 22, 2018

i think this broke the wheel building:
https://travis-ci.org/MacPython/pandas-wheels/builds

pls have a look

@jbrockmendel
Copy link
Member Author

No idea why this would cause numpy deprecation warnings.

Sup3rGeo pushed a commit to Sup3rGeo/pandas that referenced this pull request Oct 1, 2018
* enable cython coverage, use cythonize

* coverage misreporting workaround

* lint cleanups

* post-merge cleanup

* remove unnecessary pxdfiles

* fix signature of dummy cythonize

* change env variable

* remove comment, making an issue for it
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Build Library building on various platforms Internals Related to non-user accessible pandas implementation Testing pandas testing functions or related to the test suite
Projects
None yet
Development

Successfully merging this pull request may close these issues.

BLD: tslib dependencies not fully specified BUG: Panel.fillna() ignores inplace=True
3 participants