logo Netzschleuder network catalog, repository, and centrifuge

History of thgl_myket

The changes to the source code of this entry in the repository, newest first, each with the differences it made to the entry's files. They are also listed on GitLab.

[entries] New entry: thgl_myket by Tiago de Paula Peixoto 7a065be
diff --git a/entries/thgl_myket/__init__.py b/entries/thgl_myket/__init__.py
new file mode 100644
index 0000000..58351e3
--- /dev/null
+++ b/entries/thgl_myket/__init__.py
@@ -0,0 +1,74 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2026 Tiago de Paula Peixoto <tiago@skewed.de>
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Affero General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Affero General Public License along
+# with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+
+import pandas
+
+from .. import *
+
+
+title = "Myket app market installations and updates (thgl-myket, TGB 2.0, 2020-2021)"
+description = """A temporal bipartite network of the users of the Myket Android app market (an Iranian app store) and the apps they installed or updated, from June 2020 to January 2021, from the `thgl-myket` dataset of the Temporal Graph Benchmark (TGB 2.0), provided by the Myket Corporation. Each timestamped directed edge from a user to an app is an installation of the app (for the first time) or an update of it. The users and apps are anonymized (they are identified only by indices). A smaller, downsampled version of the data was published earlier by Loghmani and Fazli (2023); this one has all the data.
+
+The network has the following properties:
+
+- `is_app`: whether the node is an app (otherwise a user).
+- Edge `update`: whether the event is an update of the app (otherwise a first installation).
+- Edge `time`: the time of the event, in Unix time, as given by TGB (the times span from 2020-06-18 03:55 to 2021-01-01 04:59 UTC, so that they may be shifted by the offset of a time zone)."""
+tags = ['Economic', 'Commerce', 'Online', 'Unweighted', 'Multigraph', 'Timestamps', 'Metadata']
+url = ['https://tgb.complexdatalab.com/docs/thg/',
+       'https://github.com/shenyangHuang/TGB']
+citation = [('J. Gastinger, S. Huang, M. Galkin, E. Loghmani, A. Parviz, F. Poursafaei, J. Danovitch, E. Rossi, I. Koutis, H. Stuckenschmidt, R. Rabbany, G. Rabusseau, "TGB 2.0: A Benchmark for Learning on Temporal Knowledge Graphs and Heterogeneous Graphs." Advances in Neural Information Processing Systems 37 (Datasets and Benchmarks Track) (2024)', 'https://doi.org/10.48550/arXiv.2406.09639'),
+            ('E. Loghmani, M. Fazli, "Effect of Choosing Loss Function when Using T-batching for Representation Learning on Dynamic Networks." arXiv:2308.06862 (2023)', 'https://doi.org/10.48550/arXiv.2308.06862')]
+icon_hash = None
+upstream_license = ('CC BY-NC 4.0', 'https://creativecommons.org/licenses/by-nc/4.0/')
+upstream_prefix = 'https://object-arbutus.alliancecan.ca/swift/v1/14c95234f6cd4a21a47deafe20cce2a7/tgb'
+files = [(('thgl-myket.zip:thgl-myket_edgelist.csv',
+           'thgl-myket.zip:thgl-myket_nodetype.csv'), None, None)]
+
+def fetch_upstream(force=False):
+    return fetch_upstream_files(__name__.split(".")[-1], upstream_prefix, files,
+                                force)
+
+@cache_network()
+@coerce_props()
+@annotate()
+def parse(alts=None):
+    global files
+    name = __name__.split(".")[-1]
+    for fnames, alt, fmt in files:
+        if alts is not None and alt not in alts:
+            continue
+        with open_upstream_file(name, fnames[1], "rb") as f:
+            # "node_id,type": 0 for users, 1 for apps
+            ntypes = pandas.read_csv(f, dtype="int64").values
+        with open_upstream_file(name, fnames[0], "rb") as f:
+            # "timestamp,head,tail,relation_type": 0 for installations, 1
+            # for updates
+            edges = pandas.read_csv(f, dtype="int64").values
+        N = len(ntypes)
+        assert (ntypes[:, 0] == numpy.arange(N)).all()
+        assert (ntypes[edges[:, 1], 1] == 0).all() and (ntypes[edges[:, 2], 1] == 1).all()
+        g = Graph(directed=True)
+        g.add_vertex(N)
+        g.vp.is_app = g.new_vp("bool", vals=ntypes[:, 1])
+        g.add_edge_list(edges[:, [1, 2]])
+        g.ep.update = g.new_ep("bool", vals=edges[:, 3])
+        g.ep.time = g.new_ep("int64_t", vals=edges[:, 0])
+        yield alt, g