To be frank, 2100+ entries is too much to comprehend in one pass. No, I'm quite sure of that; take a look for yourself. In order to populate the examples for this documentation it proved necessary to construct an arbitrary subset. I chose to use the top 20 marketcap coins, (using a [2:22] offset to avoid the overwhelming disproportion of BTC & LTC data).
I worked through the archive.org records for coinmarketcap.com for the last 12 months, month by month. Sponging up the data from the web page is relatively straightforward and as an example, this is what the row of data for Stellar can be boiled down to:
{
"st": "ok",
"nm": "Stellar",
"sy": "STR",
"mcu": 12951957.9384,
"mcb": 52836.5556735,
"pu": 0.00269609,
"pb": 1.09985e-05,
"ps": "pos",
"ch": 4803978331,
"vu": 21592.5,
"vb": 88.0852,
"hu": -1.23,
"hb": -1.00,
"du": 0.43,
"db": 3.81,
"wu": -3.42,
"wb": -2.46
}
Each of the monthly postings of data must record the date and pertaining BTC/USD exchange rate price, for later reconstruction of $ values. Each update of the coinmarketcap page is a fresh posting of data. A “Post” thing is indicated, stating the date of posting and the BTC-USD price pertaining at that time.
For the datum points themselves, a “Datum” thing will be needed to make statements about the contents of each of the row cells. The outline below is rendered in Notation3 format for brevity and just hits the high points:
:CMPost a owl:Class ;
rdfs:comment "coinmarketcap.com post"@en ;
skos:prefLabel "CMPost"@en .
:date a owl:DatatypeProperty ;
rdfs:domain :CMPost ;
rdfs:comment "The timestamp of the post"@en ;
skos:prefLabel "date"@en .
:CMPostDatum a owl:Class ;
rdfs:comment "datum from a coinmarketcap.com post"@en ;
skos:prefLabel "CMPostDatum"@en .
:cmp a owl:ObjectProperty ;
rdfs:domain :CMPostDatum ;
rdfs:range :CMPost ;
rdfs:comment "contextual post"@en ;
skos:prefLabel "cmp"@en .
:marketcap a owl:DatatypeProperty ;
rdfs:domain :CMPostDatum ;
rdfs:range xsd:float ;
rdfs:comment "Market capitalisation"@en ;
skos:prefLabel "marketcap"@en .
And examples of a post and related datum point also rendered in Notation3:
:cmp-1 a :CMPost ;
dc:date "2014-01-29T10:35:00"^^xsd:date ;
:btc "817.62"^^xsd:float .
:cmpd-1 a :CMPostDatum ;
:cmp :cmp-1 ;
:cryptocurrency doacc:D1edd900c-399e-471c-87a3-c214ce3c969d ;
:daily "0.0"^^xsd:float ;
:marketcap "2457847.0"^^xsd:float ;
:price "2.458e-05"^^xsd:float ;
:qual 2 ;
:stale false ;
:volume "110.0"^^xsd:float .
Feel free to grab the full content (268K)
The Charting page (also see tab above) goes into detail about getting the data into the charting library but the core activity is outlined below:
var listout = function() { // a callback function, runs after the data is retrieved
cmpno = 'cmp-'+'2'; // arbitrary example
dt = g.any(CCS(cmpno), DC('date'), null); // date, for title
cmpds = g.each(null, CCS('cmp'), CCS(cmpno)); // the datapoints for the post
var res = $.map(cmpds.slice(2,22), function(cmp) { // map over the datum points
var cn = g.any(g.any(cmp, CCS('cryptocurrency'), null), DOACC('symbol'), null); // get the coin symbol
var val = g.any(cmp, CCS('marketcap'), null); // read the marketcap value
return {"label": cn.value, "value": parseFloat(val.value).toFixed(0)} // return a dictionary
});
data = $.map(res, function(p) {return p['value'] * 10}); // create list of size-adjusted values
labels = $.map(res, function(p) {return p['label']}); // create list of labels
... // the lists are passed to the chart library.
};
var g = $rdf.graph(); // instantiate the graph
var docURI = "http://localhost.localdomain/altcoin.n3"; // specify the source
var fetch = $rdf.fetcher(g); // bind the graph and return the fetcher
fetch.nowOrWhenFetched(docURI,undefined,function(ok, body, xhr){ // @@ check ok
listout() // callback, see above
});