Files that are both large and changed often are where bugs tend to cluster and where refactoring pays off first. Each file in the current tree is placed by its size and by the number of commits that changed it; its hotspot score is changes × √lines. Files without counted lines, such as binary files, are left out.
Each dot is a file; a bigger dot is a higher score. The dashed lines mark the median file size and the median number of changes, so the large files that change often are in the top right. Both axes are logarithmic. Showing the 2,000 highest-scoring of 2,128 files.
The files ranked by hotspot score: the larger a file is and the more often it changes, the higher it ranks. Authors is how many people have changed the file, bots aside, as on the Code Ownership page: a hotspot only one person has changed is also a bus-factor risk.
| File | Lines | Changes | Authors | Score | |
|---|---|---|---|---|---|
| pandas/core/frame.py | 20,451 | 3,399 | 683 | 486,080.8 | |
| pandas/core/generic.py | 12,997 | 2,260 | 622 | 257,649.9 | |
| pandas/core/series.py | 10,369 | 2,159 | 388 | 219,847.3 | |
| pandas/core/indexes/base.py | 8,704 | 1,394 | 218 | 130,053.6 | |
| pandas/io/pytables.py | 6,798 | 867 | 170 | 71,484.1 | |
| pandas/core/groupby/groupby.py | 5,963 | 743 | 170 | 57,374.8 | |
| pandas/core/indexes/multi.py | 5,248 | 671 | 156 | 48,609.3 | |
| pandas/core/indexing.py | 3,985 | 764 | 153 | 48,228.9 | |
| pandas/_libs/tslibs/offsets.pyx | 8,661 | 454 | 73 | 42,251.3 | |
| pandas/core/internals/blocks.py | 2,636 | 774 | 80 | 39,738.7 |
| File | Lines | Changes | Authors | Score | |
|---|---|---|---|---|---|
| pandas/core/frame.py | 20,451 | 3,399 | 683 | 486,080.8 | |
| pandas/core/generic.py | 12,997 | 2,260 | 622 | 257,649.9 | |
| pandas/core/series.py | 10,369 | 2,159 | 388 | 219,847.3 | |
| pandas/core/indexes/base.py | 8,704 | 1,394 | 218 | 130,053.6 | |
| pandas/io/pytables.py | 6,798 | 867 | 170 | 71,484.1 | |
| pandas/core/groupby/groupby.py | 5,963 | 743 | 170 | 57,374.8 | |
| pandas/core/indexes/multi.py | 5,248 | 671 | 156 | 48,609.3 | |
| pandas/core/indexing.py | 3,985 | 764 | 153 | 48,228.9 | |
| pandas/_libs/tslibs/offsets.pyx | 8,661 | 454 | 73 | 42,251.3 | |
| pandas/core/internals/blocks.py | 2,636 | 774 | 80 | 39,738.7 | |
| pandas/core/groupby/generic.py | 4,351 | 585 | 117 | 38,587.8 | |
| pandas/core/arrays/categorical.py | 3,410 | 563 | 128 | 32,876.5 | |
| doc/source/whatsnew/v3.1.0.rst | 1,480 | 828 | 102 | 31,853.8 | |
| pandas/core/arrays/datetimes.py | 3,264 | 556 | 98 | 31,765.1 | |
| pandas/core/arrays/datetimelike.py | 2,558 | 588 | 79 | 29,739.1 | |
| pandas/core/indexes/datetimes.py | 2,912 | 533 | 112 | 28,762.3 | |
| pandas/core/internals/managers.py | 2,637 | 540 | 53 | 27,729.9 | |
| doc/source/whatsnew/v3.0.0.rst | 1,645 | 633 | 180 | 25,673.6 | |
| pandas/core/arrays/arrow/array.py | 4,790 | 367 | 48 | 25,400.0 | |
| pandas/io/formats/style.py | 4,635 | 367 | 119 | 24,985.7 | |
| pandas/core/algorithms.py | 2,023 | 544 | 134 | 24,467.9 | |
| pandas/tests/frame/test_constructors.py | 3,597 | 402 | 99 | 24,109.9 | |
| pandas/tests/groupby/test_groupby.py | 3,148 | 415 | 105 | 23,284.4 | |
| doc/source/user_guide/io.rst | 6,746 | 283 | 117 | 23,243.9 | |
| pandas/io/stata.py | 3,996 | 360 | 102 | 22,757.0 | |
| pandas/core/reshape/merge.py | 3,399 | 388 | 112 | 22,620.8 | |
| pandas/core/dtypes/cast.py | 1,956 | 503 | 79 | 22,246.0 | |
| pandas/_libs/lib.pyx | 3,651 | 364 | 80 | 21,994.2 | |
| pandas/_libs/tslibs/timestamps.pyx | 4,112 | 338 | 90 | 21,674.2 | |
| pandas/tests/indexing/test_loc.py | 4,427 | 321 | 80 | 21,358.0 | |
| pandas/io/sql.py | 3,081 | 378 | 134 | 20,981.6 | |
| pandas/core/base.py | 1,725 | 504 | 136 | 20,932.7 | |
| pandas/core/resample.py | 3,249 | 367 | 107 | 20,919.0 | |
| doc/source/whatsnew/v2.0.0.rst | 1,487 | 531 | 66 | 20,476.2 | |
| pandas/core/arrays/base.py | 3,448 | 327 | 70 | 19,201.3 | |
| pandas/core/common.py | 732 | 702 | 112 | 18,993.0 | |
| pandas/_libs/tslibs/timedeltas.pyx | 3,425 | 323 | 87 | 18,903.1 | |
| pandas/core/indexes/datetimelike.py | 1,684 | 455 | 65 | 18,671.6 | |
| pandas/tests/io/test_sql.py | 4,809 | 267 | 73 | 18,515.6 | |
| pandas/_libs/tslibs/period.pyx | 3,691 | 304 | 56 | 18,469.1 | |
| pandas/tests/indexes/test_base.py | 1,996 | 400 | 81 | 17,870.6 | |
| pandas/core/window/rolling.py | 3,608 | 290 | 69 | 17,419.3 | |
| pandas/conftest.py | 2,142 | 376 | 82 | 17,401.9 | |
| pandas/core/indexes/interval.py | 1,861 | 387 | 76 | 16,694.9 | |
| pandas/tests/series/test_constructors.py | 2,348 | 344 | 80 | 16,668.9 | |
| doc/source/whatsnew/v1.3.0.rst | 1,344 | 451 | 89 | 16,533.9 | |
| pandas/core/arrays/sparse/array.py | 3,206 | 291 | 57 | 16,476.9 | |
| pandas/core/nanops.py | 2,205 | 350 | 81 | 16,435.1 | |
| pandas/core/dtypes/dtypes.py | 2,584 | 317 | 79 | 16,114.1 | |
| pandas/tests/test_algos.py | 2,369 | 322 | 80 | 15,672.5 | |
| pandas/tests/tools/test_to_datetime.py | 5,036 | 220 | 57 | 15,612.3 | |
| doc/source/whatsnew/v1.1.0.rst | 1,440 | 409 | 133 | 15,520.5 | |
| pandas/io/formats/format.py | 2,208 | 329 | 107 | 15,459.5 | |
| pandas/_libs/parsers.pyx | 4,611 | 227 | 51 | 15,414.3 | |
| doc/source/whatsnew/v1.4.0.rst | 1,182 | 422 | 105 | 14,508.5 | |
| pandas/tests/io/json/test_pandas.py | 2,858 | 271 | 76 | 14,487.7 | |
| doc/source/whatsnew/v1.0.0.rst | 1,402 | 386 | 126 | 14,453.1 | |
| pandas/core/arrays/period.py | 1,709 | 345 | 65 | 14,262.3 | |
| pandas/core/groupby/ops.py | 1,522 | 351 | 59 | 13,693.5 | |
| doc/source/whatsnew/v1.5.0.rst | 1,364 | 370 | 97 | 13,665.0 | |
| pixi.lock | 74,635 | 50 | 6 | 13,659.7 | |
| pandas/io/parsers/readers.py | 3,743 | 218 | 61 | 13,337.3 | |
| pandas/plotting/_core.py | 2,548 | 254 | 128 | 12,821.3 | |
| pandas/core/indexes/period.py | 1,238 | 360 | 73 | 12,666.7 | |
| doc/source/whatsnew/v0.25.0.rst | 1,423 | 334 | 126 | 12,599.4 | |
| pandas/core/arrays/timedeltas.py | 1,475 | 319 | 49 | 12,251.4 | |
| pandas/core/arrays/interval.py | 1,963 | 273 | 63 | 12,095.5 | |
| pandas/core/apply.py | 2,418 | 245 | 62 | 12,047.4 | |
| pandas/core/indexes/range.py | 1,700 | 290 | 58 | 11,957.0 | |
| pandas/core/dtypes/common.py | 2,004 | 266 | 76 | 11,907.8 | |
| pandas/tests/reshape/test_pivot.py | 3,340 | 203 | 67 | 11,731.9 | |
| pandas/tests/reshape/merge/test_merge.py | 3,566 | 196 | 65 | 11,704.3 | |
| pandas/core/strings/accessor.py | 4,959 | 166 | 63 | 11,689.7 | |
| doc/source/whatsnew/v2.1.0.rst | 956 | 377 | 72 | 11,656.6 | |
| pyproject.toml | 725 | 422 | 80 | 11,362.7 | |
| pandas/core/arrays/masked.py | 2,294 | 235 | 36 | 11,255.5 | |
| pandas/io/excel/_base.py | 2,001 | 248 | 95 | 11,093.7 | |
| pandas/tests/extension/test_arrow.py | 1,075 | 338 | 49 | 11,082.1 | |
| pandas/core/tools/datetimes.py | 1,591 | 274 | 80 | 10,929.1 | |
| doc/source/whatsnew/v0.24.0.rst | 2,153 | 228 | 93 | 10,579.3 | |
| doc/source/whatsnew/v1.2.0.rst | 941 | 342 | 82 | 10,491.1 | |
| pandas/tests/io/formats/test_format.py | 2,490 | 204 | 77 | 10,179.6 | |
| pandas/tests/io/test_parquet.py | 1,716 | 243 | 61 | 10,066.2 | |
| pandas/core/indexes/category.py | 1,104 | 298 | 52 | 9,901.5 | |
| pandas/plotting/_matplotlib/core.py | 2,431 | 200 | 67 | 9,861.0 | |
| pandas/tests/frame/test_reductions.py | 3,391 | 169 | 26 | 9,841.3 | |
| pandas/_libs/groupby.pyx | 2,449 | 193 | 46 | 9,551.1 | |
| pandas/io/common.py | 1,453 | 249 | 92 | 9,491.4 | |
| pandas/tests/io/test_stata.py | 2,818 | 176 | 46 | 9,342.9 | |
| pandas/tests/dtypes/test_inference.py | 2,262 | 196 | 61 | 9,321.9 | |
| pandas/tests/arithmetic/test_datetime64.py | 2,700 | 179 | 31 | 9,301.1 | |
| pandas/core/indexes/timedeltas.py | 1,079 | 280 | 52 | 9,197.5 | |
| pandas/tests/arithmetic/test_timedelta64.py | 2,629 | 173 | 28 | 8,870.4 | |
| pandas/tests/frame/test_arithmetic.py | 2,494 | 172 | 44 | 8,589.7 | |
| pandas/tests/groupby/test_categorical.py | 2,355 | 177 | 59 | 8,589.5 | |
| doc/source/whatsnew/v2.2.0.rst | 987 | 269 | 50 | 8,451.1 | |
| pandas/io/json/_json.py | 1,886 | 194 | 77 | 8,425.1 | |
| pandas/tests/indexing/test_iloc.py | 2,478 | 168 | 51 | 8,363.0 | |
| pandas/tests/plotting/test_datetimelike.py | 2,538 | 166 | 42 | 8,362.8 | |
| pandas/tests/frame/indexing/test_indexing.py | 2,006 | 186 | 41 | 8,330.6 |