StreetComplete Statistics

Analysis of OpenStreetMap contributions using StreetComplete, a mobile mapping application.

Monthly Total and Percent of Edits and Contributors Using StreetComplete

code
# Monthly StreetComplete statistics with totals and percentages
df_monthly = duckdb.sql("""
WITH monthly_total AS (
    SELECT 
        year,
        month,
        CONCAT(year, '-', LPAD(CAST(month as VARCHAR), 2, '0')) as months,
        COUNT(DISTINCT user_name) as total_contributors,
        CAST(SUM(edit_count) as BIGINT) as total_edits
    FROM '../changeset_data/year=*/month=*/*.parquet'
    GROUP BY year, month
),
monthly_streetcomplete AS (
    SELECT 
        year,
        month,
        CONCAT(year, '-', LPAD(CAST(month as VARCHAR), 2, '0')) as months,
        COUNT(DISTINCT user_name) as sc_contributors,
        CAST(SUM(edit_count) as BIGINT) as sc_edits
    FROM '../changeset_data/year=*/month=*/*.parquet'
    WHERE created_by = 'StreetComplete'
    GROUP BY year, month
)
SELECT 
    mt.months,
    mt.total_contributors as "Total Contributors",
    COALESCE(msc.sc_contributors, 0) as "StreetComplete Contributors",
    mt.total_edits as "Total Edits",
    COALESCE(msc.sc_edits, 0) as "StreetComplete Edits",
    ROUND((COALESCE(msc.sc_contributors, 0) * 100.0) / mt.total_contributors, 2) as "Percent Contributors using StreetComplete",
    ROUND((COALESCE(msc.sc_edits, 0) * 100.0) / mt.total_edits, 2) as "Percent Edits from StreetComplete"
FROM monthly_total mt
LEFT JOIN monthly_streetcomplete msc ON mt.year = msc.year AND mt.month = msc.month
ORDER BY mt.year, mt.month
""").df()

util.show_figure(
    [
        util.FigureConfig(
            title="Monthly StreetComplete Edits",
            label="Total Edits",
            x_col="months",
            y_col="StreetComplete Edits",
            query_or_df=df_monthly,
        ),
        util.FigureConfig(
            title="Percentage of Edits from StreetComplete",
            label="Edits Percentage",
            x_col="months",
            y_col="Percent Edits from StreetComplete",
            y_unit_hover_template="%",
            query_or_df=df_monthly,
        ),
        util.FigureConfig(
            title="Monthly StreetComplete Contributors",
            label="Total Contributors",
            x_col="months",
            y_col="StreetComplete Contributors",
            query_or_df=df_monthly,
        ),
        util.FigureConfig(
            title="Percentage of Contributors using StreetComplete",
            label="Contributors Percentage",
            x_col="months",
            y_col="Percent Contributors using StreetComplete",
            y_unit_hover_template="%",
            query_or_df=df_monthly,
        ),
    ]
)

Yearly Edits and Contributors for Each StreetComplete Quest

code
# Yearly breakdown by StreetComplete quest types
query_yearly_quests = """
WITH user_first_year AS (
    SELECT 
        user_name,
        streetcomplete_quest,
        MIN(year) as first_year
    FROM '../changeset_data/year=*/month=*/*.parquet'
    WHERE streetcomplete_quest IS NOT NULL AND created_by = 'StreetComplete'
    GROUP BY user_name, streetcomplete_quest
),
quest_totals AS (
    SELECT
        streetcomplete_quest as "StreetComplete Quest",
        CAST(SUM(edit_count) as BIGINT) as total_edits_all_time,
        CAST(SUM(CASE WHEN year >= 2021 THEN edit_count ELSE 0 END) as BIGINT) as total_edits_2021_now,
        CAST(COUNT(DISTINCT user_name) as BIGINT) as total_contributors_all_time,
        CAST(COUNT(DISTINCT CASE WHEN year >= 2021 THEN user_name END) as BIGINT) as total_contributors_2021_now
    FROM '../changeset_data/year=*/month=*/*.parquet'
    WHERE streetcomplete_quest IS NOT NULL AND created_by = 'StreetComplete'
    GROUP BY streetcomplete_quest
),
yearly_metrics AS (
    SELECT
        d.year,
        d.streetcomplete_quest as "StreetComplete Quest",
        CAST(SUM(d.edit_count) as BIGINT) as "Edits",
        CAST(COUNT(DISTINCT d.user_name) as BIGINT) as "Contributors",
        CAST(COUNT(DISTINCT CASE WHEN ufy.first_year = d.year THEN d.user_name END) as BIGINT) as "New Contributors"
    FROM '../changeset_data/year=*/month=*/*.parquet' d
    LEFT JOIN user_first_year ufy 
        ON d.user_name = ufy.user_name AND d.streetcomplete_quest = ufy.streetcomplete_quest
    WHERE d.streetcomplete_quest IS NOT NULL  AND created_by = 'StreetComplete'
    GROUP BY d.year, d.streetcomplete_quest
)
SELECT 
    ym.year,
    ym."StreetComplete Quest",
    ym."Edits",
    ym."New Contributors",
    ym."Contributors",
    qt.total_edits_all_time as "Total Edits",
    qt.total_edits_2021_now as "Total Edits (2021 - Now)",
    qt.total_contributors_all_time as "Total Contributors",
    qt.total_contributors_2021_now as "Total Contributors (2021 - Now)"
FROM yearly_metrics ym
JOIN quest_totals qt
    ON ym."StreetComplete Quest" = qt."StreetComplete Quest"
ORDER BY year DESC, "Edits" DESC
"""

df_yearly_quests = duckdb.sql(query_yearly_quests).df()

# Get all StreetComplete quests
all_contributors = df_yearly_quests.groupby("StreetComplete Quest")["Total Contributors"].first()
all_contributors_2021_now = df_yearly_quests.groupby("StreetComplete Quest")["Total Contributors (2021 - Now)"].first()
all_edits = df_yearly_quests.groupby("StreetComplete Quest")["Total Edits"].first()
all_edits_2021_now = df_yearly_quests.groupby("StreetComplete Quest")["Total Edits (2021 - Now)"].first()

table_configs = [
    util.TableConfig(
        title="All StreetComplete Quests by Edits (All Time)",
        query_or_df=df_yearly_quests[df_yearly_quests["StreetComplete Quest"].isin(all_edits.index)],
        x_axis_col="year",
        y_axis_col="StreetComplete Quest",
        value_col="Edits",
        center_columns=["Rank", "StreetComplete Quest"],
        sum_col="Total Edits",
    ),
    util.TableConfig(
        title="All StreetComplete Quests by Edits (2021 - Now)",
        query_or_df=df_yearly_quests[
            (df_yearly_quests["StreetComplete Quest"].isin(all_edits_2021_now.index))
            & (df_yearly_quests["year"] >= 2021)
        ],
        x_axis_col="year",
        y_axis_col="StreetComplete Quest",
        value_col="Edits",
        center_columns=["Rank", "StreetComplete Quest"],
        sum_col="Total Edits (2021 - Now)",
    ),
    util.TableConfig(
        title="All StreetComplete Quests by Contributors (All Time)",
        query_or_df=df_yearly_quests[df_yearly_quests["StreetComplete Quest"].isin(all_contributors.index)],
        x_axis_col="year",
        y_axis_col="StreetComplete Quest",
        value_col="Contributors",
        center_columns=["Rank", "StreetComplete Quest"],
        sum_col="Total Contributors",
    ),
    util.TableConfig(
        title="All StreetComplete Quests by Contributors (2021 - Now)",
        query_or_df=df_yearly_quests[
            (df_yearly_quests["StreetComplete Quest"].isin(all_contributors_2021_now.index))
            & (df_yearly_quests["year"] >= 2021)
        ],
        x_axis_col="year",
        y_axis_col="StreetComplete Quest",
        value_col="Contributors",
        center_columns=["Rank", "StreetComplete Quest"],
        sum_col="Total Contributors (2021 - Now)",
    ),
]

util.show_tables(table_configs)
Rank StreetComplete Quest 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 Total Edits
1 AddRoadSurface 0 699,689 534,690 428,070 495,755 1,268,801 1,372,576 1,295,203 1,097,473 1,004,706 718,486 8,915,449
2 AddBuildingType 0 0 216,587 277,087 629,114 1,734,569 1,569,203 1,844,920 424,202 200,073 133,810 7,029,565
3 AddPathSurface 0 0 42,597 147,386 305,052 945,990 792,385 770,873 696,578 718,132 564,350 4,983,343
4 AddBuildingLevels 0 84,190 137,679 159,553 396,895 1,191,453 925,245 666,977 367,324 255,946 147,190 4,332,452
5 AddWayLit 0 108,264 226,736 300,578 484,734 1,254,731 830,955 268,971 181,533 196,161 129,517 3,982,180
6 AddRoofShape 0 20,325 53,298 64,678 175,129 859,815 479,642 514,202 300,123 199,564 114,267 2,781,043
7 AddLanes 0 30 4 0 86,518 360,137 325,064 462,378 620,850 523,541 104,811 2,483,333
8 WayLitOverlay 0 0 0 0 0 0 297,388 564,698 701,792 505,429 405,635 2,474,942
9 AddHousenumber 0 22,274 41,388 46,692 140,891 449,951 373,106 363,683 274,675 265,884 192,565 2,171,109
10 SurfaceOverlay 0 0 0 0 0 0 2 385,762 576,655 547,250 404,254 1,913,923
11 AddTactilePavingCrosswalk 0 24,245 32,007 40,078 69,991 247,461 255,770 287,829 301,583 273,678 209,502 1,742,144
12 AddCycleway 0 33,375 69,445 41,524 103,286 420,511 407,895 94,324 128,611 82,114 232,814 1,613,899
13 BuildingsOverlay 0 0 0 0 0 0 0 0 712,219 597,548 293,596 1,603,363
14 AddSidewalk 0 42 0 33,321 75,386 470,991 355,272 95,050 108,272 87,934 288,874 1,515,142
15 SidewalkOverlay 0 0 0 0 0 0 264,840 394,832 364,794 285,274 197,772 1,507,512
16 AddAddressStreet 0 0 2 0 82,161 272,681 290,402 301,677 212,892 188,979 135,195 1,483,989
17 AddOpeningHours 51 34,486 26,123 29,430 47,722 127,157 159,243 188,509 207,243 223,399 184,894 1,228,257
18 AddRoadSmoothness 0 0 0 0 0 2,545 322,810 293,140 222,317 205,618 134,546 1,180,976
19 AddCrossingIsland 0 0 0 0 22,171 202,473 171,395 191,628 203,887 188,316 143,999 1,123,869
20 CyclewayOverlay 0 0 0 0 0 0 56,675 340,081 264,068 204,940 159,652 1,025,416
21 ThingsOverlay 0 0 0 0 0 0 0 0 270,984 379,936 335,173 986,093
22 AddPathSmoothness 0 0 0 0 0 1,980 212,163 192,632 161,298 149,350 104,020 821,443
23 CheckExistence 0 0 0 0 7,348 164,173 105,927 117,287 122,626 149,961 136,402 803,724
24 AddressOverlay 0 0 0 0 0 0 25,568 179,805 168,816 213,141 202,389 789,719
25 AddBusStopShelter 0 23,562 17,436 20,509 27,122 88,251 113,782 145,409 122,799 114,852 95,703 769,425
26 AddBinStatusOnBusStop 0 0 0 0 0 88,167 149,902 167,280 137,911 118,635 88,349 750,244
27 AddMaxSpeed 0 115,619 121,007 39,269 52,261 76,950 73,380 79,061 63,297 49,262 34,486 704,592
28 AddBenchStatusOnBusStop 0 0 0 0 18,642 102,800 123,969 146,966 121,991 108,371 81,271 704,010
29 AddBenchBackrest 0 0 4,472 10,399 22,578 98,042 99,346 96,556 120,618 132,867 113,484 698,362
30 AddTactilePavingBusStop 0 10,678 16,462 20,403 29,125 103,271 94,820 107,197 96,122 87,343 64,589 630,010
31 StreetParkingOverlay 0 0 0 0 0 0 118,759 183,457 145,473 105,726 69,185 622,600
32 AddBusStopLit 0 0 0 0 0 74,016 124,249 132,732 109,629 100,008 74,383 615,017
33 AddParkingAccess 0 0 18,103 46,664 83,880 111,953 74,965 75,448 72,547 69,807 56,623 609,990
34 AddParkingType 0 4,608 16,574 25,082 45,763 90,363 92,049 103,985 87,496 78,938 59,345 604,203
35 AddForestLeafType 0 0 0 4,096 23,485 90,377 82,024 91,851 84,755 87,260 74,711 538,559
36 CheckShopExistence 0 0 0 0 0 0 0 101,804 138,866 152,371 134,960 528,001
37 AddCrossingType 0 10,158 27,320 34,726 47,463 120,196 114,368 140,526 21,942 51 5 516,755
38 AddTactilePavingKerb 0 0 0 0 4,514 45,614 48,566 84,847 108,289 114,180 104,491 510,501
39 AddTreeLeafType 0 0 0 0 0 0 0 0 129,776 229,536 150,566 509,878
40 AddParkingFee 0 0 11,451 27,191 48,498 85,785 70,693 71,573 70,316 67,735 51,846 505,088
41 AddKerbHeight 0 0 0 0 3,746 43,365 47,869 92,773 102,176 112,513 97,099 499,541
42 AddRoadName 34 40,585 28,931 30,785 50,941 58,076 58,299 52,414 47,906 46,846 48,837 463,654
43 AddPowerPolesMaterial 0 735 2,783 4,036 10,680 57,791 83,199 101,916 96,076 46,941 58,667 462,824
44 AddHandrail 0 0 0 4,738 20,782 68,549 83,041 75,749 68,022 63,432 52,192 436,505
45 AddLaneMarkings 0 0 0 0 0 0 0 0 0 55,193 369,661 424,854
46 AddStepsRamp 0 0 0 0 15,388 84,545 81,850 77,591 51,264 50,206 42,732 403,576
47 AddTrafficSignalsButton 0 0 874 15,191 22,432 63,801 63,353 66,032 61,514 59,768 46,152 399,117
48 AddSidewalkSurface 0 0 0 0 3 0 102,399 103,634 70,026 60,170 40,276 376,508
49 AddTrafficSignalsSound 0 0 1,014 14,662 22,378 60,644 55,381 60,540 58,837 59,272 43,420 376,148
50 AddCrossingSignals 0 0 0 0 0 0 0 0 141,094 138,144 94,800 374,038
51 AddTrafficSignalsVibration 0 0 0 0 16,074 64,750 51,071 50,743 48,657 48,460 41,807 321,562
52 AddCrossingKerbHeight 0 0 0 0 0 0 0 51,616 112,242 89,037 57,570 310,465
53 AddPlaceName 0 304 0 15,109 30,907 38,500 38,329 42,972 46,931 47,202 43,278 303,532
54 AddStepsIncline 0 0 0 0 9,585 51,671 54,550 52,675 50,377 46,002 37,598 302,458
55 AddCrossing 0 0 0 0 0 16,551 33,099 55,423 79,808 59,591 42,374 286,846
56 AddTracktype 0 0 418 7,528 16,110 39,851 40,547 47,126 43,611 51,002 37,532 283,725
57 AddWheelchairAccessBusiness 0 10,024 9,096 11,471 19,141 35,588 43,086 51,274 46,530 28,385 21,247 275,842
58 AddFireHydrantPosition 0 0 0 0 0 59 57,969 42,369 61,194 61,126 50,020 272,737
59 AddCrossingMarkings 0 0 0 0 0 0 0 0 98,714 92,919 68,935 260,568
60 AddStepCount 0 0 0 0 7,322 44,508 44,260 43,278 41,809 40,816 34,788 256,781
61 AddTactilePavingSteps 0 0 0 0 0 0 0 76,534 69,879 55,457 41,739 243,609
62 PlacesOverlay 0 0 0 0 0 0 0 0 72,925 94,944 69,119 236,988
63 AddMaxHeight 0 0 1,868 5,488 7,681 36,673 37,162 41,078 36,097 33,358 23,351 222,756
64 AddBikeParkingCover 0 1,884 3,930 5,508 8,287 26,146 29,027 30,956 37,482 38,893 30,109 212,222
65 AddRoadWidth 0 0 0 0 0 0 46,174 55,164 67,636 31,993 3,723 204,690
66 AddPowerAttachment 0 0 0 0 0 0 0 0 7,128 120,646 71,068 198,842
67 AddBikeParkingCapacity 0 2,551 3,423 3,486 7,006 22,761 21,139 24,222 35,838 41,426 22,363 184,215
68 AddShoulder 0 0 0 0 0 11 182,151 1,317 173 0 0 183,652
69 AddPlaygroundAccess 0 0 2,139 7,281 11,534 37,451 30,297 29,264 24,951 22,756 17,118 182,791
70 AddSeating 0 0 0 0 0 0 26,879 46,024 47,285 31,983 23,717 175,888
71 AddCyclewaySegregation 0 0 1,899 7,571 8,324 24,265 25,251 26,219 26,624 25,278 20,222 165,653
72 AddPitchLit 0 0 0 0 0 25,420 28,134 26,349 25,982 28,720 26,765 161,370
73 MarkCompletedHighwayConstruction 0 0 2,055 3,857 7,541 31,096 28,497 21,204 23,835 23,265 16,491 157,841
74 AddPitchSurface 0 0 0 0 53 34,837 25,065 24,335 23,551 23,698 20,424 151,963
75 AddBikeParkingType 0 0 2,354 4,186 5,853 17,705 18,092 16,551 25,613 27,758 21,719 139,831
76 AddFireHydrantType 0 322 472 1,394 2,345 9,705 17,416 11,028 29,560 31,850 26,085 130,177
77 AddMaxWeight 0 0 0 929 6,549 20,533 22,185 23,846 19,957 18,061 14,601 126,661
78 AddProhibitedForPedestrians 0 0 0 5,960 7,073 24,434 21,020 19,558 17,848 12,754 15,942 124,589
79 AddRailwayCrossingBarrier 0 0 7,177 9,169 5,402 12,862 22,777 20,605 17,278 15,465 11,217 121,952
80 AddBollardType 0 0 0 0 0 19,423 25,865 23,350 19,807 18,671 14,226 121,342
81 AddFootwayPartSurface 0 0 0 1,830 9,430 25,872 21,511 17,680 15,247 15,153 10,799 117,522
82 AddRecyclingContainerMaterials 0 0 0 15 5,128 11,993 13,530 16,733 22,753 25,623 19,446 115,221
83 AddCyclewayPartSurface 0 0 0 1,988 10,379 25,372 19,188 16,427 14,248 14,130 10,154 111,886
84 AddPostboxCollectionTimes 0 0 2,074 3,113 5,486 15,814 9,818 11,348 15,096 15,801 13,003 91,553
85 AddFireHydrantDiameter 0 0 0 0 0 2,811 16,208 10,639 18,466 22,990 19,829 90,943
86 AddAmenityCover 0 0 0 0 0 0 0 12,724 23,664 27,727 23,210 87,325
87 AddBridgeStructure 0 0 528 1,204 1,939 11,218 15,772 14,817 13,585 12,722 11,769 83,554
88 ShopsOverlay 0 0 0 0 0 0 7,463 54,080 14,481 1 0 76,025
89 AddCyclewayWidth 0 0 0 0 0 0 10,335 14,388 13,547 17,666 16,533 72,469
90 AddOneway 0 0 2,424 2,639 3,383 773 13,447 14,254 15,842 12,401 6,463 71,626
91 AddVegetarian 0 341 2,575 3,323 4,210 6,794 10,085 11,143 10,303 8,072 6,638 63,484
92 CheckShopType 0 0 0 0 160 4,031 6,068 8,938 12,128 14,949 13,573 59,847
93 AddHairdresserCustomers 0 0 0 0 0 0 0 16,910 17,461 14,045 9,979 58,395
94 AddBoardType 0 0 0 0 962 6,336 6,709 6,855 10,400 13,002 11,406 55,670
95 AddEntrance 0 0 0 0 0 0 11,537 15,179 10,702 9,577 7,825 54,820
96 AddDrinkingWaterType 0 0 0 0 0 0 4,114 15,147 13,206 12,427 8,975 53,869
97 AddToiletsFee 0 466 459 725 1,236 7,160 9,145 8,904 8,804 8,802 7,114 52,815
98 AddAcceptsCards 0 0 0 0 0 0 12,639 13,023 10,871 8,650 7,220 52,403
99 MarkCompletedBuildingConstruction 0 0 215 867 1,435 7,318 8,926 9,641 8,312 7,348 6,426 50,488
100 AddIsAmenityIndoor 0 0 0 0 0 0 0 4,689 15,215 14,506 11,225 45,635
101 AddBusStopName 0 0 545 1,623 3,623 4,711 3,249 11,727 7,030 6,503 4,972 43,983
102 AddWheelchairAccessToilets 0 0 0 408 1,154 5,772 6,194 6,839 8,037 8,249 6,550 43,203
103 AddAirCompressor 0 0 0 0 0 0 9,702 10,913 9,411 7,286 5,814 43,126
104 AddBarrierOpening 0 0 0 0 0 0 0 0 8,014 19,513 14,850 42,377
105 AddBicycleBarrierType 0 0 0 0 0 1,663 10,970 8,309 7,687 6,653 4,636 39,918
106 AddSmoking 0 0 0 0 0 0 7,459 8,989 8,624 8,292 3,979 37,343
107 AddSport 0 2,379 1,615 1,795 2,830 4,852 3,718 4,020 3,628 3,254 3,593 31,684
108 AddBicycleBarrierInstallation 0 0 0 0 0 0 2,648 9,426 7,301 6,347 4,523 30,245
109 AddGeneralFee 0 0 0 133 511 2,487 4,183 4,152 4,492 6,331 7,336 29,625
110 AddVegan 0 135 911 1,053 1,451 2,890 4,922 5,571 5,362 3,818 2,848 28,961
111 AddPicnicTableCover 0 0 0 0 0 4,681 18,479 5,535 41 0 0 28,736
112 AddAirConditioning 0 0 0 0 0 0 5,049 6,998 7,311 5,119 4,148 28,625
113 AddMemorialType 0 0 0 0 0 0 5,594 7,170 5,821 4,974 4,005 27,564
114 AddWheelchairAccessPublicTransport 0 615 711 832 965 3,968 4,096 4,034 3,740 3,778 3,319 26,058
115 AddFireHydrantRef 0 0 0 0 0 0 1,128 6,197 6,773 7,154 4,431 25,683
116 AddRecyclingType 0 4,149 4,789 2,772 1,878 2,921 2,467 2,071 1,942 1,453 930 25,372
117 AddAtmCashIn 0 0 0 0 0 0 2,831 7,472 5,493 4,948 3,874 24,618
118 AddEntranceReference 0 0 0 0 0 0 7,599 7,672 4,355 2,458 1,795 23,879
119 AddBoardName 0 0 0 0 0 0 0 0 2,602 11,463 8,835 22,900
120 AddToiletAvailability 0 93 315 505 575 2,200 2,953 4,480 4,082 3,713 3,290 22,206
121 CheckOpeningHoursSigned 0 0 0 0 0 0 2,946 5,156 6,268 3,274 4,561 22,205
122 AddChargingStationCapacity 0 0 0 0 308 2,152 2,269 2,654 4,044 4,556 2,956 18,939
123 AddBabyChangingTable 0 229 211 277 361 1,583 2,530 3,202 2,999 4,348 2,962 18,702
124 AddBikeRentalType 0 0 0 0 0 0 6,004 4,478 2,602 2,105 1,641 16,830
125 DetailRoadSurface 0 0 0 0 16,633 93 0 3 0 0 0 16,729
126 AddCarWashType 0 38 207 244 433 2,389 3,276 3,084 2,562 2,398 1,783 16,414
127 AddBusStopRef 0 0 0 0 442 1,923 2,231 2,621 3,592 3,247 2,059 16,115
128 AddChargingStationBicycles 0 0 0 0 0 0 0 0 0 2,848 13,265 16,113
129 AddDrinkingWater 0 0 0 0 0 2,234 2,156 2,231 2,454 3,337 2,937 15,349
130 AddHalal 0 0 0 0 0 3,240 4,307 2,353 2,573 1,690 1,139 15,302
131 DetermineRecyclingGlass 0 0 0 36 1,357 2,982 2,878 2,189 1,888 1,629 1,562 14,521
132 AddReligionToWaysideShrine 0 0 110 117 608 2,114 1,896 2,776 2,096 2,425 1,936 14,078
133 AddLevel 0 0 0 0 0 537 2,047 2,678 2,956 2,806 1,977 13,001
134 AddInformationToTourism 0 0 0 0 438 2,218 2,381 2,266 2,156 1,878 1,476 12,813
135 AddMotorcycleParkingCover 0 0 5 302 611 2,409 2,629 1,927 1,975 1,800 929 12,587
136 AddChargingStationOperator 0 0 0 0 157 1,090 1,327 1,717 2,710 3,253 2,307 12,561
137 AddInternetAccess 0 3 221 309 503 1,155 1,684 2,733 2,582 1,272 2,076 12,538
138 AddKosher 0 0 0 0 4 4,120 3,842 1,658 1,330 868 554 12,376
139 SpecifyShopType 0 0 0 0 0 1,520 2,440 2,227 2,081 1,927 1,996 12,191
140 AddBarrierType 0 0 0 0 0 731 2,246 2,520 2,252 1,962 1,461 11,172
141 AddAtmOperator 0 0 0 0 264 1,631 1,605 1,436 1,805 1,803 1,320 9,864
142 AddPostboxRef 0 0 0 4 624 1,819 1,588 1,285 1,211 1,478 1,254 9,263
143 AddDefibrillatorLocation 0 0 0 0 0 0 0 336 2,950 3,278 2,534 9,098
144 AddIsBuildingUnderground 0 0 0 493 716 1,125 1,082 1,376 1,310 1,392 1,289 8,783
145 AddClothingBinOperator 0 0 0 0 294 1,370 1,123 988 1,460 1,784 1,109 8,128
146 AddLevelThing 0 0 0 0 0 0 0 0 0 1,852 6,149 8,001
147 AddReligionToPlaceOfWorship 0 0 292 399 718 907 1,192 1,170 1,079 942 1,076 7,775
148 AddMotorcycleParkingCapacity 0 0 6 218 330 913 1,059 1,135 1,366 1,696 860 7,583
149 AddSelfServiceLaundry 0 0 0 78 400 1,102 1,299 1,258 1,270 1,069 823 7,299
150 AddPostboxRoyalCypher 0 0 0 0 0 2,310 1,532 1,093 945 827 479 7,186
151 AddCampDrinkingWater 0 0 0 0 0 0 294 1,449 1,976 1,734 1,592 7,045
152 AddOrchardProduce 0 72 236 380 878 1,835 1,728 586 598 321 272 6,906
153 AddBikeParkingAccess 0 0 0 0 0 1,183 1,147 1,084 1,150 1,410 927 6,901
154 AddBicyclePump 0 0 0 0 0 0 1,719 1,687 1,664 881 644 6,595
155 AddCampShower 0 0 0 0 0 0 266 1,177 1,272 1,404 2,383 6,502
156 AddCameraType 0 2 0 0 0 726 1,432 1,097 1,263 1,137 829 6,486
157 AddMaxPhysicalHeight 0 0 0 0 0 0 801 984 1,205 1,814 1,671 6,475
158 AddSuspectedOneway 0 0 0 0 476 1,731 1,706 1,392 854 0 0 6,159
159 AddCampPower 0 0 0 0 0 0 204 1,102 1,477 1,575 1,282 5,640
160 AddBarrierOnPath 0 0 0 0 0 0 1,445 1,230 1,084 1,057 811 5,627
161 AddWheelchairAccessOutside 0 0 4 116 187 821 728 766 704 943 1,181 5,450
162 AddBikeParkingFee 0 0 0 0 0 979 850 810 803 1,000 664 5,106
163 AddIsDefibrillatorIndoor 0 0 0 0 209 1,484 1,708 1,391 6 0 0 4,798
164 AddStileType 0 0 0 0 0 621 847 1,033 786 851 631 4,769
165 AddBicycleRepairStationServices 0 0 0 0 0 0 0 0 181 2,815 1,680 4,676
166 AddArtworkType 0 0 0 0 0 0 0 0 0 0 4,529 4,529
167 AddBarrierOnRoad 0 0 0 0 0 0 972 1,016 1,052 753 726 4,519
168 AddBicycleIncline 0 0 0 0 0 0 294 1,239 1,178 946 636 4,293
169 AddCampType 0 0 0 0 0 0 314 1,366 1,311 1,164 116 4,271
170 AddAcceptsCash 0 0 0 0 142 157 190 1,341 1,007 855 545 4,237
171 AddWheelchairAccessToiletsPart 0 0 0 16 71 288 625 1,081 976 538 354 3,949
172 AddBbqFuel 0 0 0 0 0 0 0 178 1,317 1,172 1,089 3,756
173 AddGritBinSeasonal 0 0 0 0 0 0 0 1,009 1,035 683 543 3,270
174 AddSanitaryDumpStation 0 0 0 0 0 0 0 1 1,214 1,048 900 3,163
175 AddBeachSurface 0 0 0 0 0 0 0 0 0 0 2,946 2,946
176 AddStepCountStile 0 0 0 0 0 0 415 695 634 629 532 2,905
177 AddMotorcycleParkingFee 0 0 0 0 0 0 0 0 0 277 2,438 2,715
178 AddBikeRentalCapacity 0 0 0 0 0 0 486 636 726 461 366 2,675
179 AddFuelSelfService 0 0 0 0 0 0 781 577 1,004 134 115 2,611
180 AddTrafficCalmingType 0 0 0 0 0 140 596 537 468 448 362 2,551
181 AddGlutenFree 0 0 0 0 0 0 0 0 0 1,068 1,424 2,492
182 AddCabins 0 0 0 0 0 0 0 0 0 0 2,379 2,379
183 AddFerryAccessMotorVehicle 0 0 0 74 80 414 473 315 244 358 273 2,231
184 AddParcelLockerPickup 0 0 0 0 0 0 0 0 2,115 17 5 2,137
185 AddStreetParking 0 0 0 0 0 170 1,841 0 0 0 0 2,011
186 AddParcelLockerBrand 0 0 0 0 0 0 0 0 474 740 789 2,003
187 AddFerryAccessPedestrian 0 0 0 36 59 354 399 263 217 308 229 1,865
188 MtbScaleOverlay 0 0 0 0 0 0 0 0 0 1,004 524 1,528
189 AddTents 0 0 0 0 0 0 0 0 0 0 1,322 1,322
190 AddBikeRepairAvailability 0 0 0 0 0 0 259 372 283 219 123 1,256
191 AddFirewood 0 0 0 0 0 0 0 0 0 98 998 1,096
192 AddSummitRegister 0 0 0 0 16 87 168 199 225 207 174 1,076
193 AddHotWater 0 0 0 0 0 0 0 0 0 1 1,064 1,065
194 AddChargingStationBicycleCapacity 0 0 0 0 0 0 0 0 0 153 896 1,049
195 AddCaravans 0 0 0 0 0 0 0 0 0 0 895 895
196 AddTowerAccess 0 0 0 0 0 0 0 0 0 127 742 869
197 AddFerryAccessHgv 0 0 0 0 0 0 0 0 0 0 826 826
198 AddAccessPointRef 0 0 0 0 0 0 6 101 199 256 230 792
199 AddSecondHandBicycleAvailability 0 0 0 0 0 0 165 218 158 144 101 786
200 AddParkingLane 0 0 0 0 781 0 0 0 0 0 0 781
201 AddParcelLockerMailIn 0 0 0 0 0 0 0 0 764 6 2 772
202 AddSummitCross 0 0 0 0 0 0 111 172 193 156 108 740
203 AddMopedAccess 0 0 0 0 0 0 0 0 93 103 538 734
204 AddPoliceType 0 0 0 0 0 150 159 127 180 78 26 720
205 IsBuildingUnderground 0 0 130 549 0 0 0 0 0 0 0 679
206 AddStreetWidth 0 0 0 0 613 0 0 0 0 0 0 613
207 AddBenchMaterial 0 0 0 0 0 0 380 214 0 0 0 594
208 AddHousenumberToNodes 0 0 0 0 0 0 481 0 0 0 0 481
209 AddOnewayAerialway 0 0 0 0 0 0 0 0 0 0 468 468
210 AddFerryAccessBicycle 0 0 0 0 0 0 0 0 0 0 371 371
211 AddAerialwayBicycleAccess 0 0 0 0 0 0 0 0 0 50 215 265
212 AddBoatRental 0 0 0 0 0 0 0 0 24 134 97 255
213 StreetFurnitureOverlay 0 0 0 0 0 0 0 130 92 0 0 222
214 AddBenchHostileArchitecture 0 0 0 0 0 0 0 0 0 0 173 173
215 ParkingConditionOverlay 0 0 0 0 0 0 0 0 0 0 145 145
216 SmoothnessOverlay 0 0 0 0 0 0 0 0 0 142 0 142
217 AddHousenumberForAll 0 0 0 0 0 111 27 0 0 0 0 138
218 AddPaymentGirocard 0 0 105 30 0 0 0 0 0 0 0 135
219 AddPaymentMastercard 0 0 94 24 0 0 0 0 0 0 0 118
220 AddPaymentContactless 0 0 94 23 0 0 0 0 0 0 0 117
221 AddPaymentVisa 0 0 90 23 0 0 0 0 0 0 0 113
222 RoadSurfaceOverlay 0 0 0 0 0 0 23 78 0 0 0 101
223 BicycleParkingOperator 0 0 0 0 0 0 0 0 44 27 2 73
224 AddFirstAidKitLocation 0 0 0 0 0 0 0 0 0 11 46 57
225 AddRef 0 0 0 0 0 0 55 0 0 0 0 55
226 AddFacadeBuilding 0 0 0 0 0 0 52 2 0 0 0 54
227 SpecifyEntrance 0 0 0 0 0 0 0 0 33 21 0 54
228 AddHandwashing 0 0 0 0 0 0 0 0 0 5 45 50
229 AddShelterCapacity 0 0 0 0 0 0 0 0 0 4 44 48
230 AddContactPhone 0 0 0 0 15 27 5 0 0 0 0 47
231 AddProhibitedForMoped 0 0 0 0 0 0 0 0 45 0 0 45
232 AddParkingCapacityDisabled 0 0 0 0 0 0 43 0 0 0 0 43
233 PathSurfaceOverlay 0 0 0 0 0 0 17 23 0 0 0 40
234 CheckExistencePhone 0 0 0 0 0 0 0 39 0 0 0 39
235 AddPublicTransport 0 0 0 0 0 0 39 0 0 0 0 39
236 AddBuildingColor 0 0 0 0 0 0 36 2 0 0 0 38
237 AddCrossingMarkingsType 0 0 0 0 0 0 37 0 0 0 0 37
238 AddGeneralAccess 0 0 0 0 0 0 0 0 0 0 35 35
239 AddDesignation 0 0 0 0 0 0 34 0 0 0 0 34
240 AddGuidepostRef 0 0 0 0 0 0 0 34 0 0 0 34
241 AddWasteDisposalAccess 0 0 0 0 0 0 0 0 5 24 1 30
242 AddGuidepostEle 0 0 0 0 0 0 0 30 0 0 0 30
243 AddMtbScale 0 0 0 0 0 0 0 25 0 0 0 25
244 AddPlacePhone 0 0 0 0 0 25 0 0 0 0 0 25
245 AddWayLight 0 24 0 0 0 0 0 0 0 0 0 24
246 AddStreetLighting 0 22 0 0 0 0 0 0 0 0 0 22
247 AddGuidepostActivityHiking 0 0 0 0 0 0 0 21 0 0 0 21
248 AddGuidepostName 0 0 0 0 0 0 0 21 0 0 0 21
249 AddGuidepostActivity 0 0 0 0 0 0 0 17 0 0 0 17
250 CreatePoiBasedOnAtp 0 0 0 0 0 0 0 0 0 16 1 17
251 AddPaymentCoins 0 0 14 1 0 0 0 0 0 0 0 15
252 AddTrafficSignalsBlindFeatures 0 0 0 0 14 0 0 0 0 0 0 14
253 AddParkingCapacityDisabledNumber 0 0 0 0 0 0 14 0 0 0 0 14
254 AddLightingRoads 0 14 0 0 0 0 0 0 0 0 0 14
255 AddContactWebsite 0 0 0 0 5 6 1 0 0 0 0 12
256 AddParkingCharge 0 0 0 0 0 0 0 0 0 3 8 11
257 AddStepsHandrails 0 11 0 0 0 0 0 0 0 0 0 11
258 UniversalSurfaceOverlay 0 0 0 0 0 0 8 0 0 0 0 8
259 AddOpeningHoursAtp 0 0 0 0 0 0 0 0 0 8 0 8
260 AddSidewalkSmoothnessLeft 0 6 0 0 0 0 0 0 0 0 0 6
261 MarkCompletedConstruction 0 0 5 0 0 0 0 0 0 0 0 5
262 IsMonumentOrMemorial 0 0 0 0 0 0 0 0 0 5 0 5
263 AddAtmCashin 0 0 0 0 0 0 5 0 0 0 0 5
264 AddHairdresser 0 0 0 0 0 0 0 5 0 0 0 5
265 AddFuelE10 0 0 4 1 0 0 0 0 0 0 0 5
266 AddSidewalkSmoothnessRight 0 5 0 0 0 0 0 0 0 0 0 5
267 AddFuelLPG 0 0 4 0 0 0 0 0 0 0 0 4
268 AddDrinkingWaterFee 0 0 0 0 0 0 0 0 4 0 0 4
269 AddChargingStationSocket 0 0 0 0 0 0 0 0 0 0 4 4
270 AddQuietHours 0 0 0 0 0 0 4 0 0 0 0 4
271 AddRulesInformationBoard 0 0 0 0 0 0 0 0 0 4 0 4
272 AddIsPharmacyDispensing 0 0 0 0 0 0 0 4 0 0 0 4
273 AddReligionToCemetery 0 0 0 0 3 0 0 0 0 0 0 3
274 AddFuelHgvDiesel 0 0 1 2 0 0 0 0 0 0 0 3
275 AddLeafType 0 0 0 3 0 0 0 0 0 0 0 3
276 AddFuelOctane98 0 0 2 1 0 0 0 0 0 0 0 3
277 AddSegregated 0 0 2 0 0 0 0 0 0 0 0 2
278 AddAlsoShopForInsurance 0 0 0 0 0 0 0 0 1 1 0 2
279 AddDoctorType 0 0 0 0 0 0 0 0 0 0 2 2
280 AddMonumentName 0 0 0 0 0 0 0 0 0 2 0 2
281 AddFuelOctane95 0 0 2 0 0 0 0 0 0 0 0 2
282 AddAcceptsMedicineTrash 0 0 0 0 0 0 0 0 1 1 0 2
283 AddTrafficSignalsWaitDuration 0 0 0 0 2 0 0 0 0 0 0 2
284 ShowFixme 0 0 0 0 0 0 0 0 1 0 0 1
285 RemoveDiscordantMaxSpeed 0 0 0 0 0 0 1 0 0 0 0 1
286 AddFuelDiesel 0 0 1 0 0 0 0 0 0 0 0 1
287 AddBusStopType 0 1 0 0 0 0 0 0 0 0 0 1
288 AddAdblue 0 0 0 0 1 0 0 0 0 0 0 1
289 AddAerialBothWay 0 0 0 0 0 0 0 0 0 1 0 1
290 LGBTQAccess 0 0 0 0 0 0 0 0 1 0 0 1
291 AddBackupGenerator 0 0 0 0 0 0 0 1 0 0 0 1
292 AddRailStopRef 0 0 0 0 0 0 1 0 0 0 0 1
293 AddScooterChargingStationCapacity 0 0 0 0 0 0 0 0 0 1 0 1
294 AddBoatLockType 0 0 0 0 0 0 0 0 0 1 0 1
295 AddWheelchairAccess 0 1 0 0 0 0 0 0 0 0 0 1
296 AddWebsiteMenuLinkLocation 0 0 0 0 0 0 0 0 1 0 0 1
297 AddWater 0 1 0 0 0 0 0 0 0 0 0 1
298 AddWheelchairAccessDogPark 0 0 1 0 0 0 0 0 0 0 0 1
299 AddBikeChargingStationCapacity 0 0 0 0 0 0 0 0 0 1 0 1
300 DetailPavedRoadSurface 0 1 0 0 0 0 0 0 0 0 0 1
301 VerifyNaptan 0 0 0 0 0 0 1 0 0 0 0 1

Accumulated Edits and Contributors of Top 10 StreetComplete Quests

code
# Top 10 StreetComplete quests with monthly trends
df_top_quests = duckdb.sql("""
WITH top_quests AS (
    SELECT streetcomplete_quest
    FROM (
        SELECT
            streetcomplete_quest,
            COUNT(DISTINCT user_name) as total_contributors
        FROM '../changeset_data/year=*/month=*/*.parquet'
        WHERE created_by = 'StreetComplete'
        GROUP BY streetcomplete_quest
        ORDER BY total_contributors DESC
        LIMIT 10
    )
),
monthly_quest_data AS (
    SELECT 
        year,
        month,
        CONCAT(year, '-', LPAD(CAST(month as VARCHAR), 2, '0')) as months,
        streetcomplete_quest,
        COUNT(DISTINCT user_name) as "Contributors",
        SUM(edit_count) as "Edits"
    FROM '../changeset_data/year=*/month=*/*.parquet'
    WHERE streetcomplete_quest IN (SELECT streetcomplete_quest FROM top_quests)
    GROUP BY year, month, streetcomplete_quest
)
SELECT 
    months,
    streetcomplete_quest,
    "Contributors",
    "Edits",
    SUM("Contributors") OVER (PARTITION BY streetcomplete_quest ORDER BY year, month) as "Accumulated Contributors",
    SUM("Edits") OVER (PARTITION BY streetcomplete_quest ORDER BY year, month) as "Accumulated Edits"
FROM monthly_quest_data
ORDER BY year, month, streetcomplete_quest
""").df()

util.show_figure(
    [
        util.FigureConfig(
            title="Monthly Contributors by Top 10 StreetComplete Quests",
            label="Monthly Contributors",
            x_col="months",
            y_col="Contributors",
            group_col="streetcomplete_quest",
            query_or_df=df_top_quests,
        ),
        util.FigureConfig(
            title="Monthly Edits by Top 10 StreetComplete Quests",
            label="Monthly Edits",
            x_col="months",
            y_col="Edits",
            group_col="streetcomplete_quest",
            query_or_df=df_top_quests,
        ),
        util.FigureConfig(
            title="Accumulated Contributors by Top 10 StreetComplete Quests",
            label="Accumulated Contributors",
            x_col="months",
            y_col="Accumulated Contributors",
            group_col="streetcomplete_quest",
            query_or_df=df_top_quests,
        ),
        util.FigureConfig(
            title="Accumulated Edits by Top 10 StreetComplete Quests",
            label="Accumulated Edits",
            x_col="months",
            y_col="Accumulated Edits",
            group_col="streetcomplete_quest",
            query_or_df=df_top_quests,
        ),
    ]
)

Map with Total Edits Using StreetComplete

code
df_map = duckdb.sql("""
SELECT
    mid_pos_x as x,
    mid_pos_y as y,
    SUM(edit_count) as z
FROM '../changeset_data/year=*/month=*/*.parquet'
WHERE created_by = 'StreetComplete'
    AND mid_pos_x IS NOT NULL 
    AND mid_pos_y IS NOT NULL
GROUP BY mid_pos_x, mid_pos_y
""").df()

util.show_figure(
    [
        util.FigureConfig(
            title="Global Distribution of StreetComplete Edits",
            x_col="x",
            y_col="y",
            z_col="z",
            query_or_df=df_map,
            plot_type="map",
        )
    ]
)