Grants Data AnalysisΒΆ
Key Findings:
Some text
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import plotly.io as pio
pio.renderers.default = "notebook"
# read in clean grants data
df = pd.read_csv('../data/grants_data.csv')
df['count'] = 1
df.head()
round_number | round_start_date | round_end_date | grant_title | grant_id | region | category | url | match_amount | num_contributions | num_unique_contributors | crowdfund_amount_contributions_usd | total | count | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 12 | 2021-12-01 | 2021-12-16 | Coin Center is educating policy makers about p... | 1668 | north_america | Community | https://gitcoin.co/grants/1668/coin-center-is-... | 340000.00 | 6914 | 5727 | 103838.93 | 443838.93 | 1 |
1 | 12 | 2021-12-01 | 2021-12-16 | Electronic Frontier Foundation | 3974 | north_america | Community | https://gitcoin.co/grants/3974/electronic-fron... | 228273.84 | 3648 | 3331 | 58715.04 | 286988.88 | 1 |
2 | 12 | 2021-12-01 | 2021-12-16 | The Tor Project | 2805 | none | Infra Tech | https://gitcoin.co/grants/2805/the-tor-project | 188294.80 | 3497 | 3069 | 95279.64 | 283574.44 | 1 |
3 | 12 | 2021-12-01 | 2021-12-16 | Longevity Prize (by VitaDAO) | 4083 | europe | Grants Round 12 | https://gitcoin.co/grants/4083/longevity-prize... | 176195.45 | 920 | 857 | 7815.29 | 184010.75 | 1 |
4 | 12 | 2021-12-01 | 2021-12-16 | Rotki - The portfolio tracker and accounting t... | 149 | europe | dApp Tech | https://gitcoin.co/grants/149/rotki-the-portfo... | 129131.34 | 4684 | 4311 | 25373.62 | 154504.96 | 1 |
# data transformation and new variables
df['dollars_per_contributor'] = df['crowdfund_amount_contributions_usd'] / df['num_unique_contributors']
fig = px.histogram(
df,
x='round_number',
y='round_number'
)
fig.update_layout({
'showlegend': False,
'title': 'Grants per Round',
'xaxis_title': 'round',
'yaxis_title': 'grants',
'xaxis_dtick': 1,
'bargap': 0.2,
})
fig.write_image("images/grants_per_round.jpeg")
fig.show()
fig = px.histogram(
df,
x='round_number',
y='num_contributions'
)
fig.update_layout({
'showlegend': False,
'title': 'Contributions per Round',
'xaxis_title': 'round',
'yaxis_title': 'contributions',
'xaxis_dtick': 1,
'bargap': 0.2,
})
fig.write_image("images/contrib_per_round.jpeg")
fig.show()
fig = px.histogram(
df,
x='round_number',
y=[
'crowdfund_amount_contributions_usd',
'match_amount'
]
)
fig.update_layout({
'title': 'Contributions per Round',
'xaxis_title': 'round',
'yaxis_title': 'contributions ($)',
'xaxis_dtick': 1,
'yaxis_tickprefix': '$',
'yaxis_tickformat': ',.0f',
'bargap': 0.2
})
fig.write_image("images/contrib_per_round_match.jpeg")
fig.show()
Questions:ΒΆ
Holy moly round 12
Most recent round 12 had a huge increase in both crowdfunded contributions as well as matched contributions
Round 8ΒΆ
QuestionsΒΆ
What happened during round 8?
There was a significant increase in crowdfunding contributions
Was this one big donation? Bigger marketing campaign?
Key FindingsΒΆ
Round 8 had a big increase in individual contribution compared to previous rounds
The grant with the most funding in round 8 (Coin Center) had more contributions than nearly every grant in round 7 combined
The higher total amount is driven by crowdfunding, not by a larger matched amount
Round 8 had the lowest proportion of contributions coming from matches, so it looks more like organic growth of contributions
It is difficult to figure out from this dataset, since all contributions are aggregated
This could potentially be a single large donation
fig = px.histogram(
df,
x='round_number',
y='num_contributions'
)
fig.update_layout({
'showlegend': False,
'title': 'Contributions per Round',
'xaxis_title': 'round',
'yaxis_title': 'contributions',
'xaxis_dtick': 1,
'bargap': 0.2,
})
fig.write_image("images/contributions_per_round.jpeg")
fig.show()
df.loc[df.round_number == 8, :].groupby('grant_title')['total'].sum(
).sort_values(ascending=False).reset_index().head(20)
grant_title | total | |
---|---|---|
0 | Coin Center is educating policy makers about p... | 674332.58 |
1 | Hardhat by Nomic Labs | 154414.45 |
2 | Gitcoin Grants Core Team - Dev Fund | 142078.48 |
3 | OpenEthereum (Ex-Parity client) | 58145.94 |
4 | Nimbus | 49679.86 |
5 | Gitcoin Grants Official Matching Pool Fund | 47422.47 |
6 | Circles UBI | 45440.02 |
7 | Prysm by Prysmatic Labs | 41549.79 |
8 | Fiona Kobayashi - Software Engineer | 40798.92 |
9 | EU Crypto Initiative - educating policy makers... | 39610.24 |
10 | Lighthouse: Ethereum 2.0 Client | 37892.28 |
11 | Bankless | 36565.15 |
12 | WalletConnect | 34207.08 |
13 | APY Vision | 33902.58 |
14 | Nethermind | 32682.01 |
15 | DAppNode - Panvala League | 30035.01 |
16 | Week in Ethereum News | 27632.98 |
17 | Rotki - The portfolio tracker and accounting t... | 25615.72 |
18 | beaconcha.in - Open source Eth2 blockchain exp... | 25324.44 |
19 | ethers.js - Complete, Simple and Tiny | 24791.60 |
Round 12ΒΆ
QuestionsΒΆ
What drove the significant increase in donations during round 12?
Key FindingsΒΆ
Both contributions and matches went up by similar amounts in this round
Significant increase to βCommunityβ project category
Lots of projects in the βGrants round 12β category which seems like bad data
Proportion of contributions coming from a match is going up, with round 12 being a local maximum
NFT contributions almost doubled compared to round 11
Community projects saw the largest increase compared to round 11
df.loc[df.round_number == 12, :].groupby('grant_title')['total'].sum().sort_values(ascending=False).reset_index().head(20)
grant_title | total | |
---|---|---|
0 | Coin Center is educating policy makers about p... | 443838.93 |
1 | Electronic Frontier Foundation | 286988.88 |
2 | The Tor Project | 283574.44 |
3 | ZigZag Exchange | 241184.20 |
4 | Longevity Prize (by VitaDAO) | 184010.75 |
5 | Dark Forest | 180574.64 |
6 | The Blockchain Association (BA) | 154552.02 |
7 | Rotki - The portfolio tracker and accounting t... | 154504.96 |
8 | Kick-starting the market for future carbon | 115001.17 |
9 | L2BEAT | 112437.23 |
10 | ZeroPool - Scaling anonymous transactions for ... | 111917.98 |
11 | Fight for the Future is building and channelin... | 105582.95 |
12 | Freedom of the Press Foundation | 101088.64 |
13 | POAP (Proof of Attendance Protocol) | 98819.58 |
14 | Li.Finance - Cross-Chain Bridge Aggregator + S... | 91301.78 |
15 | EtherDrops | 88692.32 |
16 | Frame: Privacy Focused Native Ethereum Wallet | 84816.85 |
17 | Climate Finance DAO | 83672.16 |
18 | Umbra: Privacy Preserving Stealth Payments | 80342.05 |
19 | Atlantis World | 78760.58 |
df.loc[df.round_number == 12, :].groupby('grant_title')[['crowdfund_amount_contributions_usd', 'dollars_per_contributor']].sum(
).sort_values('dollars_per_contributor', ascending=False).reset_index().head(20)
grant_title | crowdfund_amount_contributions_usd | dollars_per_contributor | |
---|---|---|---|
0 | iCryptoNode - Bitcoin & Raspberry Pi Monero Node | 3500.00 | 3500.000000 |
1 | The Climate Change Donation Fund by Founders P... | 51292.79 | 479.371869 |
2 | Foresight Institute Longevity Fellowship | 17554.78 | 417.970952 |
3 | Joanna Picetti - Global Government - Digital E... | 292.07 | 146.035000 |
4 | MintFund β Helping Creators Mint their First N... | 1693.82 | 80.658095 |
5 | DeSchool | 1350.73 | 67.536500 |
6 | Bloom Network - Panvala League | 53817.66 | 59.664812 |
7 | Rainforest Direct | 52871.40 | 58.811346 |
8 | The Datafruits Fund | 106.45 | 53.225000 |
9 | Cyber Academy | 2809.63 | 52.030185 |
10 | Clean Air Task Force | 18792.34 | 49.453526 |
11 | Planting fruit trees in 64 schools and 40 heal... | 21387.26 | 49.166115 |
12 | TAKSH | 425.88 | 47.320000 |
13 | Seaworthy Foundation | 22517.79 | 44.152529 |
14 | Nuggan's license to BUIDL | 631.27 | 42.084667 |
15 | Ethereum Lists | 529.79 | 37.842143 |
16 | A scalable open science platform for longevity... | 255.90 | 36.557143 |
17 | EthereumDev.io | Free tutorials for learning S... | 253.71 | 36.244286 |
18 | Biomarkers to measure aging - Norn Group | 1008.87 | 36.031071 |
19 | @PaulRBerg Open-Source Engineering | 1728.36 | 35.272653 |
df_round = df.groupby('round_number')[['match_amount', 'crowdfund_amount_contributions_usd', 'total']].sum().reset_index()
df_round['match_proportion'] = df_round['match_amount'] / df_round['total']
df_round
round_number | match_amount | crowdfund_amount_contributions_usd | total | match_proportion | |
---|---|---|---|---|---|
0 | 1 | 25000.01 | 13661.09 | 38661.10 | 0.646645 |
1 | 2 | 50000.00 | 58544.41 | 108544.41 | 0.460641 |
2 | 3 | 101880.20 | 95114.91 | 196995.11 | 0.517171 |
3 | 4 | 153553.90 | 102619.19 | 256173.09 | 0.599415 |
4 | 5 | 244388.00 | 89817.33 | 334205.34 | 0.731251 |
5 | 6 | 171638.67 | 183527.84 | 355166.61 | 0.483262 |
6 | 7 | 441160.55 | 277940.89 | 719101.55 | 0.613489 |
7 | 8 | 349912.25 | 2081178.35 | 2431090.69 | 0.143932 |
8 | 9 | 520743.73 | 1116601.22 | 1637344.74 | 0.318042 |
9 | 10 | 694491.13 | 1039014.22 | 1733505.44 | 0.400628 |
10 | 11 | 929755.27 | 1360270.46 | 2290025.89 | 0.406002 |
11 | 12 | 3090569.14 | 2938955.53 | 6029524.56 | 0.512573 |
fig = px.line(
df_round,
x='round_number',
y='match_proportion'
)
fig.update_layout({
'showlegend': False,
'title': 'Proportion of contributions from match',
'xaxis_title': 'round',
'yaxis_title': 'match %',
'yaxis_tickformat': ',.0%',
'yaxis_rangemode': 'tozero'
})
fig.write_image("images/proportion_from_match.jpeg")
fig.show()
fig = px.histogram(
df,
x='round_number',
y='crowdfund_amount_contributions_usd',
color='category'
)
fig.update_layout({
'title': 'Contributions by Category',
'xaxis_title': 'round',
'yaxis_title': 'contribution ($)',
'bargap': 0.2,
'yaxis_tickprefix': '$',
'yaxis_tickformat': ',.0f',
'yaxis_rangemode': 'tozero'
})
fig.write_image("images/contrib_per_category.jpeg")
fig.show()
fig = px.histogram(
df,
x='round_number',
y='crowdfund_amount_contributions_usd',
color='category'
)
fig.update_layout({
'title': 'Contributions by Category',
'xaxis_title': 'round',
'yaxis_title': 'contribution ($)',
'bargap': 0.2,
'yaxis_tickprefix': '$',
'yaxis_tickformat': ',.0f',
'yaxis_rangemode': 'tozero'
})
fig.write_image("images/contrib_per_category.jpeg")
fig.show()
fig = px.histogram(
df,
x='round_number',
y='count',
color='category'
)
fig.update_layout({
'title': 'Grants by Category',
'xaxis_title': 'round',
'yaxis_title': 'grants',
'bargap': 0.2,
'yaxis_tickformat': ',.0f',
'yaxis_rangemode': 'tozero'
})
fig.write_image("images/grants_per_category.jpeg")
fig.show()