Created
July 30, 2023 15:47
-
-
Save Th0rgal/5f2e78b4c01eff749c8928dd4964b917 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
You are an experienced data scientist used to working with matplotlib in a jupyter notebook environment. I want to generate a Python code snippet using the `matplotlib` and `numpy` libraries to visualize specific data from our StarknetID MongoDB database. I need your help to create a chart that showcase data in a meaningful and human friendly way. | |
Here's a bit of context: we're a decentralized naming service similar to ENS, and we use this database to store information about domain sales. Each document in our "sales" collection contains the following fields: | |
"domain": the name of the domain that was sold | |
"type": the type of the sale (can be "purchase" or "renewal") | |
"price": the price paid by the buyer in ether wei | |
"timestamp": the time when the sale happened, represented in seconds | |
"duration": the duration of the domain rent, in seconds | |
"auto": a boolean indicating whether the domain was purchased automatically (true if the user activated the automatic renewal feature) | |
"sponsor": the address of a referral (if any) who helped us make the sale | |
"sponsor_comm": the amount received by the sponsor for this sale, in ether wei | |
You will use the existing code base to fetch the sales data and convert necessary values for charting: | |
```py | |
from pymongo import MongoClient | |
import matplotlib.pyplot as plt | |
import requests | |
# Connection string | |
client = MongoClient( | |
"mongodb://apibara:[email protected]/?retryWrites=true&w=majority" | |
) | |
# Database and collection | |
db = client["sales"] | |
sales = db["sales"] | |
# Constants for conversion | |
WEI_TO_ETH = 1e18 | |
SEC_TO_DAY = 86400 | |
DAYS_IN_YEAR = 365 | |
DAYS_IN_MONTH = 30 | |
DAYS_10_MONTHS = 10 * DAYS_IN_MONTH | |
DAYS_14_MONTHS = 14 * DAYS_IN_MONTH | |
DAYS_3_YEARS = 3 * DAYS_IN_YEAR | |
# Get current ETH price | |
response = requests.get( | |
"https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd" | |
) | |
eth_price = response.json()["ethereum"]["usd"] | |
``` | |
You can refer to the example given to you about generating a pie chart representing the revenue distribution between renewals and purchases for a similar task: | |
```py | |
# query | |
revenue_by_sale_type = list( | |
sales.aggregate( | |
[ | |
{ | |
"$group": { | |
"_id": "$type", | |
"total": {"$sum": {"$divide": ["$price", WEI_TO_ETH]}}, | |
} | |
} | |
] | |
) | |
) | |
# chart | |
labels = [revenue_type['_id'] for revenue_type in revenue_by_sale_type] | |
sizes = [revenue_type['total'] for revenue_type in revenue_by_sale_type] | |
# autopct lambda function to include ETH and USD values | |
autopct_lambda = lambda pct: f"{pct:.1f}%\n({pct*sum(sizes)/100:.2f} ETH, ${(pct*sum(sizes)/100)*eth_price:.2f})" | |
plt.pie(sizes, labels=labels, autopct=autopct_lambda, startangle=140) | |
plt.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle. | |
plt.title("Revenue distribution by sale type (in ETH and USD)") | |
plt.tight_layout() | |
``` | |
Considering all the above, please generate Python code that produces a plot of daily net revenue over all the data available. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment