diff --git a/charts/asynchronous.py b/charts/asynchronous.py new file mode 100644 index 0000000..c0604da --- /dev/null +++ b/charts/asynchronous.py @@ -0,0 +1,459 @@ +import aiohttp +import asyncio +import json +from .synchronous import * +import datetime +from datetime import date, timedelta +from .models import Coin, Social, P2Pool +import requests +import pygsheets + +#################################################################################### +# Asynchronous get block data from xmrchain +#################################################################################### +async def get_block_data(session, block: str): + url = 'https://xmrchain.net/api/block/' + block + async with session.get(url) as res: + data = await res.read() + data = json.loads(data) + data['provider'] = 'xmrchain' + if res.status < 299: + data['success'] = True + else: + data['success'] = False + return data + +#################################################################################### +# Asynchronous get network data from xmrchain +#################################################################################### +async def get_network_data(session, block: str): + url = 'https://xmrchain.net/api/networkinfo' + async with session.get(url) as res: + data = await res.read() + data = json.loads(data) + data['provider'] = 'xmrchain' + if res.status < 299: + data['success'] = True + else: + data['success'] = False + return data + +#################################################################################### +# Asynchronous get coinmarketcap data for price USD and BTC +#################################################################################### +async def get_coinmarketcap_data(session, symbol: str, convert: str): + with open("settings.json") as file: + data = json.load(file) + file.close() + + url = data["metrics_provider"][0]["price_url_old"] + symbol + parameters = {'convert': convert,} + headers = {'Accepts': 'application/json', data["metrics_provider"][0]["api_key_name"]: data["metrics_provider"][0]["api_key_value"],} + + async with session.get(url, headers=headers, params=parameters) as res: + data = await res.read() + data = json.loads(data) + data['provider'] = 'coinmarketcap' + if res.status < 299: + try: + if data['data'][symbol.upper()]['cmc_rank']: + data['success'] = True + else: + data['success'] = False + except: + data['success'] = False + else: + data['success'] = False + return data + +#################################################################################### +# Asynchronous get coinmetrics data for any coin inside URL +#################################################################################### +async def get_coin_data(session, symbol, url): + update = True + count = 0 + + while update: + async with session.get(url) as res: + data = await res.read() + data = json.loads(data) + data_aux = data['data'] + for item in data_aux: + day, hour = str(item['time']).split('T') + day = datetime.datetime.strptime(day, '%Y-%m-%d') + day = datetime.datetime.strftime(day, '%Y-%m-%d') + try: + coin = Coin.objects.filter(name=symbol).get(date=day) + except: + coin = Coin() + + try: + coin.name = symbol + coin.date = day + try: + coin.priceusd = float(item['PriceUSD']) + except: + coin.priceusd = 0 + try: + coin.pricebtc = float(item['PriceBTC']) + except: + coin.pricebtc = 0 + try: + coin.inflation = float(item['IssContPctAnn']) + coin.stocktoflow = (100/coin.inflation)**1.65 + except: + coin.inflation = 0 + coin.stocktoflow = 0 + try: + coin.supply = float(item['SplyCur']) + except: + coin.supply = 0 + try: + coin.fee = float(item['FeeTotNtv']) + except: + coin.fee = 0 + try: + coin.revenue = float(item['RevNtv']) + except: + coin.revenue = 0 + try: + coin.hashrate = float(item['HashRate']) + except: + coin.hashrate = 0 + try: + coin.transactions = float(item['TxCnt']) + except: + coin.transactions = 0 + coin.save() + count += 1 + except: + pass + try: + url = data['next_page_url'] + update = True + except: + update = False + break + return count + +#################################################################################### +# Asynchronous get social metrics from reddit +#################################################################################### +async def get_social_data(session, symbol): + date_now = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + socials = Social.objects.filter(name=symbol).filter(date=date_now) + + if not(socials): + print('getting new data') + url = 'https://www.reddit.com/r/'+ symbol +'/about.json' + + async with session.get(url, headers={'User-agent': 'Checking new social data'}) as res: + data = await res.read() + data = json.loads(data) + data = data['data'] + subscribers = data['subscribers'] + social = Social() + social.name = symbol + social.date = date_now + social.subscriberCount = subscribers + + date_aux = date.today() + date_aux = datetime.datetime.strftime(date_aux, '%Y-%m-%d') + date_aux = datetime.datetime.strptime(date_aux, '%Y-%m-%d') + timestamp1 = int(datetime.datetime.timestamp(date_aux)) + + timestamp2 = int(timestamp1 - 86400) + limit = 2000 + filters = [] + data = data_prep_posts(symbol, timestamp2, timestamp1, filters, limit) + social.postsPerHour = len(data)/24 + + timestamp2 = int(timestamp1 - 7200) + limit = 2000 + data = data_prep_comments(symbol, timestamp2, timestamp1, filters, limit) + social.commentsPerHour = len(data)/2 + social.save() + return True + +#################################################################################### +# Asynchronous get whole xmr data calling coinmarketcap and xmrchain +#################################################################################### +async def update_xmr_data(yesterday, coin): + name = coin.name + url = 'https://xmrchain.net/api/networkinfo' + response = requests.get(url) + data = json.loads(response.text) + height = int(data['data']['height']) + difficulty = int(data['data']['difficulty']) + hashrate = int(data['data']['hash_rate']) + blocksize = 0 + actions = [] + + my_timeout = aiohttp.ClientTimeout( + total=10, + sock_connect=10, + sock_read=10 + ) + client_args = dict( + trust_env=True, + timeout=my_timeout + ) + + async with aiohttp.ClientSession(**client_args) as session: + for count in range(1, 1400): + block = str(height - count) + actions.append(asyncio.ensure_future(get_block_data(session, block))) + actions.append(asyncio.ensure_future(get_coinmarketcap_data(session, 'xmr', 'USD'))) + actions.append(asyncio.ensure_future(get_coinmarketcap_data(session, 'xmr', 'BTC'))) + + try: + responses = await asyncio.gather(*actions, return_exceptions=True) + except asyncio.exceptions.TimeoutError: + print('Timeout!') + + errors = 0 + success = 0 + txs = 0 + revenue = 0 + fees = 0 + priceusd = 0 + pricebtc = 0 + for response in responses: + if response: + try: + if response['provider'] == 'xmrchain': + date_aux = response['data']['timestamp_utc'].split(' ')[0] + if date_aux == yesterday: + try: + blocksize += int(response['data']['size']) + for tx in response['data']['txs']: + if tx['coinbase']: + revenue += int(tx['xmr_outputs']) + else: + txs += 1 + fees += int(tx['tx_fee']) + revenue += int(tx['tx_fee']) + success += 1 + except: + errors += 1 + + if response['provider'] == 'coinmarketcap': + try: + priceusd = float(response['data']['XMR']['quote']['USD']['price']) + update_rank(response) + update_dominance(response) + except: + try: + pricebtc = float(response['data']['XMR']['quote']['BTC']['price']) + except: + errors += 1 + except: + errors += 1 + else: + errors += 1 + + blocksize = blocksize/success + revenue = float(revenue)/10**12 + fees = float(fees)/10**12 + inflation = 100*365*(revenue)/float(coin.supply) + stocktoflow = (100/inflation)**1.65 + supply = coin.supply + revenue + + print('Name: ' + name) + print('Date: ' + str(yesterday)) + print('Success: ' + str(success)) + print('Errors: ' + str(errors)) + print('Blocksize: ' + str(blocksize)) + print('Transactions: ' + str(txs)) + print('Revenue: ' + str(revenue)) + print('Fees: ' + str(fees)) + print('Inflation: ' + str(inflation)) + print('Hashrate: ' + str(hashrate)) + print('Difficulty: ' + str(difficulty)) + print('Stocktoflow: ' + str(stocktoflow)) + print('Priceusd: ' + str(priceusd)) + print('Pricebtc: ' + str(pricebtc)) + print('Supply: ' + str(supply)) + + try: + coin = Coin() + coin.name = name + coin.date = datetime.datetime.strptime(yesterday, '%Y-%m-%d') + coin.blocksize = blocksize + coin.transactions = txs + coin.revenue = revenue + coin.fee = fees + coin.inflation = inflation + coin.hashrate = hashrate + coin.difficulty = difficulty + coin.stocktoflow = stocktoflow + coin.priceusd = priceusd + coin.pricebtc = pricebtc + coin.supply = supply + coin.save() + except: + return False + return True + +#################################################################################### +# Asynchronous get social and coins data +#################################################################################### +async def update_others_data(date): + with open("settings.json") as file: + data = json.load(file) + file.close() + + url_btc = data["metrics_provider"][0]["metrics_url_new"] + 'btc/' + date + url_dash = data["metrics_provider"][0]["metrics_url_new"] + 'dash/' + date + url_grin = data["metrics_provider"][0]["metrics_url_new"] + 'grin/' + date + url_zec = data["metrics_provider"][0]["metrics_url_new"] + 'zec/' + date + actions = [] + + my_timeout = aiohttp.ClientTimeout( + total=10, + sock_connect=10, + sock_read=10 + ) + client_args = dict( + trust_env=True, + timeout=my_timeout + ) + + async with aiohttp.ClientSession(**client_args) as session: + # reddit data + actions.append(asyncio.ensure_future(get_social_data(session, 'Monero'))) + actions.append(asyncio.ensure_future(get_social_data(session, 'Bitcoin'))) + actions.append(asyncio.ensure_future(get_social_data(session, 'Cryptocurrency'))) + # coinmetrics data + actions.append(asyncio.ensure_future(get_coin_data(session, 'btc', url_btc))) + actions.append(asyncio.ensure_future(get_coin_data(session, 'dash', url_dash))) + actions.append(asyncio.ensure_future(get_coin_data(session, 'grin', url_grin))) + actions.append(asyncio.ensure_future(get_coin_data(session, 'zec', url_zec))) + actions.append(asyncio.ensure_future(get_p2pool_data(session, mini=False))) + actions.append(asyncio.ensure_future(get_p2pool_data(session, mini=True))) + + try: + await asyncio.gather(*actions, return_exceptions=True) + except asyncio.exceptions.TimeoutError: + print('Timeout!') + update_database(date, date) + return True + +#################################################################################### +# Asynchronous get p2pool and p2poolmini data and then save to google sheets +#################################################################################### +async def get_p2pool_data(session, mini): + today = date.today() + yesterday = date.today() - timedelta(1) + try: + p2pool_stat = P2Pool.objects.filter(mini=mini).get(date=today) + if p2pool_stat.percentage > 0: + update = False + else: + p2pool_stat.delete() + try: + coin = Coin.objects.filter(name='xmr').get(date=yesterday) + if coin.hashrate > 0: + update = True + else: + update = False + except: + update = False + except: + try: + coin = Coin.objects.filter(name='xmr').get(date=yesterday) + if coin.hashrate > 0: + update = True + else: + update = False + except: + update = False + + if update: + p2pool_stat = P2Pool() + p2pool_stat.date = today + + if not(mini): + async with session.get('https://p2pool.io/api/pool/stats') as res: + data = await res.read() + data = json.loads(data) + p2pool_stat.hashrate = data['pool_statistics']['hashRate'] + p2pool_stat.percentage = 100*data['pool_statistics']['hashRate']/coin.hashrate + p2pool_stat.miners = data['pool_statistics']['miners'] + p2pool_stat.totalhashes = data['pool_statistics']['totalHashes'] + p2pool_stat.totalblocksfound = data['pool_statistics']['totalBlocksFound'] + p2pool_stat.mini = False + p2pool_stat.save() + print('p2pool saved!') + gc = pygsheets.authorize(service_file='service_account_credentials.json') + sh = gc.open('zcash_bitcoin') + wks = sh.worksheet_by_title('p2pool') + values_mat = wks.get_values(start=(3,1), end=(9999,3), returnas='matrix') + k = len(values_mat) + date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') + date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') + if date_aux < date_aux2: + cell = 'F' + str(k + 3) + wks.update_value(cell, p2pool_stat.totalblocksfound) + cell = 'E' + str(k + 3) + wks.update_value(cell, p2pool_stat.totalhashes) + cell = 'D' + str(k + 3) + wks.update_value(cell, p2pool_stat.percentage) + cell = 'C' + str(k + 3) + wks.update_value(cell, p2pool_stat.hashrate) + cell = 'B' + str(k + 3) + wks.update_value(cell, p2pool_stat.miners) + cell = 'A' + str(k + 3) + wks.update_value(cell, datetime.datetime.strftime(p2pool_stat.date, '%Y-%m-%d')) + print('spreadsheet updated') + else: + print('spreadsheet already with the latest data') + return data + else: + async with session.get('https://p2pool.io/mini/api/pool/stats') as res: + data = await res.read() + data = json.loads(data) + p2pool_stat.hashrate = data['pool_statistics']['hashRate'] + p2pool_stat.percentage = 100*data['pool_statistics']['hashRate']/coin.hashrate + p2pool_stat.miners = data['pool_statistics']['miners'] + p2pool_stat.totalhashes = data['pool_statistics']['totalHashes'] + p2pool_stat.totalblocksfound = data['pool_statistics']['totalBlocksFound'] + p2pool_stat.mini = True + p2pool_stat.save() + print('p2pool_mini saved!') + gc = pygsheets.authorize(service_file='service_account_credentials.json') + sh = gc.open('zcash_bitcoin') + wks = sh.worksheet_by_title('p2poolmini') + values_mat = wks.get_values(start=(3,1), end=(9999,3), returnas='matrix') + k = len(values_mat) + date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') + date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') + if date_aux < date_aux2: + cell = 'F' + str(k + 3) + wks.update_value(cell, p2pool_stat.totalblocksfound) + cell = 'E' + str(k + 3) + wks.update_value(cell, p2pool_stat.totalhashes) + cell = 'D' + str(k + 3) + wks.update_value(cell, p2pool_stat.percentage) + cell = 'C' + str(k + 3) + wks.update_value(cell, p2pool_stat.hashrate) + cell = 'B' + str(k + 3) + wks.update_value(cell, p2pool_stat.miners) + cell = 'A' + str(k + 3) + wks.update_value(cell, datetime.datetime.strftime(p2pool_stat.date, '%Y-%m-%d')) + print('spreadsheet updated') + else: + print('spreadsheet already with the latest data') + return data + else: + return False + return True + + + + + + + diff --git a/charts/synchronous.py b/charts/synchronous.py new file mode 100644 index 0000000..19efd84 --- /dev/null +++ b/charts/synchronous.py @@ -0,0 +1,669 @@ +from psaw import PushshiftAPI +import pandas as pd +import json +import requests +import datetime +from datetime import date, timedelta +from .models import Coin, Social, P2Pool, Dominance, Rank, Sfmodel, DailyData +from requests import Session +from requests.exceptions import ConnectionError, Timeout, TooManyRedirects +import pygsheets + +#################################################################################### +# Reddit api +#################################################################################### +api = PushshiftAPI() + +# Get daily post on Reddit +def data_prep_posts(subreddit, start_time, end_time, filters, limit): + if(len(filters) == 0): + filters = ['id', 'author', 'created_utc', 'domain', 'url', 'title', 'num_comments'] + + posts = list(api.search_submissions(subreddit=subreddit, after=start_time, before=end_time, filter=filters, limit=limit)) + + return pd.DataFrame(posts) + +# Get daily comments on Reddit +def data_prep_comments(term, start_time, end_time, filters, limit): + if (len(filters) == 0): + filters = ['id', 'author', 'created_utc','body', 'permalink', 'subreddit'] + + comments = list(api.search_comments(q=term, after=start_time, before=end_time, filter=filters, limit=limit)) + return pd.DataFrame(comments) + +#################################################################################### +# Other useful functions +#################################################################################### + +# Get most recent metrics from a data provider of your choice for 'symbol' +def get_latest_metrics(symbol, url): + update = True + count = 0 + + while update: + response = requests.get(url) + data = json.loads(response.text) + data_aux = data['data'] + for item in data_aux: + day, hour = str(item['time']).split('T') + day = datetime.datetime.strptime(day, '%Y-%m-%d') + day = datetime.datetime.strftime(day, '%Y-%m-%d') + try: + coin = Coin.objects.filter(name=symbol).get(date=day) + except: + coin = Coin() + + try: + coin.name = symbol + coin.date = day + try: + coin.priceusd = float(item['PriceUSD']) + except: + coin.priceusd = 0 + try: + coin.pricebtc = float(item['PriceBTC']) + except: + coin.pricebtc = 0 + try: + coin.inflation = float(item['IssContPctAnn']) + coin.stocktoflow = (100/coin.inflation)**1.65 + except: + coin.inflation = 0 + coin.stocktoflow = 0 + try: + coin.supply = float(item['SplyCur']) + except: + coin.supply = 0 + try: + coin.fee = float(item['FeeTotNtv']) + except: + coin.fee = 0 + try: + coin.revenue = float(item['RevNtv']) + except: + coin.revenue = 0 + try: + coin.hashrate = float(item['HashRate']) + except: + coin.hashrate = 0 + try: + coin.transactions = float(item['TxCnt']) + except: + coin.transactions = 0 + + coin.save() + count += 1 + print(str(symbol) + ' ' + str(coin.date)) + + except: + pass + try: + url = data['next_page_url'] + update = True + except: + update = False + break + return count + +# Get latest price data for Monero +def get_latest_price(symbol): + with open("settings.json") as file: + data = json.load(file) + + url = data["metrics_provider"][0]["price_url_old"] + symbol + print(url) + parameters = { + 'convert':'USD', + } + headers = { + 'Accepts': 'application/json', + data["metrics_provider"][0]["api_key_name"]: data["metrics_provider"][0]["api_key_value"], + } + + session = Session() + session.headers.update(headers) + + try: + response = session.get(url, params=parameters) + print(response) + data = json.loads(response.text) + print('getting latest data') + print(data) + try: + if data['data'][symbol.upper()]['cmc_rank']: + print('new data received') + pass + else: + print('problem with the data provider') + data = False + except: + data = False + except (ConnectionError, Timeout, TooManyRedirects) as e: + data = False + + file.close() + return data + +# Get latest dominance value and update +def update_dominance(data): + if not(data): + print('error updating dominance') + return False + else: + dominance = Dominance() + dominance.name = 'xmr' + dominance.date = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + dominance.dominance = float(data['data']['XMR']['quote']['USD']['market_cap_dominance']) + dominance.save() + + gc = pygsheets.authorize(service_file='service_account_credentials.json') + sh = gc.open('zcash_bitcoin') + wks = sh.worksheet_by_title('Sheet7') + + values_mat = wks.get_values(start=(3,1), end=(9999,2), returnas='matrix') + + k = len(values_mat) + date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') + date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') + if date_aux < date_aux2: + cell = 'B' + str(k + 3) + wks.update_value(cell, dominance.dominance) + cell = 'A' + str(k + 3) + wks.update_value(cell, dominance.date) + print('spreadsheet updated') + else: + print('spreadsheet already with the latest data') + return False + return data + +# Get latest rank value and update +def update_rank(data=None): + if not(data): + data = get_latest_price('xmr') + if not(data): + print('error updating rank') + return False + else: + rank = Rank() + rank.name = 'xmr' + rank.date = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + rank.rank = int(data['data']['XMR']['cmc_rank']) + rank.save() + + gc = pygsheets.authorize(service_file='service_account_credentials.json') + sh = gc.open('zcash_bitcoin') + wks = sh.worksheet_by_title('Sheet8') + + values_mat = wks.get_values(start=(3,1), end=(9999,2), returnas='matrix') + + k = len(values_mat) + date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') + date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') + if date_aux < date_aux2: + cell = 'B' + str(k + 3) + wks.update_value(cell, rank.rank) + cell = 'A' + str(k + 3) + wks.update_value(cell, rank.date) + print('spreadsheet updated') + else: + print('spreadsheet already with the latest data') + return data + + return data + +# Load Reddit api to check if there are new followers +def check_new_social(symbol): + date_now = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + socials = Social.objects.filter(name=symbol).filter(date=date_now) + + if not(socials): + print('getting new data') + request = 'https://www.reddit.com/r/'+ symbol +'/about.json' + response = requests.get(request, headers = {'User-agent': 'Checking new social data'}) + data = json.loads(response.content) + data = data['data'] + subscribers = data['subscribers'] + social = Social() + social.name = symbol + social.date = date_now + social.subscriberCount = subscribers + + date_aux = date.today() + date_aux = datetime.datetime.strftime(date_aux, '%Y-%m-%d') + date_aux = datetime.datetime.strptime(date_aux, '%Y-%m-%d') + timestamp1 = int(datetime.datetime.timestamp(date_aux)) + + timestamp2 = int(timestamp1 - 43200) + limit = 1000 + filters = [] + data = data_prep_posts(symbol, timestamp2, timestamp1, filters, limit) + print(len(data)) + social.postsPerHour = len(data)/12 + + timestamp2 = int(timestamp1 - 3600) + limit = 1000 + data = data_prep_comments(symbol, timestamp2, timestamp1, filters, limit) + print(len(data)) + social.commentsPerHour = len(data)/1 + social.save() + return True + +# Update database DailyData with most recent coin data +def update_database(date_from=None, date_to=None): + date_zero = '2014-05-20' + + if not(date_from) or not(date_to): + date_to = date.today() + date_from = date_to - timedelta(5) + amount = date_from - datetime.datetime.strptime(date_zero, '%Y-%m-%d') + else: + print(str(date_from) + ' to ' + str(date_to)) + date_from = datetime.datetime.strptime(date_from, '%Y-%m-%d') + date_to = datetime.datetime.strptime(date_to, '%Y-%m-%d') + amount = date_from - datetime.datetime.strptime(date_zero, '%Y-%m-%d') + + count = 0 + date_aux = date_from + while date_aux <= date_to: + date_aux = date_from + timedelta(count) + date_aux2 = date_aux - timedelta(1) + try: + coin_xmr = Coin.objects.filter(name='xmr').get(date=date_aux) + coin_xmr2 = Coin.objects.filter(name='xmr').get(date=date_aux2) + coin_btc = Coin.objects.filter(name='btc').get(date=date_aux) + coin_btc2 = Coin.objects.filter(name='btc').get(date=date_aux2) + try: + coin_dash = Coin.objects.filter(name='dash').get(date=date_aux) + except: + coin_dash = Coin() + try: + coin_zcash = Coin.objects.filter(name='zec').get(date=date_aux) + except: + coin_zcash = Coin() + try: + coin_grin = Coin.objects.filter(name='grin').get(date=date_aux) + except: + coin_grin = Coin() + + if coin_btc.inflation == 0 or coin_xmr.inflation == 0: + return count + + count_aux = 0 + found = False + while count_aux < 100 and not(found): + + try: + date_aux2 = date_aux - timedelta(count_aux) + social_btc = Social.objects.filter(name='Bitcoin').get(date=date_aux2) + social_xmr = Social.objects.filter(name='Monero').get(date=date_aux2) + social_crypto = Social.objects.filter(name='CryptoCurrency').get(date=date_aux2) + found = True + + except: + count_aux += 1 + found = False + except: + return count + + try: + data = Sfmodel.objects.get(date=coin_xmr.date) + + except: + data = Sfmodel() + data.priceusd = 0 + data.pricebtc = 0 + data.stocktoflow = 0 + data.greyline = 0 + data.color = 0 + data.date = coin_xmr.date + data.pricebtc = coin_xmr.pricebtc + data.priceusd = coin_xmr.priceusd + if data.stocktoflow == 0 and coin_xmr.supply > 0: + supply = int(coin_xmr.supply)*10**12 + reward = (2**64 -1 - supply) >> 19 + if reward < 0.6*(10**12): + reward = 0.6*(10**12) + inflation = 100*reward*720*365/supply + data.stocktoflow = (100/(inflation))**1.65 + v0 = 0.002 + delta = (0.015 - 0.002)/(6*365) + data.color = 30*coin_xmr.pricebtc/((amount.days)*delta + v0) + amount += timedelta(1) + data.save() + + try: + data = DailyData.objects.get(date=coin_xmr.date) + except: + data = DailyData() + # Date field + data.date = coin_xmr.date + # Basic information + data.btc_priceusd = 0 + data.xmr_priceusd = 0 + data.xmr_pricebtc = 0 + # Marketcap charts + data.btc_marketcap = 0 + data.xmr_marketcap = 0 + data.dash_marketcap = 0 + data.grin_marketcap = 0 + data.zcash_marketcap = 0 + # Transactions charts + data.xmr_transacpercentage = 0 + data.btc_transactions = 0 + data.zcash_transactions = 0 + data.dash_transactions = 0 + data.grin_transactions = 0 + data.xmr_transactions = 0 + data.btc_supply = 0 + data.xmr_supply = 0 + # Issuance charts + data.btc_inflation = 0 + data.xmr_inflation = 0 + data.dash_inflation = 0 + data.grin_inflation = 0 + data.zcash_inflation = 0 + data.xmr_metcalfebtc = 0 + data.xmr_metcalfeusd = 0 + data.btc_return = 0 + data.xmr_return = 0 + data.btc_emissionusd = 0 + data.btc_emissionntv = 0 + data.xmr_emissionusd = 0 + data.xmr_emissionntv = 0 + # Mining charts + data.btc_minerrevntv = 0 + data.xmr_minerrevntv = 0 + data.btc_minerrevusd = 0 + data.xmr_minerrevusd = 0 + data.btc_minerfeesntv = 0 + data.xmr_minerfeesntv = 0 + data.btc_minerfeesusd = 0 + data.xmr_minerfeesusd = 0 + data.btc_transcostntv = 0 + data.xmr_transcostntv = 0 + data.btc_transcostusd = 0 + data.xmr_transcostusd = 0 + data.xmr_minerrevcap = 0 + data.btc_minerrevcap = 0 + data.btc_commitntv = 0 + data.xmr_commitntv = 0 + data.btc_commitusd = 0 + data.xmr_commitusd = 0 + data.btc_blocksize = 0 + data.xmr_blocksize = 0 + data.btc_difficulty = 0 + data.xmr_difficulty = 0 + # Reddit charts + data.btc_subscriberCount = 0 + data.btc_commentsPerHour = 0 + data.btc_postsPerHour = 0 + data.xmr_subscriberCount = 0 + data.xmr_commentsPerHour = 0 + data.xmr_postsPerHour = 0 + data.crypto_subscriberCount = 0 + data.crypto_commentsPerHour = 0 + data.crypto_postsPerHour = 0 + + # Date field + data.date = coin_xmr.date + # Basic information + data.btc_priceusd = coin_btc.priceusd + data.xmr_priceusd = coin_xmr.priceusd + data.xmr_pricebtc = coin_xmr.pricebtc + # Marketcap charts + data.btc_marketcap = coin_btc.priceusd*coin_btc.supply + data.xmr_marketcap = coin_xmr.priceusd*coin_xmr.supply + data.dash_marketcap = coin_dash.priceusd*coin_dash.supply + data.grin_marketcap = coin_grin.priceusd*coin_grin.supply + data.zcash_marketcap = coin_zcash.priceusd*coin_zcash.supply + + # Transactions charts + try: + data.xmr_transacpercentage = coin_xmr.transactions/coin_btc.transactions + except: + pass + data.xmr_transactions = coin_xmr.transactions + data.btc_transactions = coin_btc.transactions + data.zcash_transactions = coin_zcash.transactions + data.dash_transactions = coin_dash.transactions + data.grin_transactions = coin_grin.transactions + data.btc_supply = coin_btc.supply + data.xmr_supply = coin_xmr.supply + # Issuance charts + data.btc_inflation = coin_btc.inflation + data.xmr_inflation = coin_xmr.inflation + data.dash_inflation = coin_dash.inflation + data.grin_inflation = coin_grin.inflation + data.zcash_inflation = coin_zcash.inflation + try: + data.xmr_metcalfebtc = coin_xmr.transactions*coin_xmr.supply/(coin_btc.supply*coin_btc.transactions) + data.xmr_metcalfeusd = coin_btc.priceusd*coin_xmr.transactions*coin_xmr.supply/(coin_btc.supply*coin_btc.transactions) + except: + pass + data.btc_return = coin_btc.priceusd/30 + data.xmr_return = coin_xmr.priceusd/5.01 + data.btc_emissionusd = (coin_btc.supply - coin_btc2.supply)*coin_btc.priceusd + data.btc_emissionntv = coin_btc.supply - coin_btc2.supply + data.xmr_emissionusd = (coin_xmr.supply - coin_xmr2.supply)*coin_xmr.priceusd + data.xmr_emissionntv = coin_xmr.supply - coin_xmr2.supply + # Mining charts + data.btc_minerrevntv = coin_btc.revenue + data.xmr_minerrevntv = coin_xmr.revenue + data.btc_minerrevusd = coin_btc.revenue*coin_btc.priceusd + data.xmr_minerrevusd = coin_xmr.revenue*coin_xmr.priceusd + data.btc_minerfeesntv = coin_btc.revenue - coin_btc.supply + coin_btc2.supply + data.xmr_minerfeesntv = coin_xmr.revenue - coin_xmr.supply + coin_xmr2.supply + data.btc_minerfeesusd = (coin_btc.revenue - coin_btc.supply + coin_btc2.supply)*coin_btc.priceusd + data.xmr_minerfeesusd = (coin_xmr.revenue - coin_xmr.supply + coin_xmr2.supply)*coin_xmr.priceusd + try: + data.btc_transcostntv = coin_btc.fee/coin_btc.transactions + data.xmr_transcostntv = coin_xmr.fee/coin_xmr.transactions + data.btc_transcostusd = coin_btc.priceusd*coin_btc.fee/coin_btc.transactions + data.xmr_transcostusd = coin_xmr.priceusd*coin_xmr.fee/coin_xmr.transactions + except: + pass + try: + data.xmr_minerrevcap = 365*100*coin_xmr.revenue/coin_xmr.supply + data.btc_minerrevcap = 365*100*coin_btc.revenue/coin_btc.supply + except: + pass + try: + data.btc_commitntv = coin_btc.hashrate/(coin_btc.revenue) + data.xmr_commitntv = coin_xmr.hashrate/(coin_xmr.revenue) + data.btc_commitusd = coin_btc.hashrate/(coin_btc.revenue*coin_btc.priceusd) + data.xmr_commitusd = coin_xmr.hashrate/(coin_xmr.revenue*coin_xmr.priceusd) + except: + pass + try: + data.btc_blocksize = coin_btc.blocksize + data.xmr_blocksize = coin_xmr.blocksize + data.btc_difficulty = coin_btc.difficulty + data.xmr_difficulty = coin_xmr.difficulty + except: + pass + # Reddit charts + try: + data.btc_subscriberCount = social_btc.subscriberCount + data.btc_commentsPerHour = social_btc.commentsPerHour + data.btc_postsPerHour = social_btc.postsPerHour + data.xmr_subscriberCount = social_xmr.subscriberCount + data.xmr_commentsPerHour = social_xmr.commentsPerHour + data.xmr_postsPerHour = social_xmr.postsPerHour + data.crypto_subscriberCount = social_crypto.subscriberCount + data.crypto_commentsPerHour = social_crypto.commentsPerHour + data.crypto_postsPerHour = social_crypto.postsPerHour + except: + data.btc_subscriberCount = 0 + data.btc_commentsPerHour = 0 + data.btc_postsPerHour = 0 + data.xmr_subscriberCount = 0 + data.xmr_commentsPerHour = 0 + data.xmr_postsPerHour = 0 + data.crypto_subscriberCount = 0 + data.crypto_commentsPerHour = 0 + data.crypto_postsPerHour = 0 + + data.save() + print(str(coin_xmr.date) + ' - ' + str(int(coin_xmr.supply)) + ' xmr @ ' + str(coin_xmr.priceusd) + ' = ' + str(int(data.xmr_marketcap)) + ' => ' + str(coin_xmr.inflation)) + + count += 1 + + return count + +# Get latest P2Pool data +def update_p2pool(): + today = date.today() + yesterday = date.today() - timedelta(1) + try: + p2pool_stat = P2Pool.objects.filter(mini=False).get(date=today) + print('achou p2pool de hoje') + if p2pool_stat.percentage > 0: + print('porcentagem > 0') + update = False + else: + print('porcentagem < 0') + p2pool_stat.delete() + try: + coin = Coin.objects.filter(name='xmr').get(date=yesterday) + print('achou coin de ontem') + if coin.hashrate > 0: + update = True + else: + update = False + except: + print('nao achou coin de ontem') + update = False + except: + print('nao achou p2pool de hoje') + try: + coin = Coin.objects.filter(name='xmr').get(date=yesterday) + if coin.hashrate > 0: + update = True + else: + update = False + except: + update = False + + if update: + p2pool_stat = P2Pool() + p2pool_stat.date = today + response = requests.get('https://p2pool.io/api/pool/stats') + + data = json.loads(response.text) + p2pool_stat.hashrate = data['pool_statistics']['hashRate'] + p2pool_stat.percentage = 100*data['pool_statistics']['hashRate']/coin.hashrate + p2pool_stat.miners = data['pool_statistics']['miners'] + p2pool_stat.totalhashes = data['pool_statistics']['totalHashes'] + p2pool_stat.totalblocksfound = data['pool_statistics']['totalBlocksFound'] + p2pool_stat.mini = False + p2pool_stat.save() + print('p2pool saved!') + + gc = pygsheets.authorize(service_file='service_account_credentials.json') + sh = gc.open('zcash_bitcoin') + wks = sh.worksheet_by_title('p2pool') + + values_mat = wks.get_values(start=(3,1), end=(9999,3), returnas='matrix') + + k = len(values_mat) + date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') + date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') + if date_aux < date_aux2: + cell = 'F' + str(k + 3) + wks.update_value(cell, p2pool_stat.totalblocksfound) + cell = 'E' + str(k + 3) + wks.update_value(cell, p2pool_stat.totalhashes) + cell = 'D' + str(k + 3) + wks.update_value(cell, p2pool_stat.percentage) + cell = 'C' + str(k + 3) + wks.update_value(cell, p2pool_stat.hashrate) + cell = 'B' + str(k + 3) + wks.update_value(cell, p2pool_stat.miners) + cell = 'A' + str(k + 3) + wks.update_value(cell, datetime.datetime.strftime(p2pool_stat.date, '%Y-%m-%d')) + print('spreadsheet updated') + else: + print('spreadsheet already with the latest data') + return data + + today = date.today() + yesterday = date.today() - timedelta(1) + try: + p2pool_stat = P2Pool.objects.filter(mini=True).get(date=today) + print('achou p2pool_mini de hoje') + if p2pool_stat.percentage > 0: + + print('porcentagem > 0') + update = False + else: + print('porcentagem < 0') + p2pool_stat.delete() + try: + coin = Coin.objects.filter(name='xmr').get(date=yesterday) + + print('achou coin de ontem') + if coin.hashrate > 0: + update = True + else: + update = False + except: + print('nao achou coin de ontem') + update = False + except: + print('nao achou p2pool_mini de hoje') + try: + coin = Coin.objects.filter(name='xmr').get(date=yesterday) + if coin.hashrate > 0: + update = True + else: + update = False + except: + update = False + + if update: + p2pool_stat = P2Pool() + p2pool_stat.date = today + response = requests.get('https://p2pool.io/mini/api/pool/stats') + + data = json.loads(response.text) + p2pool_stat.hashrate = data['pool_statistics']['hashRate'] + p2pool_stat.percentage = 100*data['pool_statistics']['hashRate']/coin.hashrate + p2pool_stat.miners = data['pool_statistics']['miners'] + p2pool_stat.totalhashes = data['pool_statistics']['totalHashes'] + p2pool_stat.totalblocksfound = data['pool_statistics']['totalBlocksFound'] + p2pool_stat.mini = True + p2pool_stat.save() + print('p2pool_mini saved!') + + gc = pygsheets.authorize(service_file='service_account_credentials.json') + sh = gc.open('zcash_bitcoin') + wks = sh.worksheet_by_title('p2poolmini') + + values_mat = wks.get_values(start=(3,1), end=(9999,3), returnas='matrix') + + k = len(values_mat) + date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') + date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') + date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') + if date_aux < date_aux2: + cell = 'F' + str(k + 3) + wks.update_value(cell, p2pool_stat.totalblocksfound) + cell = 'E' + str(k + 3) + wks.update_value(cell, p2pool_stat.totalhashes) + cell = 'D' + str(k + 3) + wks.update_value(cell, p2pool_stat.percentage) + cell = 'C' + str(k + 3) + wks.update_value(cell, p2pool_stat.hashrate) + cell = 'B' + str(k + 3) + wks.update_value(cell, p2pool_stat.miners) + cell = 'A' + str(k + 3) + wks.update_value(cell, datetime.datetime.strftime(p2pool_stat.date, '%Y-%m-%d')) + print('spreadsheet updated') + else: + print('spreadsheet already with the latest data') + return data + + return True diff --git a/charts/views.py b/charts/views.py index 8d3e742..fadaf8d 100644 --- a/charts/views.py +++ b/charts/views.py @@ -16,6 +16,8 @@ from requests.exceptions import ConnectionError, Timeout, TooManyRedirects import math import locale import pandas as pd +from . import asynchronous +from . import synchronous from operator import truediv from datetime import timezone import aiohttp @@ -23,374 +25,12 @@ import asyncio import pygsheets from django.contrib.auth.decorators import login_required from requests import Session -from psaw import PushshiftAPI from django.contrib.staticfiles.storage import staticfiles_storage ########################################### # Set some parameters ########################################### - locale.setlocale(locale.LC_ALL, 'en_US.utf8') -# This loads Reddit stats about a subreddit -api = PushshiftAPI() - -########################################## -# Asynchronous get block data -########################################## -async def get_block_data(session, block: str): - url = 'https://xmrchain.net/api/block/' + block - async with session.get(url) as res: - data = await res.read() - data = json.loads(data) - data['provider'] = 'block_data_xmrchain' - if res.status < 299: - data['success'] = True - else: - data['success'] = False - return data - -########################################## -# Asynchronous get network data -########################################## -async def get_network_data(session, block: str): - url = 'https://xmrchain.net/api/networkinfo' - async with session.get(url) as res: - data = await res.read() - data = json.loads(data) - data['provider'] = 'network_data_xmrchain' - if res.status < 299: - data['success'] = True - else: - data['success'] = False - return data - -########################################## -# Asynchronous get other coins data -########################################## -async def get_coin_data(session, symbol, url): - update = True - count = 0 - - while update: - async with session.get(url) as res: - data = await res.read() - data = json.loads(data) - data_aux = data['data'] - for item in data_aux: - day, hour = str(item['time']).split('T') - day = datetime.datetime.strptime(day, '%Y-%m-%d') - day = datetime.datetime.strftime(day, '%Y-%m-%d') - try: - coin = Coin.objects.filter(name=symbol).get(date=day) - except: - coin = Coin() - - try: - coin.name = symbol - coin.date = day - try: - coin.priceusd = float(item['PriceUSD']) - except: - coin.priceusd = 0 - try: - coin.pricebtc = float(item['PriceBTC']) - except: - coin.pricebtc = 0 - try: - coin.inflation = float(item['IssContPctAnn']) - coin.stocktoflow = (100/coin.inflation)**1.65 - except: - coin.inflation = 0 - coin.stocktoflow = 0 - try: - coin.supply = float(item['SplyCur']) - except: - coin.supply = 0 - try: - coin.fee = float(item['FeeTotNtv']) - except: - coin.fee = 0 - try: - coin.revenue = float(item['RevNtv']) - except: - coin.revenue = 0 - try: - coin.hashrate = float(item['HashRate']) - except: - coin.hashrate = 0 - try: - coin.transactions = float(item['TxCnt']) - except: - coin.transactions = 0 - - coin.save() - count += 1 - print(str(symbol) + ' ' + str(coin.date)) - - except: - pass - try: - url = data['next_page_url'] - update = True - except: - update = False - break - - return count - -########################################## -# Asynchronous get other coins data -########################################## -async def get_social_data(session, symbol): - date_now = datetime.datetime.strftime(date.today(), '%Y-%m-%d') - socials = Social.objects.filter(name=symbol).filter(date=date_now) - - if not(socials): - print('getting new data') - url = 'https://www.reddit.com/r/'+ symbol +'/about.json' - - async with session.get(url, headers={'User-agent': 'Checking new social data'}) as res: - data = await res.read() - data = json.loads(data) - data = data['data'] - subscribers = data['subscribers'] - social = Social() - social.name = symbol - social.date = date_now - social.subscriberCount = subscribers - - date_aux = date.today() - date_aux = datetime.datetime.strftime(date_aux, '%Y-%m-%d') - date_aux = datetime.datetime.strptime(date_aux, '%Y-%m-%d') - timestamp1 = int(datetime.datetime.timestamp(date_aux)) - - timestamp2 = int(timestamp1 - 43200) - limit = 1000 - filters = [] - data = data_prep_posts(symbol, timestamp2, timestamp1, filters, limit) - print(len(data)) - social.postsPerHour = len(data)/12 - - timestamp2 = int(timestamp1 - 3600) - limit = 1000 - data = data_prep_comments(symbol, timestamp2, timestamp1, filters, limit) - print(len(data)) - social.commentsPerHour = len(data)/1 - social.save() - return True - -########################################## -# Asynchronous get social and coins data -########################################## -async def update_others_data(date): - with open("settings.json") as file: - data = json.load(file) - file.close() - - url_btc = data["metrics_provider"][0]["metrics_url_new"] + 'btc/' + date - url_dash = data["metrics_provider"][0]["metrics_url_new"] + 'dash/' + date - url_grin = data["metrics_provider"][0]["metrics_url_new"] + 'grin/' + date - url_zec = data["metrics_provider"][0]["metrics_url_new"] + 'zec/' + date - - ########################################## - # Asynchronous - ########################################## - - actions = [] - my_timeout = aiohttp.ClientTimeout( - total=10, - sock_connect=10, - sock_read=10 - ) - client_args = dict( - trust_env=True, - timeout=my_timeout - ) - - async with aiohttp.ClientSession(**client_args) as session: - # reddit data - actions.append(asyncio.ensure_future(get_social_data(session, 'Monero'))) - actions.append(asyncio.ensure_future(get_social_data(session, 'Bitcoin'))) - actions.append(asyncio.ensure_future(get_social_data(session, 'Cryptocurrency'))) - # coinmetrics data - actions.append(asyncio.ensure_future(get_coin_data(session, 'btc', url_btc))) - actions.append(asyncio.ensure_future(get_coin_data(session, 'dash', url_dash))) - actions.append(asyncio.ensure_future(get_coin_data(session, 'grin', url_grin))) - actions.append(asyncio.ensure_future(get_coin_data(session, 'zec', url_zec))) - - try: - responses = await asyncio.gather(*actions, return_exceptions=True) - except asyncio.exceptions.TimeoutError: - print('Timeout!') - - print('p2pool') - update_p2pool() - - print('updating database') - update_database(date, date) - print('done') - - return True - - - - - - -########################################## -# Asynchronous get whole xmr data -########################################## -async def update_xmr_data(date, coin): - supply = coin.supply - inflation = coin.inflation - yesterday = date - url = 'https://xmrchain.net/api/networkinfo' - response = requests.get(url) - data = json.loads(response.text) - height = int(data['data']['height']) - difficulty = int(data['data']['difficulty']) - hashrate = int(data['data']['hash_rate']) - blocksize = 0 - name = 'xmr' - - ########################################## - # Asynchronous - ########################################## - - actions = [] - my_timeout = aiohttp.ClientTimeout( - total=10, - sock_connect=10, - sock_read=10 - ) - client_args = dict( - trust_env=True, - timeout=my_timeout - ) - - async with aiohttp.ClientSession(**client_args) as session: - for count in range(1, 1400): - block = str(height - count) - actions.append(asyncio.ensure_future(get_block_data(session, block))) - actions.append(asyncio.ensure_future(get_coinmarketcap_data(session, 'xmr', 'USD'))) - actions.append(asyncio.ensure_future(get_coinmarketcap_data(session, 'xmr', 'BTC'))) - - try: - responses = await asyncio.gather(*actions, return_exceptions=True) - except asyncio.exceptions.TimeoutError: - print('Timeout!') - - errors = 0 - success = 0 - txs = 0 - revenue = 0 - fees = 0 - priceusd = 0 - pricebtc = 0 - for response in responses: - if response: - try: - if response['provider'] == 'block_data_xmrchain': - date_aux = response['data']['timestamp_utc'].split(' ')[0] - if date_aux == yesterday: - success += 1 - try: - blocksize += int(response['data']['size']) - for tx in response['data']['txs']: - if tx['coinbase']: - revenue += int(tx['xmr_outputs']) - else: - txs += 1 - fees += int(tx['tx_fee']) - revenue += int(tx['tx_fee']) - except: - errors += 1 - - if response['provider'] == 'coinmarketcap': - try: - priceusd = float(response['data']['XMR']['quote']['USD']['price']) - update_rank(response) - update_dominance(response) - except: - try: - pricebtc = float(response['data']['XMR']['quote']['BTC']['price']) - except: - errors += 1 - except: - errors += 1 - else: - errors += 1 - - blocksize = blocksize/success - revenue = float(revenue)/10**12 - fees = float(fees)/10**12 - inflation = 100*365*(revenue)/float(coin.supply) - stocktoflow = (100/inflation)**1.65 - supply = coin.supply + revenue - - print('Name: ' + name) - print('Date: ' + str(yesterday)) - print('Success: ' + str(success)) - print('Errors: ' + str(errors)) - print('Blocksize: ' + str(blocksize)) - print('Transactions: ' + str(txs)) - print('Revenue: ' + str(revenue)) - print('Fees: ' + str(fees)) - print('Inflation: ' + str(inflation)) - print('Hashrate: ' + str(hashrate)) - print('Difficulty: ' + str(difficulty)) - print('Stocktoflow: ' + str(stocktoflow)) - print('Priceusd: ' + str(priceusd)) - print('Pricebtc: ' + str(pricebtc)) - print('Supply: ' + str(supply)) - - try: - coin = Coin() - coin.name = name - coin.date = datetime.datetime.strptime(yesterday, '%Y-%m-%d') - coin.blocksize = blocksize - coin.transactions = txs - coin.revenue = revenue - coin.fee = fees - coin.inflation = inflation - coin.hashrate = hashrate - coin.difficulty = difficulty - coin.stocktoflow = stocktoflow - coin.priceusd = priceusd - coin.pricebtc = pricebtc - coin.supply = supply - coin.save() - except: - return False - return True - -########################################## -# Asynchronous get coinmarketcap data -########################################## -async def get_coinmarketcap_data(session, symbol: str, convert: str): - with open("settings.json") as file: - data = json.load(file) - file.close() - - url = data["metrics_provider"][0]["price_url_old"] + symbol - parameters = {'convert': convert,} - headers = {'Accepts': 'application/json', data["metrics_provider"][0]["api_key_name"]: data["metrics_provider"][0]["api_key_value"],} - - async with session.get(url, headers=headers, params=parameters) as res: - data = await res.read() - data = json.loads(data) - data['provider'] = 'coinmarketcap' - if res.status < 299: - try: - if data['data'][symbol.upper()]['cmc_rank']: - data['success'] = True - else: - data['success'] = False - except: - data['success'] = False - else: - data['success'] = False - return data ########################################### # Useful functions for admins @@ -1244,668 +884,6 @@ def update_database_admin(request, date_from, date_to): context = {'message': message} return render(request, 'charts/maintenance.html', context) -########################################### -# Other useful functions -########################################### - -# Get most recent metrics from a data provider of your choice for 'symbol' -def get_latest_metrics(symbol, url): - update = True - count = 0 - - while update: - response = requests.get(url) - data = json.loads(response.text) - data_aux = data['data'] - for item in data_aux: - day, hour = str(item['time']).split('T') - day = datetime.datetime.strptime(day, '%Y-%m-%d') - day = datetime.datetime.strftime(day, '%Y-%m-%d') - try: - coin = Coin.objects.filter(name=symbol).get(date=day) - except: - coin = Coin() - - try: - coin.name = symbol - coin.date = day - try: - coin.priceusd = float(item['PriceUSD']) - except: - coin.priceusd = 0 - try: - coin.pricebtc = float(item['PriceBTC']) - except: - coin.pricebtc = 0 - try: - coin.inflation = float(item['IssContPctAnn']) - coin.stocktoflow = (100/coin.inflation)**1.65 - except: - coin.inflation = 0 - coin.stocktoflow = 0 - try: - coin.supply = float(item['SplyCur']) - except: - coin.supply = 0 - try: - coin.fee = float(item['FeeTotNtv']) - except: - coin.fee = 0 - try: - coin.revenue = float(item['RevNtv']) - except: - coin.revenue = 0 - try: - coin.hashrate = float(item['HashRate']) - except: - coin.hashrate = 0 - try: - coin.transactions = float(item['TxCnt']) - except: - coin.transactions = 0 - - coin.save() - count += 1 - print(str(symbol) + ' ' + str(coin.date)) - - except: - pass - try: - url = data['next_page_url'] - update = True - except: - update = False - break - - return count - -# Get daily post on Reddit -def data_prep_posts(subreddit, start_time, end_time, filters, limit): - if(len(filters) == 0): - filters = ['id', 'author', 'created_utc', 'domain', 'url', 'title', 'num_comments'] - - posts = list(api.search_submissions(subreddit=subreddit, after=start_time, before=end_time, filter=filters, limit=limit)) - - return pd.DataFrame(posts) - -# Get daily comments on Reddit -def data_prep_comments(term, start_time, end_time, filters, limit): - if (len(filters) == 0): - filters = ['id', 'author', 'created_utc','body', 'permalink', 'subreddit'] - - comments = list(api.search_comments(q=term, after=start_time, before=end_time, filter=filters, limit=limit)) - return pd.DataFrame(comments) - -# Get latest price data for Monero -def get_latest_price(symbol): - with open("settings.json") as file: - data = json.load(file) - - url = data["metrics_provider"][0]["price_url_old"] + symbol - print(url) - parameters = { - 'convert':'USD', - } - headers = { - 'Accepts': 'application/json', - data["metrics_provider"][0]["api_key_name"]: data["metrics_provider"][0]["api_key_value"], - } - - session = Session() - session.headers.update(headers) - - try: - response = session.get(url, params=parameters) - print(response) - data = json.loads(response.text) - print('getting latest data') - print(data) - try: - if data['data'][symbol.upper()]['cmc_rank']: - print('new data received') - pass - else: - print('problem with the data provider') - data = False - except: - data = False - except (ConnectionError, Timeout, TooManyRedirects) as e: - data = False - - file.close() - return data - -# Get latest dominance value and update -def update_dominance(data): - if not(data): - print('error updating dominance') - return False - else: - dominance = Dominance() - dominance.name = 'xmr' - dominance.date = datetime.datetime.strftime(date.today(), '%Y-%m-%d') - dominance.dominance = float(data['data']['XMR']['quote']['USD']['market_cap_dominance']) - dominance.save() - - gc = pygsheets.authorize(service_file='service_account_credentials.json') - sh = gc.open('zcash_bitcoin') - wks = sh.worksheet_by_title('Sheet7') - - values_mat = wks.get_values(start=(3,1), end=(9999,2), returnas='matrix') - - k = len(values_mat) - date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') - date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') - date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') - if date_aux < date_aux2: - cell = 'B' + str(k + 3) - wks.update_value(cell, dominance.dominance) - cell = 'A' + str(k + 3) - wks.update_value(cell, dominance.date) - print('spreadsheet updated') - else: - print('spreadsheet already with the latest data') - return False - return data - -# Get latest rank value and update -def update_rank(data=None): - if not(data): - data = get_latest_price('xmr') - if not(data): - print('error updating rank') - return False - else: - rank = Rank() - rank.name = 'xmr' - rank.date = datetime.datetime.strftime(date.today(), '%Y-%m-%d') - rank.rank = int(data['data']['XMR']['cmc_rank']) - rank.save() - - gc = pygsheets.authorize(service_file='service_account_credentials.json') - sh = gc.open('zcash_bitcoin') - wks = sh.worksheet_by_title('Sheet8') - - values_mat = wks.get_values(start=(3,1), end=(9999,2), returnas='matrix') - - k = len(values_mat) - date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') - date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') - date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') - if date_aux < date_aux2: - cell = 'B' + str(k + 3) - wks.update_value(cell, rank.rank) - cell = 'A' + str(k + 3) - wks.update_value(cell, rank.date) - print('spreadsheet updated') - else: - print('spreadsheet already with the latest data') - return data - - return data - -# Load Reddit api to check if there are new followers -def check_new_social(symbol): - date_now = datetime.datetime.strftime(date.today(), '%Y-%m-%d') - socials = Social.objects.filter(name=symbol).filter(date=date_now) - - if not(socials): - print('getting new data') - request = 'https://www.reddit.com/r/'+ symbol +'/about.json' - response = requests.get(request, headers = {'User-agent': 'Checking new social data'}) - data = json.loads(response.content) - data = data['data'] - subscribers = data['subscribers'] - social = Social() - social.name = symbol - social.date = date_now - social.subscriberCount = subscribers - - date_aux = date.today() - date_aux = datetime.datetime.strftime(date_aux, '%Y-%m-%d') - date_aux = datetime.datetime.strptime(date_aux, '%Y-%m-%d') - timestamp1 = int(datetime.datetime.timestamp(date_aux)) - - timestamp2 = int(timestamp1 - 43200) - limit = 1000 - filters = [] - data = data_prep_posts(symbol, timestamp2, timestamp1, filters, limit) - print(len(data)) - social.postsPerHour = len(data)/12 - - timestamp2 = int(timestamp1 - 3600) - limit = 1000 - data = data_prep_comments(symbol, timestamp2, timestamp1, filters, limit) - print(len(data)) - social.commentsPerHour = len(data)/1 - social.save() - return True - -# Update database DailyData with most recent coin data -def update_database(date_from=None, date_to=None): - date_zero = '2014-05-20' - - if not(date_from) or not(date_to): - date_to = date.today() - date_from = date_to - timedelta(5) - amount = date_from - datetime.datetime.strptime(date_zero, '%Y-%m-%d') - else: - print(str(date_from) + ' to ' + str(date_to)) - date_from = datetime.datetime.strptime(date_from, '%Y-%m-%d') - date_to = datetime.datetime.strptime(date_to, '%Y-%m-%d') - amount = date_from - datetime.datetime.strptime(date_zero, '%Y-%m-%d') - - count = 0 - date_aux = date_from - while date_aux <= date_to: - date_aux = date_from + timedelta(count) - date_aux2 = date_aux - timedelta(1) - try: - coin_xmr = Coin.objects.filter(name='xmr').get(date=date_aux) - coin_xmr2 = Coin.objects.filter(name='xmr').get(date=date_aux2) - coin_btc = Coin.objects.filter(name='btc').get(date=date_aux) - coin_btc2 = Coin.objects.filter(name='btc').get(date=date_aux2) - try: - coin_dash = Coin.objects.filter(name='dash').get(date=date_aux) - except: - coin_dash = Coin() - try: - coin_zcash = Coin.objects.filter(name='zec').get(date=date_aux) - except: - coin_zcash = Coin() - try: - coin_grin = Coin.objects.filter(name='grin').get(date=date_aux) - except: - coin_grin = Coin() - - - if coin_btc.inflation == 0 or coin_xmr.inflation == 0: - return count - - - - count_aux = 0 - found = False - while count_aux < 100 and not(found): - - try: - date_aux2 = date_aux - timedelta(count_aux) - social_btc = Social.objects.filter(name='Bitcoin').get(date=date_aux2) - social_xmr = Social.objects.filter(name='Monero').get(date=date_aux2) - social_crypto = Social.objects.filter(name='CryptoCurrency').get(date=date_aux2) - found = True - - except: - count_aux += 1 - found = False - except: - return count - - try: - data = Sfmodel.objects.get(date=coin_xmr.date) - - except: - data = Sfmodel() - data.priceusd = 0 - data.pricebtc = 0 - data.stocktoflow = 0 - data.greyline = 0 - data.color = 0 - data.date = coin_xmr.date - data.pricebtc = coin_xmr.pricebtc - data.priceusd = coin_xmr.priceusd - if data.stocktoflow == 0 and coin_xmr.supply > 0: - supply = int(coin_xmr.supply)*10**12 - reward = (2**64 -1 - supply) >> 19 - if reward < 0.6*(10**12): - reward = 0.6*(10**12) - inflation = 100*reward*720*365/supply - data.stocktoflow = (100/(inflation))**1.65 - v0 = 0.002 - delta = (0.015 - 0.002)/(6*365) - data.color = 30*coin_xmr.pricebtc/((amount.days)*delta + v0) - amount += timedelta(1) - data.save() - - try: - data = DailyData.objects.get(date=coin_xmr.date) - except: - data = DailyData() - # Date field - data.date = coin_xmr.date - # Basic information - data.btc_priceusd = 0 - data.xmr_priceusd = 0 - data.xmr_pricebtc = 0 - # Marketcap charts - data.btc_marketcap = 0 - data.xmr_marketcap = 0 - data.dash_marketcap = 0 - data.grin_marketcap = 0 - data.zcash_marketcap = 0 - # Transactions charts - data.xmr_transacpercentage = 0 - data.btc_transactions = 0 - data.zcash_transactions = 0 - data.dash_transactions = 0 - data.grin_transactions = 0 - data.xmr_transactions = 0 - data.btc_supply = 0 - data.xmr_supply = 0 - # Issuance charts - data.btc_inflation = 0 - data.xmr_inflation = 0 - data.dash_inflation = 0 - data.grin_inflation = 0 - data.zcash_inflation = 0 - data.xmr_metcalfebtc = 0 - data.xmr_metcalfeusd = 0 - data.btc_return = 0 - data.xmr_return = 0 - data.btc_emissionusd = 0 - data.btc_emissionntv = 0 - data.xmr_emissionusd = 0 - data.xmr_emissionntv = 0 - # Mining charts - data.btc_minerrevntv = 0 - data.xmr_minerrevntv = 0 - data.btc_minerrevusd = 0 - data.xmr_minerrevusd = 0 - data.btc_minerfeesntv = 0 - data.xmr_minerfeesntv = 0 - data.btc_minerfeesusd = 0 - data.xmr_minerfeesusd = 0 - data.btc_transcostntv = 0 - data.xmr_transcostntv = 0 - data.btc_transcostusd = 0 - data.xmr_transcostusd = 0 - data.xmr_minerrevcap = 0 - data.btc_minerrevcap = 0 - data.btc_commitntv = 0 - data.xmr_commitntv = 0 - data.btc_commitusd = 0 - data.xmr_commitusd = 0 - data.btc_blocksize = 0 - data.xmr_blocksize = 0 - data.btc_difficulty = 0 - data.xmr_difficulty = 0 - # Reddit charts - data.btc_subscriberCount = 0 - data.btc_commentsPerHour = 0 - data.btc_postsPerHour = 0 - data.xmr_subscriberCount = 0 - data.xmr_commentsPerHour = 0 - data.xmr_postsPerHour = 0 - data.crypto_subscriberCount = 0 - data.crypto_commentsPerHour = 0 - data.crypto_postsPerHour = 0 - - # Date field - data.date = coin_xmr.date - # Basic information - data.btc_priceusd = coin_btc.priceusd - data.xmr_priceusd = coin_xmr.priceusd - data.xmr_pricebtc = coin_xmr.pricebtc - # Marketcap charts - data.btc_marketcap = coin_btc.priceusd*coin_btc.supply - data.xmr_marketcap = coin_xmr.priceusd*coin_xmr.supply - data.dash_marketcap = coin_dash.priceusd*coin_dash.supply - data.grin_marketcap = coin_grin.priceusd*coin_grin.supply - data.zcash_marketcap = coin_zcash.priceusd*coin_zcash.supply - - # Transactions charts - try: - data.xmr_transacpercentage = coin_xmr.transactions/coin_btc.transactions - except: - pass - data.xmr_transactions = coin_xmr.transactions - data.btc_transactions = coin_btc.transactions - data.zcash_transactions = coin_zcash.transactions - data.dash_transactions = coin_dash.transactions - data.grin_transactions = coin_grin.transactions - data.btc_supply = coin_btc.supply - data.xmr_supply = coin_xmr.supply - # Issuance charts - data.btc_inflation = coin_btc.inflation - data.xmr_inflation = coin_xmr.inflation - data.dash_inflation = coin_dash.inflation - data.grin_inflation = coin_grin.inflation - data.zcash_inflation = coin_zcash.inflation - try: - data.xmr_metcalfebtc = coin_xmr.transactions*coin_xmr.supply/(coin_btc.supply*coin_btc.transactions) - data.xmr_metcalfeusd = coin_btc.priceusd*coin_xmr.transactions*coin_xmr.supply/(coin_btc.supply*coin_btc.transactions) - except: - pass - data.btc_return = coin_btc.priceusd/30 - data.xmr_return = coin_xmr.priceusd/5.01 - data.btc_emissionusd = (coin_btc.supply - coin_btc2.supply)*coin_btc.priceusd - data.btc_emissionntv = coin_btc.supply - coin_btc2.supply - data.xmr_emissionusd = (coin_xmr.supply - coin_xmr2.supply)*coin_xmr.priceusd - data.xmr_emissionntv = coin_xmr.supply - coin_xmr2.supply - # Mining charts - data.btc_minerrevntv = coin_btc.revenue - data.xmr_minerrevntv = coin_xmr.revenue - data.btc_minerrevusd = coin_btc.revenue*coin_btc.priceusd - data.xmr_minerrevusd = coin_xmr.revenue*coin_xmr.priceusd - data.btc_minerfeesntv = coin_btc.revenue - coin_btc.supply + coin_btc2.supply - data.xmr_minerfeesntv = coin_xmr.revenue - coin_xmr.supply + coin_xmr2.supply - data.btc_minerfeesusd = (coin_btc.revenue - coin_btc.supply + coin_btc2.supply)*coin_btc.priceusd - data.xmr_minerfeesusd = (coin_xmr.revenue - coin_xmr.supply + coin_xmr2.supply)*coin_xmr.priceusd - try: - data.btc_transcostntv = coin_btc.fee/coin_btc.transactions - data.xmr_transcostntv = coin_xmr.fee/coin_xmr.transactions - data.btc_transcostusd = coin_btc.priceusd*coin_btc.fee/coin_btc.transactions - data.xmr_transcostusd = coin_xmr.priceusd*coin_xmr.fee/coin_xmr.transactions - except: - pass - try: - data.xmr_minerrevcap = 365*100*coin_xmr.revenue/coin_xmr.supply - data.btc_minerrevcap = 365*100*coin_btc.revenue/coin_btc.supply - except: - pass - try: - data.btc_commitntv = coin_btc.hashrate/(coin_btc.revenue) - data.xmr_commitntv = coin_xmr.hashrate/(coin_xmr.revenue) - data.btc_commitusd = coin_btc.hashrate/(coin_btc.revenue*coin_btc.priceusd) - data.xmr_commitusd = coin_xmr.hashrate/(coin_xmr.revenue*coin_xmr.priceusd) - except: - pass - try: - data.btc_blocksize = coin_btc.blocksize - data.xmr_blocksize = coin_xmr.blocksize - data.btc_difficulty = coin_btc.difficulty - data.xmr_difficulty = coin_xmr.difficulty - except: - pass - # Reddit charts - try: - data.btc_subscriberCount = social_btc.subscriberCount - data.btc_commentsPerHour = social_btc.commentsPerHour - data.btc_postsPerHour = social_btc.postsPerHour - data.xmr_subscriberCount = social_xmr.subscriberCount - data.xmr_commentsPerHour = social_xmr.commentsPerHour - data.xmr_postsPerHour = social_xmr.postsPerHour - data.crypto_subscriberCount = social_crypto.subscriberCount - data.crypto_commentsPerHour = social_crypto.commentsPerHour - data.crypto_postsPerHour = social_crypto.postsPerHour - except: - data.btc_subscriberCount = 0 - data.btc_commentsPerHour = 0 - data.btc_postsPerHour = 0 - data.xmr_subscriberCount = 0 - data.xmr_commentsPerHour = 0 - data.xmr_postsPerHour = 0 - data.crypto_subscriberCount = 0 - data.crypto_commentsPerHour = 0 - data.crypto_postsPerHour = 0 - - data.save() - print(str(coin_xmr.date) + ' - ' + str(int(coin_xmr.supply)) + ' xmr @ ' + str(coin_xmr.priceusd) + ' = ' + str(int(data.xmr_marketcap)) + ' => ' + str(coin_xmr.inflation)) - - count += 1 - - return count - -# Get latest P2Pool data -def update_p2pool(): - today = date.today() - yesterday = date.today() - timedelta(1) - try: - p2pool_stat = P2Pool.objects.filter(mini=False).get(date=today) - print('achou p2pool de hoje') - if p2pool_stat.percentage > 0: - - print('porcentagem > 0') - update = False - else: - print('porcentagem < 0') - p2pool_stat.delete() - try: - coin = Coin.objects.filter(name='xmr').get(date=yesterday) - - print('achou coin de ontem') - if coin.hashrate > 0: - update = True - else: - update = False - except: - print('nao achou coin de ontem') - update = False - except: - - print('nao achou p2pool de hoje') - try: - coin = Coin.objects.filter(name='xmr').get(date=yesterday) - if coin.hashrate > 0: - update = True - else: - update = False - except: - update = False - - if update: - p2pool_stat = P2Pool() - p2pool_stat.date = today - response = requests.get('https://p2pool.io/api/pool/stats') - - data = json.loads(response.text) - p2pool_stat.hashrate = data['pool_statistics']['hashRate'] - p2pool_stat.percentage = 100*data['pool_statistics']['hashRate']/coin.hashrate - p2pool_stat.miners = data['pool_statistics']['miners'] - p2pool_stat.totalhashes = data['pool_statistics']['totalHashes'] - p2pool_stat.totalblocksfound = data['pool_statistics']['totalBlocksFound'] - p2pool_stat.mini = False - p2pool_stat.save() - print('p2pool saved!') - - gc = pygsheets.authorize(service_file='service_account_credentials.json') - sh = gc.open('zcash_bitcoin') - wks = sh.worksheet_by_title('p2pool') - - values_mat = wks.get_values(start=(3,1), end=(9999,3), returnas='matrix') - - k = len(values_mat) - date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') - date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') - date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') - if date_aux < date_aux2: - cell = 'F' + str(k + 3) - wks.update_value(cell, p2pool_stat.totalblocksfound) - cell = 'E' + str(k + 3) - wks.update_value(cell, p2pool_stat.totalhashes) - cell = 'D' + str(k + 3) - wks.update_value(cell, p2pool_stat.percentage) - cell = 'C' + str(k + 3) - wks.update_value(cell, p2pool_stat.hashrate) - cell = 'B' + str(k + 3) - wks.update_value(cell, p2pool_stat.miners) - cell = 'A' + str(k + 3) - wks.update_value(cell, datetime.datetime.strftime(p2pool_stat.date, '%Y-%m-%d')) - print('spreadsheet updated') - else: - print('spreadsheet already with the latest data') - return data - - today = date.today() - yesterday = date.today() - timedelta(1) - try: - p2pool_stat = P2Pool.objects.filter(mini=True).get(date=today) - print('achou p2pool_mini de hoje') - if p2pool_stat.percentage > 0: - - print('porcentagem > 0') - update = False - else: - print('porcentagem < 0') - p2pool_stat.delete() - try: - coin = Coin.objects.filter(name='xmr').get(date=yesterday) - - print('achou coin de ontem') - if coin.hashrate > 0: - update = True - else: - update = False - except: - print('nao achou coin de ontem') - update = False - except: - - print('nao achou p2pool_mini de hoje') - try: - coin = Coin.objects.filter(name='xmr').get(date=yesterday) - if coin.hashrate > 0: - update = True - else: - update = False - except: - update = False - - if update: - p2pool_stat = P2Pool() - p2pool_stat.date = today - response = requests.get('https://p2pool.io/mini/api/pool/stats') - - data = json.loads(response.text) - p2pool_stat.hashrate = data['pool_statistics']['hashRate'] - p2pool_stat.percentage = 100*data['pool_statistics']['hashRate']/coin.hashrate - p2pool_stat.miners = data['pool_statistics']['miners'] - p2pool_stat.totalhashes = data['pool_statistics']['totalHashes'] - p2pool_stat.totalblocksfound = data['pool_statistics']['totalBlocksFound'] - p2pool_stat.mini = True - p2pool_stat.save() - print('p2pool_mini saved!') - - gc = pygsheets.authorize(service_file='service_account_credentials.json') - sh = gc.open('zcash_bitcoin') - wks = sh.worksheet_by_title('p2poolmini') - - values_mat = wks.get_values(start=(3,1), end=(9999,3), returnas='matrix') - - k = len(values_mat) - date_aux = datetime.datetime.strptime(values_mat[k-1][0], '%Y-%m-%d') - date_aux2 = datetime.datetime.strftime(date.today(), '%Y-%m-%d') - date_aux2 = datetime.datetime.strptime(date_aux2, '%Y-%m-%d') - if date_aux < date_aux2: - cell = 'F' + str(k + 3) - wks.update_value(cell, p2pool_stat.totalblocksfound) - cell = 'E' + str(k + 3) - wks.update_value(cell, p2pool_stat.totalhashes) - cell = 'D' + str(k + 3) - wks.update_value(cell, p2pool_stat.percentage) - cell = 'C' + str(k + 3) - wks.update_value(cell, p2pool_stat.hashrate) - cell = 'B' + str(k + 3) - wks.update_value(cell, p2pool_stat.miners) - cell = 'A' + str(k + 3) - wks.update_value(cell, datetime.datetime.strftime(p2pool_stat.date, '%Y-%m-%d')) - print('spreadsheet updated') - else: - print('spreadsheet already with the latest data') - return data - - return True - ########################################### # Views ########################################### @@ -1914,11 +892,13 @@ async def index(request): if request.user.username != "Administrador" and request.user.username != "Morpheus": update_visitors(True) - ################################################################################### - dt = datetime.datetime.now(timezone.utc).timestamp() - ################################################################################### + coin = list(Coin.objects.order_by('-date'))[0] + if not(coin): + message = 'Website under maintenance. Check back in a few minutes' + context = {'message': message} + return render(request, 'charts/maintenance.html', context) now = int(datetime.datetime.now().strftime("%H")) yesterday = datetime.datetime.strftime(date.today() - timedelta(1), '%Y-%m-%d') @@ -1967,20 +947,17 @@ async def index(request): break if update_xmr: - await update_xmr_data(yesterday, coin_xmr) + await asynchronous.update_xmr_data(yesterday, coin_xmr) if update_btc: - await update_others_data(yesterday) + await asynchronous.update_others_data(yesterday) + synchronous.update_database(yesterday, yesterday) - - - ################################################################################### - - #supply = locale.format('%.0f', supply, grouping=True) - #inflation = locale.format('%.2f', inflation, grouping=True)+'%' + supply = locale.format('%.0f', coin_xmr.supply, grouping=True) + inflation = locale.format('%.2f', coin_xmr.inflation, grouping=True)+'%' dt = 'index.html ' + locale.format('%.2f', datetime.datetime.now(timezone.utc).timestamp() - dt, grouping=True)+' seconds' print(dt) - context = {}#'inflation': inflation, 'supply': supply} + context = {'inflation': inflation, 'supply': supply} return render(request, 'charts/index.html', context) def pt(request): @@ -1988,14 +965,6 @@ def pt(request): update_visitors(True) symbol = 'xmr' - - rank = list(Rank.objects.order_by('-date'))[0] - if rank.date < date.today(): - data = update_rank() - dominance = list(Dominance.objects.order_by('-date'))[0] - if dominance.date < date.today(): - data = update_dominance(data) - coin = list(Coin.objects.filter(name=symbol).order_by('-date'))[0] if coin: now_inflation = coin.inflation @@ -2017,14 +986,6 @@ def fr(request): update_visitors(True) symbol = 'xmr' - - rank = list(Rank.objects.order_by('-date'))[0] - if rank.date < date.today(): - data = update_rank() - dominance = list(Dominance.objects.order_by('-date'))[0] - if dominance.date < date.today(): - data = update_dominance(data) - coin = list(Coin.objects.filter(name=symbol).order_by('-date'))[0] if coin: now_inflation = coin.inflation