diff --git a/.gitignore b/.gitignore index ef7815b..1756853 100644 --- a/.gitignore +++ b/.gitignore @@ -147,3 +147,4 @@ data/ backup/ sources/ testing.ipynb +extra/ diff --git a/EXTRA/bob b/EXTRA/bob deleted file mode 100755 index cc0ba9e..0000000 Binary files a/EXTRA/bob and /dev/null differ diff --git a/EXTRA/create_checkins_graph.cpp b/EXTRA/create_checkins_graph.cpp deleted file mode 100644 index e3c181a..0000000 --- a/EXTRA/create_checkins_graph.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -// It receives the file name as a string and returns a dictionary with the keys being the UserID and the values being a vector of VenueID associated with that UserID. - -unordered_map> createDictFromFile(string filename) { - // Create an empty dictionary - unordered_map> dict; - - // Open the file - ifstream file(filename); - - // Check if the file was opened successfully - if (!file.is_open()) { - cerr << "Error opening file " << filename << endl; - return dict; - } - - // Read the file line by line - string userId, venueId; - while (file.good()) { - file >> userId >> venueId; - // Add the venueId to the vector of venues associated with the userId - dict[userId].insert(venueId); - } - - cout << "Dict created" << endl; - - // Return the dictionary - return dict; -} - -// void create_tsv_multi(unordered_map> dict, mutex& dict_mutex) { -// // Create an output stream to write the file -// ofstream out_file("output.tsv"); -// // Create a mutex to protect the output file -// mutex out_file_mutex; -// // Loop over all the key-value pairs in the map -// for (const auto& kv1 : dict) { -// for (const auto& kv2 : dict) { -// // Check if the keys are the same -// if (kv1.first == kv2.first) continue; -// // Check if the values have elements in common -// vector common; -// for (const auto& str1 : kv1.second) { -// for (const auto& str2 : kv2.second) { -// if (str1 == str2) common.push_back(str1); -// } -// } -// // Write the keys and the number of common elements to the output file -// if (!common.empty()) { -// // Lock the mutexes before accessing the dict and the output file -// lock_guard dict_guard(dict_mutex); -// lock_guard out_file_guard(out_file_mutex); -// out_file << kv1.first << "\t" << kv2.first << "\t" << common.size() << endl; -// } -// } -// } -// } - -void create_tsv(const unordered_map>& dict, string outfilename) { - // Create an output stream to write the file - ofstream out_file(outfilename); - - // Loop over all the key-value pairs in the map - unsigned long long i = 0; - for (const auto& kv1 : dict) { - if (!((++i) & 127)) cout << (((double)i) * 100 / dict.size()) << "%\r" << flush; - - for (const auto& kv2 : dict) { - // Check if the keys are the same - if(kv1.first >= kv2.first) continue; - - // Check if the values have elements in common - set common; - set_intersection(kv1.second.begin(), kv1.second.end(), kv2.second.begin(), kv2.second.end(), inserter(common, common.begin())); - - // Write the keys and the number of common elements to the output file - if (!common.empty()) { - out_file << kv1.first << "\t" << kv2.first << "\t" << common.size() << endl; - // cout << kv1.first << "\t" << kv2.first << "\t" << common.size() << endl; - } - } - } -} - -void print_help() { - cout << "Usage: ./main IN_FILE_PATH OUT_FILE_PATH" << endl; - cout << "Suggested options: \n\t./main data/brightkite/brightkite_checkins.txt data/brightkite/brightkite_checkins_graph.tsv \n\t./main data/gowalla/gowalla_checkins.txt data/gowalla/gowalla_checkins_graph.tsv \n\t./main data/foursquare/foursquare_checkins.txt data/foursquare/foursquare_checkins_graph.tsv" << endl; -} - -// int main() { -// unordered_map> dict = createDictFromFile("data/foursquare/foursquare_checkins_TKY.txt"); -// create_tsv(dict); -// } - -int main(int argc, const char* argv[]) { - - if (argc == 3) { - string in_file = argv[1]; - string out_file = argv[2]; - if (in_file == "-h" || in_file == "--help" || out_file == "-h" || out_file == "--help") { - print_help(); - return 0; - } - unordered_map> dict = createDictFromFile(in_file); - create_tsv(dict, out_file); - return 0; - } else { - print_help(); - return 0; - } -} diff --git a/EXTRA/small_world.cpp b/EXTRA/small_world.cpp deleted file mode 100644 index 7d1ed06..0000000 --- a/EXTRA/small_world.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace boost; - -typedef adjacency_list Graph; -typedef small_world_iterator SWGen; - -vector> lattice_reference(const string& edge_list_file, int niter, bool connectivity) { - vector> edges; - int num_nodes = 0; - - // Read in the edge list from the input file - ifstream in(edge_list_file); - string line; - while (getline(in, line)) { - int u, v; - sscanf(line.c_str(), "%d\t%d", &u, &v); - edges.emplace_back(u, v); - num_nodes = max(num_nodes, max(u, v)); - } - - // Construct the graph from the edge list - Graph g(edges.begin(), edges.end(), num_nodes + 1); - - // Create the small-world generator - minstd_rand gen; - SWGen sw_gen(g, niter); - - // Generate the lattice reference and store the resulting edge list - vector> lattice_edges; - for (int i = 0; i < num_nodes; ++i) { - auto [u, v] = *sw_gen; - lattice_edges.emplace_back(u, v); - ++sw_gen; - } - - // convert the vector of pairs in a .tsv file called "lattice_reference.tsv" - ofstream out("lattice_reference.tsv"); - for (const auto& [u, v] : lattice_edges) { - out << u << "\t" << v << endl; - } - - // return the vector of pairs - return lattice_edges; - -} - -// main - -int main(int argc, char* argv[]) { - if (argc != 4) { - cerr << "Usage: " << argv[0] << " " << endl; - return 1; - } - - string edge_list_file = argv[1]; - int niter = atoi(argv[2]); - bool connectivity = atoi(argv[3]); - - lattice_reference(edge_list_file, niter, connectivity); - - return 0; -} - - \ No newline at end of file diff --git a/analysis_results.pkl b/analysis_results.pkl index 8919e26..20dea4c 100644 Binary files a/analysis_results.pkl and b/analysis_results.pkl differ diff --git a/analysis_results_erods.pkl b/analysis_results_erods.pkl deleted file mode 100644 index 7a4884f..0000000 Binary files a/analysis_results_erods.pkl and /dev/null differ diff --git a/analysis_results_ws.pkl b/analysis_results_ws.pkl deleted file mode 100644 index e1bd0b7..0000000 Binary files a/analysis_results_ws.pkl and /dev/null differ diff --git a/foursquareIT_friends.html b/foursquareIT_friends.html deleted file mode 100644 index 548c1d2..0000000 --- a/foursquareIT_friends.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - - - - -
-

-
- - - - - - -
-

-
- - - - - -
- - -
-
- - -
-
-
0%
-
-
-
-
-
- - -
- - - - - \ No newline at end of file diff --git a/main.ipynb b/main.ipynb index fdbb570..f451d4e 100644 --- a/main.ipynb +++ b/main.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -20,37 +20,16 @@ "from collections import Counter\n", "from tqdm import tqdm\n", "import time\n", + "import geopandas as gpd\n", + "import multiprocessing\n", + "\n", + "\n", "\n", "# ignore warnings\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# import the graphs from the saved files. NOT TO BE INCLUDED IN THE FINAL NOTEBOOK\n", - "G_brighkite_checkins = nx.read_gpickle(os.path.join('data', 'brightkite', 'brightkite_checkins_graph.gpickle'))\n", - "G_gowalla_checkins = nx.read_gpickle(os.path.join('data', 'gowalla', 'gowalla_checkins_graph.gpickle'))\n", - "G_foursquareEU_checkins = nx.read_gpickle(os.path.join('data', 'foursquare', 'foursquareEU_checkins_graph.gpickle'))\n", - "G_foursquareIT_checkins = nx.read_gpickle(os.path.join('data', 'foursquare', 'foursquareIT_checkins_graph.gpickle'))\n", - "\n", - "G_brighkite_friends = nx.read_gpickle(os.path.join('data', 'brightkite', 'brightkite_friendships_graph.gpickle'))\n", - "G_gowalla_friends = nx.read_gpickle(os.path.join('data', 'gowalla', 'gowalla_friendships_graph.gpickle'))\n", - "G_foursquareEU_friends = nx.read_gpickle(os.path.join('data', 'foursquare', 'foursquareEU_friendships_graph.gpickle'))\n", - "G_foursquareIT_friends = nx.read_gpickle(os.path.join('data', 'foursquare', 'foursquareIT_friendships_graph.gpickle'))\n", - "\n", - "checkins_graphs = [G_brighkite_checkins, G_gowalla_checkins, G_foursquareEU_checkins, G_foursquareIT_checkins]\n", - "friendships_graph = [G_brighkite_friends, G_gowalla_friends, G_foursquareIT_friends, G_foursquareEU_friends]\n", - "\n", - "graphs_all = checkins_graphs + friendships_graph\n", - "\n", - "analysis_results = pd.read_pickle('analysis_results.pkl')\n" - ] - }, { "attachments": {}, "cell_type": "markdown", @@ -64,13 +43,13 @@ "\n", "## Aim of the project\n", "\n", - "Given a social network, which of its nodes are more central? This question has been asked many times in sociology, psychology and computer science, and a whole plethora of centrality measures (a.k.a. centrality indices, or rankings) were proposed to account for the importance of the nodes of a network. \n", + "" ] }, { @@ -80,23 +59,33 @@ "source": [ "# The Erdős-Rényi model\n", "\n", - "Before 1960, graph theory mainly dealt with the properties of specific individual graphs. In the 1960s, Paul Erdős and Alfred Rényi initiated a systematic study of random graphs. Random graph theory is, in fact, not the study of individual graphs, but the study of a statistical ensemble of graphs (or, as mathematicians prefer to call it, a \\emph{probability space} of graphs). The ensemble is a class consisting of many different graphs, where each graph has a probability attached to it. A property studied is said to exist with probability $P$ if the total probability of a graph in the ensemble possessing that property is $P$ (or the total fraction of graphs in the ensemble that has this property is $P$). This approach allows the use of probability theory in conjunction with discrete mathematics for studying graph ensembles. A property is said to exist for a class of graphs if the fraction of graphs in the ensemble which does not have this property is of zero measure. This is usually termed as a property of \\emph{almost every (a.e.)} graph. Sometimes the terms “almost surely” or “with high probability” are also used (with the former usually taken to mean that the residual probability vanishes exponentially with the system size). \n", + "\n", + "\n", + "Prior to the 1960s, graph theory primarily focused on the characteristics of individual graphs. In the 1960s, Paul Erdős and Alfred Rényi introduced a systematic approach to studying random graphs, which involves analyzing a collection, or ensemble, of many different graphs. Each graph in the ensemble is assigned a probability, and a property is said to hold with probability $P$ if the total probability of the graphs in the ensemble possessing that property is $P$, or if the fraction of graphs in the ensemble with the property is $P$. This method allows for the application of probability theory in conjunction with discrete math to study ensembles of graphs. A property is considered to hold for a class of graphs if the fraction of graphs in the ensemble without the property has zero measure, which is typically referred to as being true for \"almost every\" graph in the ensemble. The terms \"almost surely\" and \"with high probability\" may also be used, with the former generally indicating that the residual probability decreases exponentially with the size of the system\n", "\n", "\n", "## Erdős-Rényi graphs\n", "\n", - "Two well-studied graph ensembles are $G_{N,M}$, the ensemble of all graphs with $N$ nodes and $M$ edges, and $G_{N,p}$, the ensemble of all graphs with $N$ nodes and probability $p$ of any two nodes being connected. These two families, initially studied by Erdős and Rényi, are known to be similar if $M = \\binom{N}{2} p$, so as long $p$ is not too close to $0$ or $1$ they are referred to as ER graphs. \n", + "\n", + "\n", + "There are two well-known ensembles of graphs that have been extensively studied: the ensemble of all graphs with $N$ nodes and $M$ edges, denoted $G_{N,M}$, and the ensemble of all graphs with $N$ nodes and a probability $p$ of any two nodes being connected, denoted $G_{N,p}$. These ensembles, initially studied by Erdős and Rényi, are similar when $M = \\binom{N}{2} p$, and are therefore referred to as ER graphs when $p$ is not too close to 0 or 1.\n", + "\n", + "An important feature of a graph is its average degree, or the average number of edges connected to each node. We will denote the degree of the $i$th node by $k_i$ and the average degree by $\\langle r \\rangle$. Graphs with $N$ nodes and $\\langle k \\rangle = O(N^0)$ are called sparse graphs.\n", + "\n", + "One interesting property of the ensemble $G_{N,p}$ is that many of its characteristics have a corresponding threshold function, $p_t(N)$, such that the property exists with probability 0 if $p < p_t$ and with probability 1 if $p > p_t$ in the \"thermodynamic limit\" of $N \\to \\infty$. This is similar to the physical concept of a percolation phase transition.\n", + "\n", + "Another property of interest is the average path length between any two nodes, which is typically of order $\\ln N$ in almost every graph of the ensemble (with $\\langle k \\rangle > 1$ and finite). This small, logarithmic distance is the source of the \"small-world\" phenomena that are characteristic of networks.\n", "\n", "\n", "## Scale-free networks\n", "\n", - "The Erdős-Rényi model has traditionally been the dominant subject of study in the field of random graphs. Recently, however, several studies of real-world networks have found that the ER model fails to reproduce many of their observed properties. One of the simplest properties of a network that can be measured directly is the degree distribution, or the fraction P(k) of nodes having k connections (degree $k$). A well-known result for ER networks is that the degree distribution is Poissonian,\n", + "\n", + "\n", + "The Erdős-Rényi model has long been the primary focus of research in the field of random graphs. However, recent studies of real-world networks have shown that the ER model does not accurately capture many of their observed properties. One such property that can be easily measured is the degree distribution, or the fraction $P(k)$ of nodes with $k$ connections (degree $k$). A well-known result for ER networks is that the degree distribution follows a Poisson distribution, given by\n", + "\n", + "\\begin{equation}\n", + "P(k) = \\frac{e^{z} z^k}{k!}\n", + "\\end{equation}\n", + "\n", + "where $z = \\langle k \\rangle$ is the average degree. However, measurements of the degree distribution for real networks often show that the Poisson law does not hold, instead exhibiting a scale-free degree distribution of the form\n", + "\n", + "\\begin{equation}\n", + "P(k) = ck^{-\\gamma} \\quad \\text{for} \\quad k = m, ... , K\n", + "\\end{equation}\n", + "\n", + "where $c \\sim (\\gamma -1)m^{\\gamma - 1}$ is a normalization factor, and $m$ and $K$ are the lower and upper cutoffs for the degree of a node, respectively. The divergence of moments higher than $\\lceil \\gamma -1 \\rceil$ (as $K \\to \\infty$ when $N \\to \\infty$) is responsible for many of the unusual properties attributed to scale-free networks.\n", + "\n", + "It is important to note that all real-world networks are finite, so all of their moments are finite as well. The actual value of the cutoff $K$ plays a significant role, and can be approximated by noting that the total probability of nodes with $k > K$ is approximately $1/N$, or\n", + "\n", + "\\begin{equation}\n", + "\\int_K^\\infty P(k) dk \\sim \\frac{1}{N}\n", + "\\end{equation}\n", + "\n", + "This gives the result\n", + "\n", + "\\begin{equation}\n", + "K \\sim m N^{1/(\\gamma -1)}\n", + "\\end{equation}\n", + "\n", + "The degree distribution is not the only characteristic that can be used to describe a network. Other quantities, such as the degree-degree correlation (between connected nodes), spatial correlations, clustering coefficient, betweenness or centrality distribution, and self-similarity exponents, can also provide insight into the network's structure and behavior.\n", "\n", "# Diameter and fractal dimension\n", "\n", - "Regular lattices can be viewed as networks embedded in Euclidean space, of a well-defined dimension, $d$. This means that $n(r)$, the number of nodes within a distance $r$ from an origin, grows as $n(r) \\sim r^d$ (for large $r$). For fractal objects, $d$ in the last relation may be a non-integer and is replaced by the fractal dimension $d_f$ \n", + "\n", + "\n", + "Regular lattices can be viewed as networks embedded in Euclidean space of a defined dimension $d$, meaning that $n(r)$, the number of nodes within a distance $r$ from an origin, grows as $n(r) \\sim r^d$ for large $r$. For fractal objects, the dimension $d$ in this relation may be a non-integer and is replaced by the fractal dimension $d_f$.\n", + "\n", + "One example of a network where these power laws do not hold is the Cayley tree, also known as the Bethe lattice, which is a regular graph of fixed degree $z$ with no loops. An infinite Cayley tree cannot be embedded in a Euclidean space of finite dimensionality. The number of nodes at level $l$ grows as $n(l) \\sim (z - 1)^l$, which is faster than any power law, making Cayley trees infinite-dimensional systems.\n", + "\n", + "Many random network models have locally tree-like structure (since most loops occur only when $n(l) \\sim N$), and since the number of nodes grows as $n(l) \\sim \\langle k - 1 \\rangle^l$, they are also infinite dimensional. As a result, the diameter of such graphs (i.e., the shortest path between the most distant nodes) scales as $D \\sim \\ln N$. Many properties of ER networks, including the logarithmic diameter, are also present in Cayley trees. This small diameter is in contrast to that of finite-dimensional lattices, where $D \\sim N^{1/d_l}$.\n", + "\n", + "Like ER networks, percolation on infinite-dimensional lattices and the Cayley tree exhibits a critical threshold $p_c = 1/(z - 1)$. For $p > p_c$, a \"giant cluster\" of size $N$ exists, while for $p < p_c$, only small clusters are present. At criticality ($p = p_c$) in infinite-dimensional lattices (similar to ER networks), the giant component is of size $N^{2/3}$. This result follows from the fact that percolation on lattices in dimension $d \\geq d_c = 6$ is in the same universality class as infinite-dimensional percolation, where the fractal dimension of the giant cluster is $d_f = 4$, resulting in a size of the giant cluster that scales as $N^{d_f/d_c} = N^{2/3}$. The dimension $d_c$ is known as the \"upper critical dimension,\" and this concept exists not only in percolation phenomena, but also in other physical models such as the self-avoiding walk model for polymers and the Ising model for magnetism, in both of which $d_c = 4$.\n", + "\n", + "Watts and Strogatz proposed a model that retains the high local clustering of lattices (i.e., the neighbors of a node have a higher probability of being neighbors than in random graphs) while reducing the diameter to $D \\sim \\ln N$. This so-called \"small-world network\" is achieved by replacing a fraction $\\varphi$ of the links in a regular lattice with random links to random, distant neighbors.\n", + "\n", "\n", - "Watts and Strogatz suggested a model that retains the local high clustering of lattices (i.e., the neighbors of a node have a much higher probability of being neighbors than in random graphs) while reducing the diameter to $D \\sim \\ln N$ . This so-called, “small-world network” is achieved by replacing a fraction $\\varphi$ of the links in a regular lattice with random links, to random distant neighbors. \n", "\n", "## Random graphs as a model of real networks\n", "\n", - "Many natural and man-made systems are networks, i.e., they consist of objects and interactions between them. These include computer networks, in particular the Internet, logical networks, such as links between WWW pages, and email networks, where a link represents the presence of a person's address in another person's address book. Social interactions in populations, work relations, etc. can also be modeled by a network structure. Networks can also describe possible actions or movements of a system in a configuration space (a phase space), and the nearest configurations are connected by a link. All the above examples and many others have a graph structure that can be studied. Many of them have some ordered structure, derived from geographical or geometrical considerations, cluster and group formation, or other specific properties. However, most of the above networks are far from regular lattices and are much more complex and random in structure. Therefore, it can be assumed (with a lot of precaution) that they maintain many properties of the appropriate random graph model. \n", + "\n", + "\n", + "Many natural and man-made systems can be represented as networks, consisting of objects and interactions between them. Examples include computer networks, particularly the Internet, logical networks such as links between web pages and email networks, where a link represents the presence of an individual's address in another person's address book, and social interactions in populations or work relations. Networks can also describe possible actions or movements of a system in a configuration space (a phase space), with nearest configurations connected by a link. All of these examples and many others have a graph structure that can be studied. Many of these networks have some ordered structure, derived from geographical or geometrical considerations, cluster and group formation, or other specific properties, but most of them are far from regular lattices and are much more complex and random in structure. Therefore, it is often assumed (with caution) that they share many properties with the appropriate random graph model.\n", + "\n", + "In many ways, scale-free networks can be considered a generalization of ER networks. For large $\\gamma$ (typically $\\gamma > 4$), the properties of scale-free networks such as distances, optimal paths, and percolation are the same as in ER networks. In contrast, for $\\gamma < 4$, these properties are very different and can be considered anomalous. The anomalous behavior of scale-free networks is due to the strong heterogeneity in the degrees of the nodes, which breaks the node-to-node translational homogeneity (symmetry) present in\n", "\n", "---" ] @@ -197,7 +229,7 @@ "metadata": {}, "outputs": [], "source": [ - "download_datasets()" + "# download_datasets()" ] }, { @@ -209,11 +241,135 @@ "\n", "## Brightkite\n", "\n", - "[Brightkite](http://www.brightkite.com/) was once a location-based social networking service provider where users shared their locations by checking-in. The friendship network was collected using their public API. We will work with two different datasets. This is how they look like after being filtered by the `download_dataset` function:\n", + "[Brightkite](http://www.brightkite.com/) was a location-based social networking service that allowed users to share their locations by checking in. The friendship network data was collected using the Brightkite public API. There are two datasets available for analysis: \n", "\n", - "- `data/brightkite/brightkite_checkins.txt`: the checkins, a tsv file with 2 columns of user id and location. This is not in the form of a graph edge list, in the next section we will see how to convert it into a graph. Originally there were other columns, such as the time of the checkins. During the filtering, we used this information to extract only the checkins from 2009 and then deleted it. This is why the number of checkins is smaller than the original dataset. \n", + "- `brightkite_checkins.txt`, which contains check-in data in the form of a tab-separated file with five columns: `user id`, `check-in time`, `latitude`, `longitude`, and `location id`\n", " \n", - "- `data/brightkite/brightkite_friends_edges.txt`: the friendship network, a tsv file with 2 columns of users ids. This file it's untouched by the function, it's in the form of a graph edge list." + "- `brightkite_friends_edges.txt`, which is a tab-separated file with two columns containing user IDs and representing the friendship network in the form of a graph edge list. \n", + "\n", + "The `brightkite_checkins.txt` dataset must be converted into a graph before it can be analyzed properly, while the `brightkite_friends_edges.txt` dataset is already in a usable form for graph analysis.\n", + "\n", + "Let's have a more clear view of where our data have been generated" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique users: 35538\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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beDbIfJUrFr7XeT0ys2fP5++973v0VVXXUU333wzvfbaa0RE9Pzzz8fXcfP2yaWyHSJv66JFi+i2226jmpoaWrhwIf3yl7+kjz76KP4b6hF5m6xAjjqL2traaPHixYbrqHOKVlx33XUUi8Xo888/p/LycgqFQhPuJnlxkfqOOx12blcoFKJ3331X8dzAwACNjo7G05yt7VJLZzt5C9UjR47QtGnTTG2nSMrKyig/P19zv4uYXjOKi4vpqquuoo8//pjuuOMOIpJymxUVFfF13LZ9vBW70XaEQiEaGRmhgYEBRQ701KlT1NDQkN0Ep6iiooIikQh9/PHHROSNbTKCHHUWlZWV0ZVXXmm4TJ48OeXPP3jwIE2ePDne7am+vp7efvttRd3ozp07KRwOp3VDoGbndtXX19Phw4fp5MmTijT7/X6aPXt2VrdLLZ3tPHjwIBFR/OJpZjtFUlhYSLNnz6Zdu3Ypnt+1a5drL4TDw8P0u9/9jioqKmjGjBkUCoUU2zcyMkJvvfWWq7bPzHbMnj2bCgoKFOucPHmSDh8+7JptPX36NB0/fjx+Pnlhmww51owNDPX29rKDBw+yxx57jF1yySXs4MGD7ODBg+zs2bOMMcb+8z//k/3Lv/wL6+npYUeOHGE/+9nPWElJCVu+fHn8M7788ktWXl7OmpubWU9PD3vllVdYSUkJe+qpp5zarKTb9dVXX7Gamhp20003sffff5+98cYb7PLLL2dtbW3xzxBxu+T27t3LNmzYwA4ePMg++eQTtn37dhYOh9ntt98eX8fMdopm27ZtrKCggG3atIl9+OGHbMWKFay4uJgdO3bM6aSZ0t7ezt588032ySefsHfeeYctWLCATZ06NZ7+zs5OVlpayl555RXW09PDmpubWUVFBYvFYg6nXOns2bPx84aI4sdab28vY8zcdrS2trLLL7+cvfHGG+z9999nN954I5s5cyb76quvhNums2fPsvb2drZ371529OhRtnv3blZfX88uu+wyobfJTgjUglqyZAkjognL7t27GWOM/fKXv2SzZs1il1xyCSsqKmI1NTXsn/7pn9jo6Kjic37729+y73znO8zv97NQKMTWrFnjaBemZNvFmBTMb7vtNjZlyhQWDAZZW1uboisWY+Jtl9yBAwfYtddey0pLS9nkyZPZn/3Zn7HVq1ezoaEhxXpmtlM0zz77LItEIqywsJBdffXV7K233nI6SaYtWrSIVVRUsIKCAhYOh9mdd97JPvjgg/jr4+PjbPXq1SwUCjG/38+uv/561tPT42CKte3evVvzHFqyZAljzNx2XLhwgbW1tbFgMMimTJnCFixYwPr6+hzYGonRNp0/f57NnTuXTZ8+nRUUFLCqqiq2ZMmSCekVbZvshGkuAQAABIY6agAAAIEhUAMAAAgMgRoAAEBgCNQAAAACQ6AGAAAQGAI1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgCNQAAAAC+//I5b0716CumAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df_brighkite = pd.read_csv(os.path.join('test_data', 'brightkite', 'brightkite_checkins_full.txt'), \n", + " sep='\\t', \n", + " header=None,\n", + " names=['user id', 'check-in time', 'latitude', 'longitude', 'location id'],\n", + " parse_dates=['check-in time'],\n", + " engine='pyarrow')\n", + "\n", + "# take only the dates from 2009\n", + "df_brighkite = df_brighkite[df_brighkite['check-in time'].dt.year == 2009]\n", + "\n", + "# convert the dataframe to geopandas dataframe\n", + "gdf_brightkite = gpd.GeoDataFrame(df_brighkite, geometry=gpd.points_from_xy(df_brighkite.longitude, df_brighkite.latitude))\n", + "\n", + "# plot the geopandas dataframe\n", + "print(\"Number of unique users: \", len(df_brighkite['user id'].unique()))\n", + "gdf_brightkite.plot(marker='o', color='blue', markersize=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Familiar shape, isn't it? As we can see there are ~35k, a bit too much for our future computation. Let's take a subset, like Europe!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique users in Europe: 8525\n" + ] + }, + { + "data": { + "image/png": "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/eIXvwjf+c534JlnnoGLL7548fN+eoa2a5So23McHh6GD37wgwAA0G63Yd++ffCHf/iH8OUvfxkAyn1+tRUf559/Ppx//vmZHGvDhg2wY8cOeO211xYfxF/91V/ByMgIfPjDH87kHFmQ5ppffPFFAICeilYXhoeH4cMf/jA8+eST8Nu//duLnz/55JNwww03lFiyfDh16hT87//9v+FXf/VXyy5KLlx66aWwevVqePLJJ+FDH/oQAERxPU8//TTcf//9JZcuH9566y04fPhwbd4/Ywx88YtfhMcffxz27NkDl156ac/3/fAM465Rom7PkWOMgVOnTlXj+RUS1loyBw8eNC+++KK57777zLnnnmtefPFF8+KLL5r5+XljjDHvv/++ufLKK81v/MZvmBdeeMH8j//xP8zFF19s7rrrrpJLnoy9e/ear33ta+bFF180r7zyinnkkUfM2rVrzWc+85myi5aY3bt3m1arZf74j//Y/N3f/Z25++67zfLly82BAwfKLlpqtm7davbs2WNeeeUV8+yzz5pPfepTZsWKFbW+tvn5+cX3DAAW6+PBgweNMcbMzMyYsbEx8+1vf9vMzc2Z6elps2bNGnP8+PGSS+6H6/rm5+fN1q1bzd69e83+/fvNU089ZTZs2GAuuuii2lzfnXfeacbGxsyePXvMa6+9tridPHlycZ+6P8O4a6z7c/zKV75innnmGbN//37zwx/+0Hz1q181zWbT/NVf/ZUxpvznNxDiY/PmzQYAlmxPPfXU4j4HDx40v/Vbv2U+8IEPmImJCXPXXXeZhYWF8gqdgueff9585CMfMWNjY2bZsmXm537u58z27dvNiRMnyi5aKr7+9a+bqakpMzw8bH75l3+5Z0pcnbn55pvNmjVrTKvVMmvXrjU33nijeemll8ouViqeeuop8Z3bvHmzMSaaqrl9+3azevVqMzIyYq699lozNzdXbqEDcF3fyZMnzcaNG80FF1xgWq2WmZycNJs3bzaHDh0qu9jeSNcGAOab3/zm4j51f4Zx11j35/jP/tk/W2wvL7jgAvMbv/Ebi8LDmPKfX8MYYwpxsSiKoiiKosCAZDhVFEVRFKU6qPhQFEVRFKVQVHwoiqIoilIoKj4URVEURSkUFR+KoiiKohSKig9FURRFUQpFxYeiKIqiKIWi4kNRFEVRlEJR8aEoiqIoSqGo+FAURVEUpVBUfCiKoiiKUigqPhRFURRFKZT/B/kiCBFClwELAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gdf_brightkite = gdf_brightkite[gdf_brightkite['latitude'] < 60]\n", + "gdf_brightkite = gdf_brightkite[gdf_brightkite['latitude'] > 35]\n", + "gdf_brightkite = gdf_brightkite[gdf_brightkite['longitude'] < 30]\n", + "gdf_brightkite = gdf_brightkite[gdf_brightkite['longitude'] > -10]\n", + "\n", + "gdf_brightkite.plot(marker='o', color='blue', markersize=1)\n", + "\n", + "# update the pandas datafram with the new values\n", + "df_brighkite = gdf_brightkite\n", + "print(\"Number of unique users in Europe: \", len(df_brighkite['user id'].unique()))\n", + "\n", + "# remove from memory the geopandas dataframe, it was only used for plotting\n", + "del gdf_brightkite" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Perfect! Now we can create a new .txt file, only with the information that we need" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# update the file with the new values. Drop the columns that are not needed\n", + "df_brighkite.to_csv(\n", + " os.path.join('test_data', 'brightkite', 'brightkite_checkins.txt'), \n", + " sep='\\t', \n", + " header=False, \n", + " index=False, \n", + " columns=['user id', 'location id'])" ] }, { @@ -225,9 +381,122 @@ "\n", "Gowalla is a location-based social networking website where users share their locations by checking-in. The friendship network is undirected and was collected using their public API. As for Brightkite, we will work with two different datasets. This is how they look like after being filtered by the `download_dataset` function:\n", "\n", - "- `data/gowalla/gowalla_checkins.txt`: the checkins, a tsv file with 2 columns of user id and location. This is not in the form of a graph edge list. Originally there were other columns, such as the time of the checkins. During the filtering, we used this information to extract only the checkins from 2009 and then deleted it. This is why the number of checkins is smaller than the original dataset. \n", + "- `data/gowalla/gowalla_checkins.txt`: the checkins, a tsv file with 5 columns: `user id`, `check-in time`, `latitude`, `longitude`, `location id`\n", + "\n", + "- `data/gowalla/gowalla_friends_edges.txt`: the friendship network, a tsv file with 2 columns of users ids. This file it's untouched by the function, it's in the form of a graph edge list. \n", + "\n", + "--- \n", + "\n", + "Let's have a more clear view of where our data have been generated" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique users: 12611\n" + ] + }, + { + "data": { + "image/png": "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DzweT+ix/LKsYSEiIso8w8PDKCkpibuMaRlsjx07huPHj+O+++5DSUkJOjo68OSTT6Kmpgb/8R//AUAZujx37lxUVFTgueeew8DAAFavXo3ly5cbHrocDAZx4cIFTJ48OWbTkVWGhoYwc+ZM9PX1Zf3IJm6LMG4LBbdDGLeFgtshLBu2hRACw8PD8Pl8yMmJ3yvFtA62Ho8He/fuxdatWzEyMgK/3481a9bghz/8YWgZt9uNN998E3/zN3+Db3zjGygsLER9fT2ef/55w5+Tk5ODGTNmmPEVUmbKlCmO3dkSxW0Rxm2h4HYI47ZQcDuEOX1bjFejIpkWrMybNw/Hjx8fd7mqqir813/9l1nFICIiogzHuYGIiIjI1hismMjj8WDz5s0RHYKzFbdFGLeFgtshjNtCwe0Qxm0RybQOtkRERESpwJoVIiIisjUGK0RERGRrDFaIiIjI1hisEBERka0xWEmRlpYWLF68GEVFRbjtttt0l9Gb9DEQCEQs093djdraWhQWFuL222/Htm3bDM2bYBdGtkNvby+WLVuG4uJilJeXY/369RgdHY1YJtO3g57q6uqo//+GDRsiljGybZxi586dmDVrFgoKCjB//ny89957VhfJVHqTwHq93tDrQghs2bIFPp8PhYWF+OY3v4mTJ09aWOLUOXLkCJYtWwafzweXy4Vf/OIXEa8b+e4jIyP427/9W5SXl6O4uBjf+c538Mknn6TxW0zceNth9erVUfuInFNPcsJ2SAaDlRQZHR3FY489hrVr18ZdbteuXbh48WLo1tDQEHptaGgI999/P3w+Hzo6OvDyyy/j+eefx4svvmh28VNmvO0wNjaGpUuX4vr163j//fexZ88e/Pu//zuam5tDyzhhO8Sybdu2iP//j370o9BrRraNU+zduxdPPPEENm3ahK6uLtxzzz146KGH0Nvba3XRTPXVr3414v/f3d0deu3HP/4xXnzxRezYsQMdHR3wer24//77MTw8bGGJU+P69eu46667sGPHDt3XjXz3J554Am+88Qb27NmD999/H5999hkefvhhjI2NpetrTNh42wEAHnzwwYh95K233op43QnbISmCUmrXrl2ipKRE9zUA4o033oj53p07d4qSkhLxxRdfhJ7bvn278Pl8IhgMprik5oq1Hd566y2Rk5Mjzp8/H3pu9+7dwuPxiMHBQSGEs7aDmt/vFz/5yU9ivm5k2zjFn//5n4vGxsaI577yla+IDRs2WFQi823evFncdddduq8Fg0Hh9XpFa2tr6LkvvvhClJSUiEAgkKYSpof2OGjku1+7dk3k5eWJPXv2hJY5f/68yMnJEb/61a/SVvZU0jsfNDQ0iEceeSTme5y4HYxizUqaNTU1oby8HAsWLEAgEEAwGAy9duzYMdTW1kYkAXrggQdw4cIFnDt3zoLSpt6xY8cwZ84c+Hy+0HMPPPAARkZG0NnZGVrGqdvh2WefxdSpUzF37ly0tLRENPEY2TZOMDo6is7OTixZsiTi+SVLluDo0aMWlSo9Tp06BZ/Ph1mzZmHVqlU4c+YMAODs2bPo7++P2CYejwe1tbWO3yZGvntnZydu3rwZsYzP58OcOXMct30OHz6M6dOnY/bs2VizZg0uXboUei2btoOWaXMDUbRnnnkG3/72t1FYWIj/+Z//QXNzMy5fvhxqCujv70d1dXXEeyoqKkKvzZo1K91FTrn+/v7Qd5JKS0uRn5+P/v7+0DJO3A7f//73MW/ePJSWluI3v/kNNm7ciLNnz+KVV14BYGzbOMHly5cxNjYW9V0rKioc9T21Fi5ciNdffx2zZ8/GH/7wB/z93/89Fi9ejJMnT4a+t9426enpsaK4aWPku/f39yM/Px+lpaVRyzhpn3nooYfw2GOPwe/34+zZs3j66afxrW99C52dnfB4PFmzHfSwZiUOvQ5x2tuJEycMr+9HP/oRFi1ahLlz56K5uRnbtm3Dc889F7GMy+WKeCz+2KlU+3w6pXo76H0XIUTE83bcDnoS2TZPPvkkamtr8bWvfQ3f+973EAgE8Oqrr+LKlSuh9RnZNk6h9z924veUHnroIfzVX/0V7rzzTvzlX/4l3nzzTQDAa6+9Flom27aJWjLf3WnbZ+XKlVi6dCnmzJmDZcuW4e2338bHH38c2ldicdp20MOalTiampqwatWquMtoawAScffdd2NoaAh/+MMfUFFRAa/XGxUdyypA7VVHOqVyO3i9Xvz617+OeO7q1au4efNm6DvadTvomci2kb38T58+jalTpxraNk5QXl4Ot9ut+z920vccT3FxMe68806cOnUKy5cvB6DUIFRWVoaWyYZtIkdExfvuXq8Xo6OjuHr1akStwqVLl7B48eL0FjiNKisr4ff7cerUKQDZux0A1qzEVV5ejq985StxbwUFBUmvv6urCwUFBaEhvosWLcKRI0ci+jEcOHAAPp9vQkHRRKVyOyxatAgfffQRLl68GHruwIED8Hg8mD9/fmgZO24HPRPZNl1dXQAQOkAb2TZOkJ+fj/nz5+PgwYMRzx88eNDxB1y1kZER/O53v0NlZSVmzZoFr9cbsU1GR0fx7rvvOn6bGPnu8+fPR15eXsQyFy9exEcffeTo7XPlyhX09fWFjhHZuh0AcDRQqvT09Iiuri6xdetWMWnSJNHV1SW6urrE8PCwEEKI//zP/xT//M//LLq7u8Xp06fFz372MzFlyhSxfv360DquXbsmKioqRF1dneju7hb79+8XU6ZMEc8//7xVXyth422HW7duiTlz5ohvf/vb4oMPPhCHDh0SM2bMEE1NTaF1OGE7aB09elS8+OKLoqurS5w5c0bs3btX+Hw+8Z3vfCe0jJFt4xR79uwReXl54tVXXxW//e1vxRNPPCGKi4vFuXPnrC6aaZqbm8Xhw4fFmTNnxPHjx8XDDz8sJk+eHPrOra2toqSkROzfv190d3eLuro6UVlZKYaGhiwu+cQNDw+HjgUAQr+Fnp4eIYSx797Y2ChmzJghDh06JD744APxrW99S9x1113i1q1bVn2thMXbDsPDw6K5uVkcPXpUnD17Vrzzzjti0aJF4vbbb3fcdkgGg5UUaWhoEACibu+8844QQoi3335bzJ07V0yaNEkUFRWJOXPmiJdeekncvHkzYj0ffvihuOeee4TH4xFer1ds2bIlo4brjrcdhFACmqVLl4rCwkJRVlYmmpqaIoYpC5H520Grs7NTLFy4UJSUlIiCggLx5S9/WWzevFlcv349Yjkj28Yp/vEf/1H4/X6Rn58v5s2bJ959912ri2SqlStXisrKSpGXlyd8Pp949NFHxcmTJ0OvB4NBsXnzZuH1eoXH4xH33nuv6O7utrDEqfPOO+/oHhcaGhqEEMa+++effy6amppEWVmZKCwsFA8//LDo7e214NskL952uHHjhliyZImYNm2ayMvLE1VVVaKhoSHqOzphOyTDJUSGpwUlIiIiR2OfFSIiIrI1BitERERkawxWiIiIyNYYrBAREZGtMVghIiIiW2OwQkRERLbGYIWIiIhsjcEKERER2RqDFSIiIrI1BitERERkawxWiIiIyNYYrBAREZGt/X9lETeeUsVwyAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df_gowalla = pd.read_csv(os.path.join('test_data', 'gowalla', 'gowalla_checkins_full.txt'),\n", + " sep='\\t', \n", + " header=None,\n", + " names=['user id', 'check-in time', 'latitude', 'longitude', 'location id'],\n", + " parse_dates=['check-in time'],\n", + " engine='pyarrow')\n", + "\n", + "# take only the dates from 2009\n", + "df_gowalla = df_gowalla[df_gowalla['check-in time'].dt.year == 2009]\n", "\n", - "- `data/gowalla/gowalla_friends_edges.txt`: the friendship network, a tsv file with 2 columns of users ids. This file it's untouched by the function, it's in the form of a graph edge list. In the next section when we will build the friendship network, we will only consider the users that have at least one check-in in 2009 to avoid having biases in the analysis." + "# convert the dataframe to geopandas dataframe\n", + "gdf_gowalla = gpd.GeoDataFrame(df_gowalla, geometry=gpd.points_from_xy(df_gowalla.longitude, df_gowalla.latitude))\n", + "\n", + "# plot the geopandas dataframe\n", + "gdf_gowalla.plot(marker='o', color='red', markersize=1)\n", + "print(\"Number of unique users: \", len(df_gowalla['user id'].unique()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is still a bit too much, to help us in the next sections, let's take a subset of the European are" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique users in the UE area: 3718\n" + ] + }, + { + "data": { + "image/png": "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hw7RRz7yEbr99ttpeHg46Kb55v3vf7/p/RocHAy6SUWZmJigD3zgA7Rt2zbt9V/4whfoiSeeoG3bttHAwAC1tLTQLbfcMrugZCVweo5ERLfddpvpfX3++efL2MLi7Nu3jx588EF6+eWXac+ePXTx4kVauXIlTUxMzN6m0t9HN8+RqLLfx8svv5z6+vrowIEDdODAAbrpppvorrvumg0wAn8PWcR9/etfZ01NTXmXP//88ywej7PXX3999rIdO3aw+vp6Njo6WsYW+iedTrN///d/D7oZvvmzP/sz1t3dbbrsve99L+vp6QmoRf7atGkT+8AHPhB0M0qGiNizzz47+//MzAxraWlhfX19s5edO3eONTU1sVwuF0ALi6c+R8YYW7NmDbvrrrsCaU8pnDx5khER27dvH2Msmu+j+hwZi977yBhjzc3N7Ktf/Woo3sPIZj6cvPTSS7Rs2TJqa2ubvezWW2+lqakpOnjwYIAtK87nP/95mj9/Pn3wgx+k3t7eiu1GOn/+PB08eJBWrlxpunzlypW0f//+gFrlvyNHjlBbWxstWbKEVq9eTa+99lrQTSqZo0eP0okTJ0zvaX19Pd1www2Rek+JiPbu3UuXXXYZLV26lO6//346efJk0E0q2OjoKBERpVIpIorm+6g+RyEq7+P09DTt3LmTJiYmaPny5aF4D0O3qm25nDhxghYuXGi6rLm5merq6ujEiRMBtao4Dz/8MF1zzTXU3NxMv/zlL+mxxx6jo0eP0le/+tWgm+bZH/7wB5qens57jxYuXFix74/qQx/6EH3zm9+kpUuX0u9//3v63Oc+RytWrKDDhw/T/Pnzg26e78T7pntPh4aGgmhSSdx+++30sY99jNLpNB09epQ+85nP0E033UQHDx6suJLdjDH61Kc+RX/+539Oy5YtI6LovY+650gUjfdxcHCQli9fTufOnaNLLrmEnn32WXrf+943G2AE+R5WVPCxefNm+uxnP2t7m4GBAcpkMq62F4vF8i5jjGkvD4qX5/wv//Ivs5ddddVV1NzcTPfee+9sNqQSqe9F2N6fYtx+++2zf1955ZW0fPlyete73kXf+MY36FOf+lSALSutKL+nRESrVq2a/XvZsmWUyWQonU7T97//fbrnnnsCbJl369ato1/96lf0s5/9LO+6qLyPVs8xCu/je97zHnr11VfprbfeomeeeYbWrFlD+/btm70+yPewooKPdevW0erVq21vs3jxYlfbamlpoV/84hemy86cOUMXLlzIiwaDVMxzFiOz//d//7figo8FCxZQIpHIy3KcPHkyVO+PnxoaGujKK6+kI0eOBN2UkhAzeU6cOEGtra2zl0f5PSUiam1tpXQ6XXHv6yc/+Un63ve+Ry+++CJdfvnls5dH6X20eo46lfg+1tXV0bvf/W4iIspkMjQwMEBPPvkkPfroo0QU7HtYUcHHggULaMGCBb5sa/ny5dTb20vHjx+fffF/9KMfUX19PV177bW+PIYfinnOhw4dIiIyfbgqRV1dHV177bW0Z88euvvuu2cv37NnD911110Btqx0pqam6De/+Q195CMfCbopJbFkyRJqaWmhPXv20NVXX01EfGzPvn376POf/3zArSudU6dO0cjISMV8Dxlj9MlPfpKeffZZ2rt3Ly1ZssR0fRTeR6fnqFNp76MOY4ympqbC8R6WZVhrAIaGhtihQ4fYZz/7WXbJJZewQ4cOsUOHDrHx8XHGGGMXL15ky5YtYzfffDN75ZVX2H/913+xyy+/nK1bty7glhdm//797IknnmCHDh1ir732Gtu1axdra2tjf/3Xfx100wq2c+dOVltby772ta+xX//612z9+vWsoaGBHTt2LOim+WLDhg1s79697LXXXmMvv/wy+6u/+ivW2NhY0c9vfHx89rtGRLOfyaGhIcYYY319faypqYl997vfZYODgyybzbLW1lY2NjYWcMvds3uO4+PjbMOGDWz//v3s6NGj7Cc/+Qlbvnw5+5M/+ZOKeY5r165lTU1NbO/evez48eOzp8nJydnbVPr76PQco/A+PvbYY+zFF19kR48eZb/61a/Ypz/9aRaPx9mPfvQjxljw72Fkg481a9YwIso7/eQnP5m9zdDQELvjjjvY3LlzWSqVYuvWrWPnzp0LrtFFOHjwIPvQhz7Empqa2Jw5c9h73vMetmnTJjYxMRF004rypS99iaXTaVZXV8euueYa01S4Srdq1SrW2trKamtrWVtbG7vnnnvY4cOHg25WUX7yk59ov3dr1qxhjPFpmps2bWItLS2svr6eXX/99WxwcDDYRntk9xwnJyfZypUr2aWXXspqa2tZe3s7W7NmDRseHg662a7pnhsRsa9//euzt6n099HpOUbhffzHf/zH2d/OSy+9lN18882zgQdjwb+HMcYYK0uKBQAAAIAiXOEUAAAAwgnBBwAAAJQVgg8AAAAoKwQfAAAAUFYIPgAAAKCsEHwAAABAWSH4AAAAgLJC8AEAAABlheADAAAAygrBBwAAAJQVgg8AAAAoq/8PbqGeg5r8pNAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gdf_gowalla = gdf_gowalla[gdf_gowalla['latitude'] < 60]\n", + "gdf_gowalla = gdf_gowalla[gdf_gowalla['latitude'] > 35]\n", + "gdf_gowalla = gdf_gowalla[gdf_gowalla['longitude'] < 30]\n", + "gdf_gowalla = gdf_gowalla[gdf_gowalla['longitude'] > -10]\n", + "\n", + "gdf_gowalla.plot(marker='o', color='red', markersize=1)\n", + "\n", + "df_gowalla = gdf_gowalla\n", + "print(\"Number of unique users in the UE area: \", len(df_gowalla['user id'].unique()))\n", + "\n", + "# remove from memory the geopandas dataframe, it was only used for plotting\n", + "del gdf_gowalla" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Perfect! Now we can create a new .txt file, only with the information that we need" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# update the file with the new values. Drop the columns that are not needed\n", + "df_gowalla.to_csv(\n", + " os.path.join('test_data', 'gowalla', 'gowalla_checkins.txt'), \n", + " sep='\\t', \n", + " header=False, \n", + " index=False, \n", + " columns=['user id', 'location id'])" ] }, { @@ -239,13 +508,96 @@ "\n", "[Foursquare](https://foursquare.com/) is a location-based social networking website where users share their locations by checking-in. This dataset includes long-term (about 22 months from Apr. 2012 to Jan. 2014) global-scale check-in data collected from Foursquare, and also two snapshots of user social networks before and after the check-in data collection period (see more details in our paper). We will work with three different datasets:\n", "\n", - "- `data/foursquare/foursquare_checkins.txt`: a tsv file with 2 columns of user id and location. This is not in the form of a graph edge list. This fill will remain untouched by the function but due to its size, in the next sections we will focus on the EU sub-sample and the IT sub-sample. The friendship edge list will be modified accordingly.\n", + "- `data/foursquare/foursquare_checkins.txt`: a tsv file with 4 columns: `User ID`, `Venue ID`, `UTC time`, `Timezone offset in minutes` \n", "\n", "- `data/foursquare/foursquare_friends_edges.txt`: the friendship network, a tsv file with 2 columns of users ids. This is in the form of a graph edge list. \n", "\n", - "- `data/foursquare/raw_POIs.txt`: the POIS, a tsv file with 2 columns of location and country ISO. We are going to use this file to create the sub-samples of the dataset.\n", + "- `data/foursquare/raw_POIs.txt`: the POIS, a tsv file with 5 columns: `Venue ID`, `Latitude`, `Longitude`, `Venue category name`, `Country code (ISO)`.\n", + "\n", + "--- \n", "\n", - "> **NOTE:** In this case I preferred not to take sub-samples based on time. The reason is that there may be a period of time where the social network was not very popular in some countries, so the analysis may be biased. Instead, I decided to take sub-samples based on the country. In this way I have a more homogeneous dataset." + "This dataset is by far the biggest of the 3 that we got. The check-in dataset contains 22,809,624 checkins by 114,324 users on 3,820,891 venues. The social network data contains 607,333 friendships. As explained before, we are going to need sub-samples! In this case, we'll take only data from 2012 that have been generated in Italy. Due to the size of the full network, this time we won't plot it, otherwise our RAM might cry. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting to plot\n", + "Number of unique users in Italy: 2555\n" + ] + }, + { + "data": { + "image/png": "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PgouYMi45pIOHw7+zuf1Na7V7FYXGAggUgA0ytiYDgKIS+UD9LXijOuVihb3SkVboDayWaLjx/VxtiwVXAQR9D2YkwIAdI9ajeiyy+rnmCoVHVpOFGSrMEnX0AUSgjkpAED6GRvTrj9Z20qpQKCIdAqlrDFUudZZgb4DIgUASDdjY0Q336xdfNWqFjGuzAv6Hrj7AAAAdBy4+wAAAPQ8ECkAAACpBSIFAAAgtUCkAAAApBaIFAAAgNQCkQIAAJBaIFIAAABSC0QKAABAaoFIAQAASC0QKQAAAKkFIgUAACC1QKQAAACklkQiVa1W6ZxzzqFly5bRsmXL6A1veAP967/+a2ifhx56iC644AJavnw5LV26lF7/+tfT3r17W9ppAAAAg0EikTrttNNoYmKCJicnaXJykt785jfThRdeSA8++CAREf3hD3+g8847j17xilfQ3XffTb/85S/pM5/5DC1atKgtnQcAANDfNF2qo1gs0he/+EX64Ac/SBdddBHl83n653/+54bbQ6kOAADof9peqmN2dpZuvfVWOnToEL3hDW+gubk5+tGPfkQvf/nL6fzzz6eTTz6ZXve619Htt98e2c6xY8doZmYmtAEAAABEDYjUnj176KSTTqKFCxfS2NgY7dy5k84880x66qmn6LnnnqOJiQl6xzveQT/5yU/oPe95D733ve+le+65x9ne9ddfT8uXL5/fVq9e3dQJAQAA6B8Su/uOHz9Oe/fupWeffZa+853v0De+8Q2655576AUveAGdeuqpVKlUaNu2bfP7X3DBBbRkyRLavn27tb1jx47RsWPH5p/PzMzQ6tWr4e4DAIA+xtfdtyBpw0NDQ/Syl72MiIjK5TLt3r2bvva1r9HXv/51WrBgAZ155pmh/V/5ylfSz3/+c2d7CxcupIULFybtBgAAgAGg6XVSSik6duwYDQ0N0dq1a+m3v/1t6P2HH36YSqVSsx8DAABgAElkSX3qU5+iv/mbv6HVq1fTwYMH6dZbb6W7776b7rjjDiIiuuaaa2jTpk20fv16etOb3kR33HEH/eAHP6C77767HX0HAADQ5yQSqT//+c90ySWX0JNPPknLly+nc845h+644w5629veRkRE73nPe6hWq9H1119PV1xxBZ1xxhn0ne98h84777y2dB4AAEB/0/Q6qVaDdVIAAND/tH2dFAAAANBuIFIAAABSC0QKAABAaoFIAQAASC0QKQAAAKkFIgUAACC1QKQASANr1xJlMkRDQ0S1Wrd7A0BqgEgBkAYmJ/XjiRNEExPd7QsAKQIiBUAaKJf1Yz5PND7e3b4AkCISZ0EHALSB3bu73QMAUgksKQAAAKkFIgUAACC1QKQAAACkFogUAACA1AKRAgAAkFogUgAAAFILRAoAAEBqgUgBAABILRApAAAAqQUiBQAAILVApAAAAKQWiBQAAIDUApECAACQWlKXBV0pRUREMzMzXe4JAACAdsFjPI/5LlInUgcPHiQiotWrV3e5JwAAANrNwYMHafny5c73MypOxjrM3NwcPfHEE7R06VLKZDLd7k7LmZmZodWrV9O+ffto2bJl3e5O28B59h+Dcq44z86glKKDBw/SqlWrKJt1zzylzpLKZrN02mmndbsbbWfZsmV9/QNgcJ79x6CcK86z/URZUAwCJwAAAKQWiBQAAIDUApHqMAsXLqRrr72WFi5c2O2utBWcZ/8xKOeK80wXqQucAAAAABhYUgAAAFILRAoAAEBqgUgBAABILRApAAAAqQUi1SGef/55+vSnP00veclLaPHixfTSl76UPve5z9Hc3Fy3u9YU9957L73rXe+iVatWUSaTodtvvz30vlKKPvvZz9KqVato8eLF9MY3vpEefPDB7nS2CaLO88SJE/SJT3yCXvWqV9GSJUto1apVdOmll9ITTzzRvQ43SNz/U/LhD3+YMpkMffWrX+1Y/1qFz3k+9NBDdMEFF9Dy5ctp6dKl9PrXv5727t3b+c42Sdy5Pvfcc3T55ZfTaaedRosXL6ZXvvKVVK1Wu9NZCxCpDvH5z3+earUa3XTTTfTQQw/RF77wBfriF79IX//617vdtaY4dOgQnXvuuXTTTTdZ3//CF75AX/7yl+mmm26i3bt30ymnnEJve9vb5nM09gpR53n48GG6//776TOf+Qzdf//99N3vfpcefvhhuuCCC7rQ0+aI+38yt99+O/33f/83rVq1qkM9ay1x5/mHP/yBzjvvPHrFK15Bd999N/3yl7+kz3zmM7Ro0aIO97R54s716quvpjvuuIO+/e1v00MPPURXX301ffSjH6Xvfe97He6pAwU6wjvf+U71gQ98IPTae9/7XnXxxRd3qUeth4jUzp0755/Pzc2pU045RU1MTMy/dvToUbV8+XJVq9W60MPWYJ6njfvuu08RkZqamupMp9qA6zwfe+wxdeqpp6pf//rXqlQqqa985Ssd71srsZ3npk2b+uq3ydjO9ayzzlKf+9znQq+95jWvUZ/+9Kc72DM3sKQ6xHnnnUf//u//Tg8//DAREf3yl7+kn//85/S3f/u3Xe5Z+3jkkUfoT3/6E7397W+ff23hwoW0YcMG2rVrVxd71n6mp6cpk8nQC17wgm53paXMzc3RJZdcQtdccw2dddZZ3e5OW5ibm6Mf/ehH9PKXv5zOP/98Ovnkk+l1r3tdpOuzlznvvPPo+9//Pj3++OOklKK77rqLHn74YTr//PO73TUigruvY3ziE5+gSqVCr3jFKyifz9OrX/1quuqqq6hSqXS7a23jT3/6ExERvehFLwq9/qIXvWj+vX7k6NGjND4+TqOjo32XoPTzn/88LViwgK644opud6VtPPXUU/Tcc8/RxMQEveMd76Cf/OQn9J73vIfe+9730j333NPt7rWcG2+8kc4880w67bTTaGhoiN7xjnfQLbfcQuedd163u0ZEKcyC3q/cdttt9O1vf5u2bdtGZ511Fj3wwAN01VVX0apVq+h973tft7vXVsySK0qpvizDQqSDKC666CKam5ujW265pdvdaSn/8z//Q1/72tfo/vvv79v/HxHNBzNdeOGFdPXVVxMR0V/91V/Rrl27qFar0YYNG7rZvZZz44030n/913/R97//fSqVSnTvvffSRz7yEXrxi19Mb33rW7vdPYhUp7jmmmtofHycLrroIiIietWrXkVTU1N0/fXX961InXLKKUSkLaoXv/jF868/9dRTddZVP3DixAnauHEjPfLII/TTn/6076yon/3sZ/TUU0/RyMjI/Guzs7P0sY99jL761a/So48+2r3OtZAXvvCFtGDBAjrzzDNDr7/yla+kn//8513qVXs4cuQIfepTn6KdO3fSO9/5TiIiOuecc+iBBx6gL33pS6kQKbj7OsThw4frCnvlcrmeD0GP4iUveQmdcsopdOedd86/dvz4cbrnnnto3bp1XexZ62GB+t3vfkf/9m//RitWrOh2l1rOJZdcQr/61a/ogQcemN9WrVpF11xzDf34xz/udvdaxtDQEK1du5Z++9vfhl5/+OGHqVQqdalX7eHEiRN04sSJVI9NsKQ6xLve9S7aunUrjYyM0FlnnUW/+MUv6Mtf/jJ94AMf6HbXmuK5556j3//+9/PPH3nkEXrggQeoWCzSyMgIXXXVVXTdddfR6aefTqeffjpdd911VCgUaHR0tIu9Tk7Uea5atYr+7u/+ju6//3764Q9/SLOzs/NzbsVikYaGhrrV7cTE/T9N8c3n83TKKafQGWec0emuNkXceV5zzTW0adMmWr9+Pb3pTW+iO+64g37wgx/Q3Xff3b1ON0jcuW7YsIGuueYaWrx4MZVKJbrnnnvoW9/6Fn35y1/uYq8F3Q4vHBRmZmbUlVdeqUZGRtSiRYvUS1/6UrVlyxZ17NixbnetKe666y5FRHXb+973PqWUDkO/9tpr1SmnnKIWLlyo1q9fr/bs2dPdTjdA1Hk+8sgj1veISN11113d7noi4v6fJr0agu5znt/85jfVy172MrVo0SJ17rnnqttvv717HW6CuHN98skn1fvf/361atUqtWjRInXGGWeoG264Qc3NzXW34/8HSnUAAABILZiTAgAAkFogUgAAAFILRAoAAEBqgUgBAABILRApAAAAqQUiBQAAILVApAAAAKQWiBQAAIDUApECAACQWiBSAAAAUgtECgAAQGqBSAEAAEgt/x/qY2bSZUAFiQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import geopandas as gpd\n", + "\n", + "df_foursquare_POIS = pd.read_csv(os.path.join('test_data', 'foursquare', 'raw_POIs.txt'), \n", + " sep='\\t',\n", + " header=None,\n", + " names=['venue id', 'latitude', 'longitude', 'venue category name', 'ISO code'],\n", + " dtype={'venue id': str, 'latitude': float, 'longitude': float, 'venue category name': str, 'ISO code': str},\n", + " engine='c')\n", + "\n", + "df_foursquare_checkins = pd.read_csv(os.path.join('test_data', 'foursquare', 'foursquare_checkins_full.txt'),\n", + " sep='\\t',\n", + " header=None,\n", + " names=['user id', 'venue id', 'UTC time', 'offset'],\n", + " dtype={'user id': str, 'venue id': str, 'UTC time': str, 'offset': int},\n", + " engine='c')\n", + "\n", + "# Take only the data with IT ISO code\n", + "df_foursquare_POIS = df_foursquare_POIS[df_foursquare_POIS['ISO code'] == 'IT']\n", + "\n", + "# Take only the checkins that are in the POIs (filtered by ISO code) and viceversa\n", + "df_foursquare_checkins = df_foursquare_checkins[df_foursquare_checkins['venue id'].isin(df_foursquare_POIS['venue id'])]\n", + "df_foursquare_POIS = df_foursquare_POIS[df_foursquare_POIS['venue id'].isin(df_foursquare_checkins['venue id'])]\n", + "\n", + "# Convert to datetime\n", + "df_foursquare_checkins['UTC time'] = pd.to_datetime(df_foursquare_checkins['UTC time'])\n", + "\n", + "# Take only the data from 2012\n", + "df_foursquare_checkins = df_foursquare_checkins[df_foursquare_checkins['UTC time'].dt.year == 2012]\n", + "\n", + "# convert the dataframe to geopandas dataframe\n", + "gdf_foursquare_POIS = gpd.GeoDataFrame(df_foursquare_POIS, geometry=gpd.points_from_xy(df_foursquare_POIS.longitude, df_foursquare_POIS.latitude))\n", + "\n", + "# plot the geopandas dataframe\n", + "print(\"Starting to plot\")\n", + "gdf_foursquare_POIS.plot(marker='o', color='red', markersize=1)\n", + "print('Number of unique users in Italy: ', len(df_foursquare_checkins['user id'].unique()))\n", + "\n", + "# delete from memory the geo dataframe, it was only used for plotting\n", + "del gdf_foursquare_POIS" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "df_foursquare_checkins.to_csv(\n", + " os.path.join('test_data', 'foursquare', 'foursquare_checkins.txt'),\n", + " sep='\\t',\n", + " header=False,\n", + " index=False,\n", + " columns=['user id', 'venue id'])" ] }, { @@ -262,23 +614,42 @@ "source": [ "We are going to build the the networks for the three datasets as an undirected graph $M = (V, E)$, where $V$ is the set of nodes and $E$ is the set of edges. The nodes represent the users and the edges indicates that two individuals visited the same location at least once.\n", "\n", - "The check-ins files of the three datasets are not in the form of a graph edge list, so we need to manipulate them. Let's have a look at the number of lines of each file (note that gowalla and brightkite are already filtered)." + "The check-ins files of the three datasets are not in the form of a graph edge list, so we need to manipulate them. Let's have a look at the number of lines of each file." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "gowalla\n", + "Number of lines: 83269\n", + "Number of unique elements: 3718\n", + "\n", + "brightkite\n", + "Number of lines: 391220\n", + "Number of unique elements: 8525\n", + "\n", + "foursquare\n", + "Number of lines: 125076\n", + "Number of unique elements: 2555\n", + "\n" + ] + } + ], "source": [ "def count_lines_and_unique_elements(file):\n", " df = pd.read_csv(file, sep='\\t', header=None)\n", " print('Number of lines: ', len(df))\n", " print('Number of unique elements: ', len(df[0].unique()))\n", "\n", - "gowalla_path = os.path.join('data', 'gowalla', 'gowalla_checkins.txt')\n", - "brightkite_path = os.path.join('data', 'brightkite', 'brightkite_checkins.txt')\n", - "foursquare_path = os.path.join('data', 'foursquare', 'foursquare_checkins.txt')\n", + "gowalla_path = os.path.join('test_data', 'gowalla', 'gowalla_checkins.txt')\n", + "brightkite_path = os.path.join('test_data', 'brightkite', 'brightkite_checkins.txt')\n", + "foursquare_path = os.path.join('test_data', 'foursquare', 'foursquare_checkins.txt')\n", "\n", "_ = [gowalla_path, brightkite_path, foursquare_path]\n", "\n", @@ -309,17 +680,71 @@ "\n", "- `brightkite`\n", "- `gowalla`\n", - "- `foursquareEU`\n", - "- `foursquareIT`\n", + "- `foursquare`\n", "\n", "Let's see how it works:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Creating the graph for the dataset brightkite...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 84831/84831 [00:00<00:00, 285874.40it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done! The graph has 292973 edges and 6493 nodes\n", + "\n", + "Creating the graph for the dataset gowalla...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 31095/31095 [00:00<00:00, 329181.10it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done! The graph has 62790 edges and 3073 nodes\n", + "\n", + "Creating the graph for the dataset foursquare...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 40650/40650 [00:00<00:00, 131337.54it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done! The graph has 246702 edges and 2324 nodes\n" + ] + } + ], "source": [ "# It takes about 3 minutes to create the all the 4 graphs on a i7-8750H CPU\n", "\n", @@ -329,11 +754,8 @@ "G_gowalla_checkins = create_graph_from_checkins('gowalla')\n", "G_gowalla_checkins.name = 'Gowalla Checkins Graph'\n", "\n", - "G_foursquareEU_checkins = create_graph_from_checkins('foursquareEU')\n", - "G_foursquareEU_checkins.name = 'Foursquare EU Checkins Graph'\n", - "\n", - "G_foursquareIT_checkins = create_graph_from_checkins('foursquareIT')\n", - "G_foursquareIT_checkins.name = 'Foursquare IT Checkins Graph'" + "G_foursquare_checkins = create_graph_from_checkins('foursquare')\n", + "G_foursquare_checkins.name = 'Foursquare Checkins Graph'" ] }, { @@ -349,8 +771,7 @@ "\n", "- `brightkite`\n", "- `gowalla`\n", - "- `foursquareEU`\n", - "- `foursquareIT`\n", + "- `foursquare`\n", "\n", "> **NOTE:** This functions is implemented without the necessity of the checkins graphs being loaded in memory, it uses the edge list file. This choice was made since someone may want to perform some analysis only on the friendship network and so there is no need to load the checkins graph and waste memory. Furthermore, networkx is tremendously slow when loading a graph from an edge list file (since it's written in pure python), so this choice is also motivated by the speed of the function.\n", "\n", @@ -359,9 +780,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computation done for Brightkite friendship graph\n", + "Computation done for Gowalla friendship graph\n", + "Computation done for Foursquare friendship graph\n" + ] + } + ], "source": [ "G_brighkite_friends = create_friendships_graph('brightkite')\n", "print(\"Computation done for Brightkite friendship graph\")\n", @@ -369,18 +800,13 @@ "\n", "\n", "G_gowalla_friends = create_friendships_graph('gowalla')\n", - "print(\"Computation done for (filtered) Gowalla friendship graph\")\n", - "G_gowalla_friends.name = '(Filtered) Gowalla Friendship Graph'\n", - "\n", + "print(\"Computation done for Gowalla friendship graph\")\n", + "G_gowalla_friends.name = 'Gowalla Friendship Graph'\n", "\n", - "G_foursquareIT_friends = create_friendships_graph('foursquareIT')\n", - "print(\"Computation done for Foursquare IT friendship graph\")\n", - "G_foursquareIT_friends.name = 'Foursquare IT Friendship Graph'\n", "\n", - "\n", - "G_foursquareEU_friends = create_friendships_graph('foursquareEU')\n", - "print(\"Computation done for Foursquare EU friendship graph\")\n", - "G_foursquareEU_friends.name = 'Foursquare EU Friendship Graph'" + "G_foursquare_friends = create_friendships_graph('foursquare')\n", + "print(\"Computation done for Foursquare friendship graph\")\n", + "G_foursquare_friends.name = 'Foursquare Friendship Graph'" ] }, { @@ -393,11 +819,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Brightkite Friendship Graph\n", + "Number of nodes: 5420\n", + "Number of edges: 14690\n", + "\n", + "(Filtered) Gowalla Friendship Graph\n", + "Number of nodes: 2294\n", + "Number of edges: 5548\n", + "\n", + "Foursquare Friendship Graph\n", + "Number of nodes: 1397\n", + "Number of edges: 5323\n", + "\n" + ] + } + ], "source": [ - "for G in [G_brighkite_friends, G_gowalla_friends, G_foursquareIT_friends, G_foursquareEU_friends]:\n", + "for G in [G_brighkite_friends, G_gowalla_friends, G_foursquare_friends]:\n", " print(G.name)\n", " print('Number of nodes: ', G.number_of_nodes())\n", " print('Number of edges: ', G.number_of_edges())\n", @@ -440,16 +885,156 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "analysis_results = pd.DataFrame(columns=['Graph', 'Number of Nodes', 'Number of Edges', 'Average Degree', 'Average Clustering Coefficient', 'log N', 'Average Shortest Path Length', 'betweenness centrality'], index=None)\n", - "\n", - "checkins_graphs = [G_brighkite_checkins, G_gowalla_checkins, G_foursquareEU_checkins, G_foursquareIT_checkins]\n", - "friendships_graph = [G_brighkite_friends, G_gowalla_friends, G_foursquareIT_friends, G_foursquareEU_friends]\n", + "checkins_graphs = [G_brighkite_checkins, G_gowalla_checkins, G_foursquare_checkins]\n", + "friendships_graph = [G_brighkite_friends, G_gowalla_friends, G_foursquare_friends]\n", "\n", - "graphs_all = checkins_graphs + friendships_graph\n", + "graphs_all = checkins_graphs + friendships_graph" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GraphNumber of NodesNumber of EdgesAverage DegreeAverage Clustering Coefficientlog NAverage Shortest Path Lengthbetweenness centrality
0Brightkite Checkins Graph6493292973NaNNaN8.778480NaNNaN
1Gowalla Checkins Graph307362790NaNNaN8.030410NaNNaN
2Foursquare Checkins Graph2324246702NaNNaN7.751045NaNNaN
3Brightkite Friendship Graph542014690NaNNaN8.597851NaNNaN
4(Filtered) Gowalla Friendship Graph22945548NaNNaN7.738052NaNNaN
5Foursquare Friendship Graph13975323NaNNaN7.242082NaNNaN
\n", + "
" + ], + "text/plain": [ + " Graph Number of Nodes Number of Edges \\\n", + "0 Brightkite Checkins Graph 6493 292973 \n", + "1 Gowalla Checkins Graph 3073 62790 \n", + "2 Foursquare Checkins Graph 2324 246702 \n", + "3 Brightkite Friendship Graph 5420 14690 \n", + "4 (Filtered) Gowalla Friendship Graph 2294 5548 \n", + "5 Foursquare Friendship Graph 1397 5323 \n", + "\n", + " Average Degree Average Clustering Coefficient log N \\\n", + "0 NaN NaN 8.778480 \n", + "1 NaN NaN 8.030410 \n", + "2 NaN NaN 7.751045 \n", + "3 NaN NaN 8.597851 \n", + "4 NaN NaN 7.738052 \n", + "5 NaN NaN 7.242082 \n", + "\n", + " Average Shortest Path Length betweenness centrality \n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN \n", + "5 NaN NaN " + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analysis_results = pd.DataFrame(columns=['Graph', 'Number of Nodes', 'Number of Edges', 'Average Degree', 'Average Clustering Coefficient', 'log N', 'Average Shortest Path Length', 'betweenness centrality'], index=None)\n", "\n", "for graph in graphs_all:\n", " analysis_results = analysis_results.append(\n", @@ -478,9 +1063,142 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GraphNumber of NodesNumber of EdgesAverage DegreeAverage Clustering Coefficientlog NAverage Shortest Path Lengthbetweenness centrality
0Brightkite Checkins Graph649329297390.242723NaN8.778480NaNNaN
1Gowalla Checkins Graph30736279040.865604NaN8.030410NaNNaN
2Foursquare Checkins Graph2324246702212.30809NaN7.751045NaNNaN
3Brightkite Friendship Graph5420146905.420664NaN8.597851NaNNaN
4(Filtered) Gowalla Friendship Graph229455484.836966NaN7.738052NaNNaN
5Foursquare Friendship Graph139753237.620616NaN7.242082NaNNaN
\n", + "
" + ], + "text/plain": [ + " Graph Number of Nodes Number of Edges \\\n", + "0 Brightkite Checkins Graph 6493 292973 \n", + "1 Gowalla Checkins Graph 3073 62790 \n", + "2 Foursquare Checkins Graph 2324 246702 \n", + "3 Brightkite Friendship Graph 5420 14690 \n", + "4 (Filtered) Gowalla Friendship Graph 2294 5548 \n", + "5 Foursquare Friendship Graph 1397 5323 \n", + "\n", + " Average Degree Average Clustering Coefficient log N \\\n", + "0 90.242723 NaN 8.778480 \n", + "1 40.865604 NaN 8.030410 \n", + "2 212.30809 NaN 7.751045 \n", + "3 5.420664 NaN 8.597851 \n", + "4 4.836966 NaN 7.738052 \n", + "5 7.620616 NaN 7.242082 \n", + "\n", + " Average Shortest Path Length betweenness centrality \n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN \n", + "5 NaN NaN " + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "for G in graphs_all:\n", " avg_deg = np.mean([d for n, d in G.degree()])\n", @@ -541,35 +1259,184 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Computing average clustering coefficient for the Brightkite Checkins Graph...\n", + "\tAverage clustering coefficient: 0.7139988006862793\n", + "\tCPU time: 14.8 seconds\n", + "\n", + "Computing average clustering coefficient for the Gowalla Checkins Graph...\n", + "\tAverage clustering coefficient: 0.5483724940778376\n", + "\tCPU time: 1.7 seconds\n", + "\n", + "Computing average clustering coefficient for the Foursquare Checkins Graph...\n", + "\tAverage clustering coefficient: 0.6527297407924693\n", + "\tCPU time: 19.5 seconds\n", + "\n", + "Computing average clustering coefficient for the Brightkite Friendship Graph...\n", + "\tAverage clustering coefficient: 0.21857061612676437\n", + "\tCPU time: 0.1 seconds\n", + "\n", + "Computing average clustering coefficient for the (Filtered) Gowalla Friendship Graph...\n", + "\tAverage clustering coefficient: 0.23429345031911422\n", + "\tCPU time: 0.0 seconds\n", + "\n", + "Computing average clustering coefficient for the Foursquare Friendship Graph...\n", + "\tAverage clustering coefficient: 0.18348521948916247\n", + "\tCPU time: 0.0 seconds\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GraphNumber of NodesNumber of EdgesAverage DegreeAverage Clustering Coefficientlog NAverage Shortest Path Lengthbetweenness centrality
0Brightkite Checkins Graph649329297390.2427230.7139998.778480NaNNaN
1Gowalla Checkins Graph30736279040.8656040.5483728.030410NaNNaN
2Foursquare Checkins Graph2324246702212.308090.652737.751045NaNNaN
3Brightkite Friendship Graph5420146905.4206640.2185718.597851NaNNaN
4(Filtered) Gowalla Friendship Graph229455484.8369660.2342937.738052NaNNaN
5Foursquare Friendship Graph139753237.6206160.1834857.242082NaNNaN
\n", + "
" + ], + "text/plain": [ + " Graph Number of Nodes Number of Edges \\\n", + "0 Brightkite Checkins Graph 6493 292973 \n", + "1 Gowalla Checkins Graph 3073 62790 \n", + "2 Foursquare Checkins Graph 2324 246702 \n", + "3 Brightkite Friendship Graph 5420 14690 \n", + "4 (Filtered) Gowalla Friendship Graph 2294 5548 \n", + "5 Foursquare Friendship Graph 1397 5323 \n", + "\n", + " Average Degree Average Clustering Coefficient log N \\\n", + "0 90.242723 0.713999 8.778480 \n", + "1 40.865604 0.548372 8.030410 \n", + "2 212.30809 0.65273 7.751045 \n", + "3 5.420664 0.218571 8.597851 \n", + "4 4.836966 0.234293 7.738052 \n", + "5 7.620616 0.183485 7.242082 \n", + "\n", + " Average Shortest Path Length betweenness centrality \n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN \n", + "5 NaN NaN " + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# With k = 0.6 for checkins graphs and k = 0.2 for friendship graphs it takes about 8 minutes to compute the average clustering coefficient of alla the graphs on a i7-8750H CPU. Since we are taking random samplings, this of course depends on the random seed.\n", - "\n", - "for graph in checkins_graphs:\n", - " print(\"\\nComputing average clustering coefficient for the {}...\".format(graph.name))\n", - " start = time.time()\n", - " avg_clustering = average_clustering_coefficient(graph, 0.3)\n", - " end = time.time()\n", - "\n", - " print(\"\\tAverage clustering coefficient: {}\".format(avg_clustering))\n", - " print(\"\\tCPU time: \" + str(round(end-start,1)) + \" seconds\")\n", - " analysis_results.loc[analysis_results['Graph'] == graph.name, 'Average Clustering Coefficient'] = avg_clustering\n", - "\n", - "for graph in friendships_graph:\n", + "for graph in graphs_all:\n", " print(\"\\nComputing average clustering coefficient for the {}...\".format(graph.name))\n", " start = time.time()\n", - " avg_clustering = average_clustering_coefficient(graph, 0.1)\n", + " avg_clustering = nx.average_clustering(graph)\n", " end = time.time()\n", "\n", " print(\"\\tAverage clustering coefficient: {}\".format(avg_clustering))\n", " print(\"\\tCPU time: \" + str(round(end-start,1)) + \" seconds\")\n", " analysis_results.loc[analysis_results['Graph'] == graph.name, 'Average Clustering Coefficient'] = avg_clustering\n", "\n", - "analysis_results\n", - "# save the results as pandas dataframe object\n", - "analysis_results.to_pickle('analysis_results.pkl')" + "analysis_results" ] }, { @@ -660,30 +1527,184 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Computing average shortest path length for graph: Brightkite Checkins Graph\n", + "\tNumber of connected components with more then 10 nodes: 1 \n", + "\tAverage shortest path length: 3.01ngth of connected component with 6349 nodes and 292842 edges \n", + "\tCPU time: 119.2 seconds\n", + "\n", + "Computing average shortest path length for graph: Gowalla Checkins Graph\n", + "\tNumber of connected components with more then 10 nodes: 1 \n", + "\tAverage shortest path length: 3.51ngth of connected component with 3010 nodes and 62754 edges \n", + "\tCPU time: 17.7 seconds\n", + "\n", + "Computing average shortest path length for graph: Foursquare Checkins Graph\n", + "\tNumber of connected components with more then 10 nodes: 1 \n", + "\tAverage shortest path length: 2.19ngth of connected component with 2303 nodes and 246690 edges \n", + "\tCPU time: 29.8 seconds\n", + "\n", + "Computing average shortest path length for graph: Brightkite Friendship Graph\n", + "\tNumber of connected components with more then 10 nodes: 1 \n", + "\tAverage shortest path length: 5.23ngth of connected component with 5040 nodes and 14456 edges \n", + "\tCPU time: 25.1 seconds\n", + "\n", + "Computing average shortest path length for graph: (Filtered) Gowalla Friendship Graph\n", + "\tNumber of connected components with more then 10 nodes: 1 \n", + "\tAverage shortest path length: 5.4ength of connected component with 1991 nodes and 5287 edges \n", + "\tCPU time: 3.5 seconds\n", + "\n", + "Computing average shortest path length for graph: Foursquare Friendship Graph\n", + "\tNumber of connected components with more then 10 nodes: 2 \n", + "\tAverage shortest path length: 6.46ngth of connected component with 12 nodes and 13 edges ges \n", + "\tCPU time: 1.3 seconds\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GraphNumber of NodesNumber of EdgesAverage DegreeAverage Clustering Coefficientlog NAverage Shortest Path Lengthbetweenness centrality
0Brightkite Checkins Graph649329297390.2427230.7139998.7784803.013369NaN
1Gowalla Checkins Graph30736279040.8656040.5483728.0304103.508031NaN
2Foursquare Checkins Graph2324246702212.308090.652737.7510452.186112NaN
3Brightkite Friendship Graph5420146905.4206640.2185718.5978515.231807NaN
4(Filtered) Gowalla Friendship Graph229455484.8369660.2342937.7380525.396488NaN
5Foursquare Friendship Graph139753237.6206160.1834857.2420826.45841NaN
\n", + "
" + ], + "text/plain": [ + " Graph Number of Nodes Number of Edges \\\n", + "0 Brightkite Checkins Graph 6493 292973 \n", + "1 Gowalla Checkins Graph 3073 62790 \n", + "2 Foursquare Checkins Graph 2324 246702 \n", + "3 Brightkite Friendship Graph 5420 14690 \n", + "4 (Filtered) Gowalla Friendship Graph 2294 5548 \n", + "5 Foursquare Friendship Graph 1397 5323 \n", + "\n", + " Average Degree Average Clustering Coefficient log N \\\n", + "0 90.242723 0.713999 8.778480 \n", + "1 40.865604 0.548372 8.030410 \n", + "2 212.30809 0.65273 7.751045 \n", + "3 5.420664 0.218571 8.597851 \n", + "4 4.836966 0.234293 7.738052 \n", + "5 7.620616 0.183485 7.242082 \n", + "\n", + " Average Shortest Path Length betweenness centrality \n", + "0 3.013369 NaN \n", + "1 3.508031 NaN \n", + "2 2.186112 NaN \n", + "3 5.231807 NaN \n", + "4 5.396488 NaN \n", + "5 6.45841 NaN " + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# With k = 0.6 for checkins graphs and k = 0.2 for friendship graphs it takes about 18 minutes end for all the graphs on a i7-8750H CPU. Since we are taking random samplings, this of course depends on the random seed\n", - "\n", - "for graph in checkins_graphs:\n", - " print(\"\\nComputing average shortest path length for graph: \", graph.name)\n", - "\n", - " start = time.time()\n", - " average_shortest_path_length = average_shortest_path(graph, 0.3)\n", - " end = time.time()\n", - "\n", - " print(\"\\tAverage shortest path length: {}\".format(round(average_shortest_path_length,2)))\n", - " print(\"\\tCPU time: \" + str(round(end-start,1)) + \" seconds\")\n", - "\n", - " \n", - " analysis_results.loc[analysis_results['Graph'] == graph.name, 'Average Shortest Path Length'] = average_shortest_path_length\n", - "\n", - "for graph in friendships_graph:\n", + "for graph in graphs_all:\n", " print(\"\\nComputing average shortest path length for graph: \", graph.name)\n", "\n", " start = time.time()\n", - " average_shortest_path_length = average_shortest_path(graph, 0.1)\n", + " average_shortest_path_length = average_shortest_path(graph)\n", " end = time.time()\n", "\n", " print(\"\\tAverage shortest path length: {}\".format(round(average_shortest_path_length,2)))\n", @@ -692,9 +1713,7 @@ " \n", " analysis_results.loc[analysis_results['Graph'] == graph.name, 'Average Shortest Path Length'] = average_shortest_path_length\n", "\n", - "analysis_results\n", - "# save the results as pandas dataframe object\n", - "analysis_results.to_pickle('analysis_results.pkl')" + "analysis_results" ] }, { @@ -744,49 +1763,206 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Computing the approximate betweenness centrality for the Brightkite Checkins Graph...\n", + "\tNumber of nodes after removing 50.0% of nodes: 3247\n", + "\tNumber of edges after removing 50.0% of nodes: 73359\n", + "\tBetweenness centrality: 0.0005341953776334369 \n", + "\tCPU time: 34.5 seconds\n", + "\n", + "Computing the approximate betweenness centrality for the Gowalla Checkins Graph...\n", + "\tNumber of nodes after removing 50.0% of nodes: 1537\n", + "\tNumber of edges after removing 50.0% of nodes: 15424\n", + "\tBetweenness centrality: 0.001276770664894951 \n", + "\tCPU time: 5.5 seconds\n", + "\n", + "Computing the approximate betweenness centrality for the Foursquare Checkins Graph...\n", + "\tNumber of nodes after removing 50.0% of nodes: 1162\n", + "\tNumber of edges after removing 50.0% of nodes: 66899\n", + "\tBetweenness centrality: 0.0009378382408594679 \n", + "\tCPU time: 11.5 seconds\n", + "\n", + "Computing the approximate betweenness centrality for the Brightkite Friendship Graph...\n", + "\tNumber of nodes after removing 50.0% of nodes: 2710\n", + "\tNumber of edges after removing 50.0% of nodes: 3777\n", + "\tBetweenness centrality: 0.0006636813228671013 \n", + "\tCPU time: 4.5 seconds\n", + "\n", + "Computing the approximate betweenness centrality for the (Filtered) Gowalla Friendship Graph...\n", + "\tNumber of nodes after removing 50.0% of nodes: 1147\n", + "\tNumber of edges after removing 50.0% of nodes: 1529\n", + "\tBetweenness centrality: 0.0013313378500865271 \n", + "\tCPU time: 0.9 seconds\n", + "\n", + "Computing the approximate betweenness centrality for the Foursquare Friendship Graph...\n", + "\tNumber of nodes after removing 50.0% of nodes: 699\n", + "\tNumber of edges after removing 50.0% of nodes: 1400\n", + "\tBetweenness centrality: 0.0015311069213178477 \n", + "\tCPU time: 0.6 seconds\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GraphNumber of NodesNumber of EdgesAverage DegreeAverage Clustering Coefficientlog NAverage Shortest Path Lengthbetweenness centrality
0Brightkite Checkins Graph649329297390.2427230.7139998.7784803.0133690.000534
1Gowalla Checkins Graph30736279040.8656040.5483728.0304103.5080310.001277
2Foursquare Checkins Graph2324246702212.308090.652737.7510452.1861120.000938
3Brightkite Friendship Graph5420146905.4206640.2185718.5978515.2318070.000664
4(Filtered) Gowalla Friendship Graph229455484.8369660.2342937.7380525.3964880.001331
5Foursquare Friendship Graph139753237.6206160.1834857.2420826.458410.001531
\n", + "
" + ], + "text/plain": [ + " Graph Number of Nodes Number of Edges \\\n", + "0 Brightkite Checkins Graph 6493 292973 \n", + "1 Gowalla Checkins Graph 3073 62790 \n", + "2 Foursquare Checkins Graph 2324 246702 \n", + "3 Brightkite Friendship Graph 5420 14690 \n", + "4 (Filtered) Gowalla Friendship Graph 2294 5548 \n", + "5 Foursquare Friendship Graph 1397 5323 \n", + "\n", + " Average Degree Average Clustering Coefficient log N \\\n", + "0 90.242723 0.713999 8.778480 \n", + "1 40.865604 0.548372 8.030410 \n", + "2 212.30809 0.65273 7.751045 \n", + "3 5.420664 0.218571 8.597851 \n", + "4 4.836966 0.234293 7.738052 \n", + "5 7.620616 0.183485 7.242082 \n", + "\n", + " Average Shortest Path Length betweenness centrality \n", + "0 3.013369 0.000534 \n", + "1 3.508031 0.001277 \n", + "2 2.186112 0.000938 \n", + "3 5.231807 0.000664 \n", + "4 5.396488 0.001331 \n", + "5 6.45841 0.001531 " + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# it takes about 6 minutes to compute the betweenness centrality for all the graphs with 6 processes with k = 0.7. Change the value of k to speed up the computation (at the cost of accuracy). \n", - "\n", - "for graph in checkins_graphs:\n", + "for graph in graphs_all:\n", " print(\"\\nComputing the approximate betweenness centrality for the {}...\".format(graph.name))\n", " start = time.time()\n", - " betweenness_centrality = np.mean(list(betweenness_centrality_parallel(graph, 6, k = 0.3).values()))\n", + " betweenness_centrality = np.mean(list(betweenness_centrality_parallel(graph, 4, k = 0.5).values()))\n", " end = time.time()\n", " print(\"\\tBetweenness centrality: {} \".format(betweenness_centrality))\n", " print(\"\\tCPU time: \" + str(round(end-start,1)) + \" seconds\")\n", "\n", " analysis_results.loc[analysis_results['Graph'] == graph.name, 'betweenness centrality'] = betweenness_centrality\n", "\n", - "for graph in friendships_graph:\n", - " print(\"\\nComputing the approximate betweenness centrality for the {}...\".format(graph.name))\n", - " start = time.time()\n", - " betweenness_centrality = np.mean(list(betweenness_centrality_parallel(graph, 6, k = 0.1).values()))\n", - " end = time.time()\n", - " print(\"\\tBetweenness centrality: {} \".format(betweenness_centrality))\n", - " print(\"\\tCPU time: \" + str(round(end-start,1)) + \" seconds\")\n", - "\n", - " analysis_results.loc[analysis_results['Graph'] == graph.name, 'betweenness centrality'] = betweenness_centrality\n", - " \n", - "analysis_results\n", - "# save the results as pandas dataframe object\n", - "analysis_results.to_pickle('analysis_results.pkl')" + "analysis_results.to_pickle('analysis_results.pkl')\n", + "analysis_results" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "acc_res = \"some urls\"\n", - "\n", - "# download the results with wget\n", - "\n", - "# open the dataframe object\n", - "analysis_results = pd.read_pickle('analysis_results_acc.pkl')" + "analysis_results = pd.read_pickle('analysis_results.pkl')" ] }, { @@ -836,9 +2012,5401 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 6, + 234, + 29, + 237, + 97, + 255, + 262, + 72, + 309, + 1, + 37, + 17, + 539, + 99, + 10, + 92, + 52, + 815, + 649, + 2, + 140, + 490, + 231, + 101, + 68, + 94, + 267, + 66, + 239, + 354, + 41, + 226, + 657, + 232, + 5, + 540, + 35, + 14, + 483, + 16, + 506, + 26, + 7, + 840, + 450, + 47, + 578, + 58, + 359, + 268, + 95, + 275, + 565, + 59, + 67, + 8, + 150, + 39, + 655, + 177, + 108, + 28, + 128, + 181, + 156, + 148, + 236, + 250, + 383, + 257, + 297, + 260, + 50, + 193, + 201, + 40, + 13, + 80, + 18, + 345, + 43, + 104, + 584, + 102, + 12, + 31, + 138, + 867, + 48, + 55, + 243, + 317, + 85, + 79, + 259, + 76, + 130, + 246, + 238, + 282, + 286, + 266, + 526, + 715, + 3, + 45, + 241, + 89, + 264, + 112, + 42, + 168, + 184, + 20, + 251, + 34, + 466, + 117, + 208, + 82, + 122, + 252, + 303, + 22, + 535, + 179, + 180, + 153, + 69, + 114, + 25, + 746, + 224, + 205, + 149, + 53, + 475, + 195, + 84, + 11, + 24, + 135, + 194, + 103, + 71, + 487, + 1021, + 167, + 220, + 4, + 129, + 107, + 508, + 36, + 788, + 21, + 9, + 162, + 30, + 254, + 273, + 216, + 227, + 113, + 467, + 543, + 51, + 32, + 755, + 93, + 81, + 621, + 320, + 27, + 548, + 49, + 222, + 908, + 219, + 456, + 209, + 54, + 60, + 15, + 170, + 326, + 44, + 160, + 96, + 272, + 707, + 261, + 496, + 477, + 106, + 174, + 61, + 19, + 57, + 90, + 115, + 38, + 73, + 23, + 189, + 462, + 221, + 214, + 469, + 215, + 62, + 109, + 294, + 310, + 468, + 91, + 296, + 290, + 46, + 166, + 199, + 64, + 98, + 88, + 906, + 786, + 87, + 176, + 517, + 182, + 536, + 77, + 498, + 242, + 663, + 528, + 853, + 33, + 280, + 318, + 151, + 116, + 1043, + 110, + 671, + 803, + 480, + 678, + 142, + 738, + 65, + 493, + 321, + 716, + 161, + 126, + 211, + 218, + 292, + 187, + 384, + 674, + 169, + 198, + 197, + 131, + 253, + 591, + 100, + 229, + 311, + 541, + 499, + 173, + 230, + 1004, + 245, + 497, + 63, + 388, + 305, + 228, + 278, + 500, + 491, + 127, + 723, + 365, + 74, + 136, + 247, + 240, + 476, + 516, + 159, + 223, + 277, + 213, + 56, + 553, + 790, + 86, + 323, + 225, + 178, + 433, + 378, + 593, + 212, + 465, + 478, + 601, + 206, + 728, + 346, + 463, + 550, + 461, + 171, + 146, + 158, + 83, + 400, + 521, + 651, + 319, + 335, + 349, + 200, + 484, + 334, + 333, + 549, + 165, + 75, + 256, + 387, + 118, + 376, + 698, + 314, + 472, + 546, + 291, + 190, + 430, + 269, + 350, + 492, + 734, + 298, + 572, + 185, + 157, + 357, + 330, + 235, + 353, + 186, + 137, + 233, + 471, + 258, + 105, + 504, + 154, + 360, + 70, + 544, + 473, + 217, + 510, + 817, + 192, + 495, + 139, + 464, + 204, + 434, + 145, + 327, + 444, + 155, + 210, + 666, + 645, + 397, + 502, + 556, + 152, + 639, + 133, + 124, + 603, + 313, + 271, + 460, + 249, + 527, + 248, + 445, + 665, + 777, + 518, + 656, + 615, + 367, + 596, + 279, + 511, + 316, + 325, + 183, + 175, + 163, + 605, + 144, + 675, + 481, + 567, + 344, + 301, + 524, + 111, + 704, + 302, + 689, + 505, + 332, + 147, + 512, + 509, + 585, + 486, + 660, + 479, + 538, + 580, + 501, + 552, + 520, + 577, + 525, + 751, + 534, + 134, + 607, + 545, + 561, + 485, + 503, + 470, + 547, + 514, + 778, + 630, + 770, + 188, + 125, + 494, + 482, + 610, + 123, + 574, + 489, + 141, + 120, + 616, + 531, + 837, + 754, + 488, + 731, + 783, + 699, + 513, + 474, + 306, + 265, + 274, + 191, + 372, + 389, + 368, + 270, + 132, + 415, + 393, + 288, + 244, + 121 + ], + "y": [ + 166, + 9, + 20, + 4, + 12, + 7, + 4, + 6, + 1, + 619, + 32, + 59, + 2, + 13, + 120, + 13, + 37, + 1, + 1, + 333, + 3, + 2, + 8, + 5, + 17, + 11, + 3, + 18, + 9, + 1, + 19, + 13, + 1, + 6, + 178, + 4, + 31, + 88, + 4, + 62, + 4, + 53, + 146, + 1, + 1, + 44, + 1, + 14, + 1, + 3, + 10, + 2, + 1, + 31, + 36, + 116, + 38, + 27, + 2, + 1, + 5, + 40, + 2, + 4, + 9, + 7, + 14, + 1, + 1, + 1, + 3, + 2, + 41, + 1, + 1, + 32, + 100, + 9, + 88, + 2, + 10, + 5, + 2, + 8, + 90, + 32, + 4, + 1, + 21, + 44, + 3, + 1, + 5, + 40, + 2, + 8, + 5, + 3, + 5, + 2, + 2, + 3, + 3, + 1, + 231, + 12, + 6, + 62, + 2, + 5, + 17, + 1, + 1, + 83, + 2, + 46, + 9, + 7, + 2, + 13, + 4, + 2, + 4, + 48, + 3, + 3, + 3, + 8, + 15, + 6, + 45, + 2, + 15, + 1, + 5, + 63, + 3, + 3, + 9, + 104, + 39, + 2, + 1, + 11, + 10, + 3, + 1, + 3, + 15, + 220, + 5, + 6, + 1, + 44, + 1, + 49, + 122, + 2, + 36, + 2, + 1, + 5, + 17, + 4, + 6, + 1, + 11, + 34, + 2, + 8, + 9, + 1, + 1, + 37, + 4, + 23, + 29, + 1, + 20, + 1, + 2, + 25, + 16, + 61, + 3, + 1, + 33, + 4, + 9, + 3, + 1, + 4, + 2, + 4, + 4, + 2, + 20, + 64, + 12, + 26, + 2, + 38, + 7, + 47, + 3, + 6, + 65, + 9, + 7, + 9, + 10, + 6, + 1, + 1, + 6, + 18, + 2, + 1, + 50, + 5, + 2, + 17, + 9, + 17, + 1, + 1, + 36, + 3, + 3, + 2, + 1, + 11, + 2, + 6, + 2, + 2, + 1, + 18, + 1, + 2, + 12, + 4, + 1, + 5, + 2, + 1, + 2, + 1, + 2, + 1, + 8, + 3, + 1, + 1, + 4, + 2, + 63, + 80, + 2, + 3, + 1, + 1, + 3, + 1, + 3, + 1, + 2, + 1, + 4, + 10, + 1, + 2, + 2, + 1, + 4, + 1, + 4, + 7, + 12, + 1, + 1, + 12, + 2, + 1, + 3, + 3, + 1, + 1, + 8, + 3, + 3, + 5, + 4, + 2, + 3, + 12, + 2, + 12, + 35, + 1, + 1, + 24, + 1, + 12, + 5, + 1, + 1, + 1, + 15, + 6, + 5, + 1, + 1, + 1, + 3, + 11, + 1, + 14, + 2, + 7, + 5, + 6, + 2, + 2, + 5, + 2, + 1, + 1, + 2, + 4, + 3, + 1, + 1, + 5, + 10, + 4, + 1, + 4, + 1, + 1, + 1, + 3, + 1, + 2, + 3, + 2, + 2, + 1, + 2, + 1, + 1, + 1, + 1, + 2, + 1, + 1, + 5, + 1, + 1, + 1, + 6, + 4, + 2, + 6, + 2, + 5, + 1, + 5, + 2, + 6, + 2, + 1, + 1, + 2, + 1, + 3, + 11, + 2, + 1, + 4, + 1, + 1, + 5, + 1, + 1, + 1, + 1, + 2, + 2, + 6, + 1, + 3, + 4, + 1, + 1, + 1, + 144, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + 2, + 1, + 1, + 1, + 2, + 2, + 3, + 1, + 31, + 3, + 1, + 1, + 1, + 1, + 1, + 4, + 1, + 1, + 1, + 1, + 3, + 5, + 5, + 1, + 1, + 2, + 1, + 5, + 2, + 1, + 1, + 1, + 2, + 1, + 2, + 1, + 1, + 2, + 1, + 1, + 1, + 5, + 1, + 5, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + 1, + 3, + 1, + 1, + 1, + 1, + 4, + 1, + 1, + 2, + 1, + 1, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + 1 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution (log-log scale) of Brightkite Checkins Graph" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + }, + "type": "log" + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + }, + "type": "log" + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 26, + 208, + 59, + 81, + 21, + 146, + 37, + 50, + 4, + 5, + 3, + 77, + 117, + 35, + 28, + 78, + 109, + 76, + 9, + 60, + 186, + 291, + 444, + 8, + 118, + 42, + 54, + 39, + 90, + 134, + 61, + 55, + 63, + 41, + 31, + 16, + 92, + 66, + 91, + 127, + 84, + 303, + 124, + 12, + 103, + 36, + 69, + 53, + 83, + 30, + 49, + 40, + 33, + 67, + 119, + 137, + 231, + 29, + 17, + 6, + 43, + 122, + 94, + 14, + 281, + 93, + 115, + 98, + 145, + 19, + 47, + 7, + 62, + 38, + 20, + 24, + 13, + 120, + 89, + 34, + 48, + 184, + 2, + 409, + 73, + 58, + 157, + 222, + 101, + 25, + 57, + 105, + 74, + 112, + 18, + 171, + 32, + 153, + 159, + 88, + 51, + 149, + 52, + 46, + 106, + 82, + 70, + 202, + 1, + 71, + 22, + 75, + 218, + 44, + 100, + 27, + 107, + 158, + 179, + 110, + 181, + 131, + 264, + 333, + 97, + 199, + 300, + 252, + 474, + 79, + 545, + 15, + 45, + 271, + 212, + 23, + 10, + 56, + 87, + 64, + 68, + 244, + 237, + 11, + 152, + 129, + 148, + 160, + 204, + 245, + 80, + 111, + 196, + 128, + 419, + 170, + 501, + 379, + 164, + 200, + 280, + 256, + 368, + 325, + 235, + 243, + 95, + 448, + 180, + 114, + 143, + 390, + 309, + 85, + 302, + 491, + 133, + 326, + 147, + 177, + 255, + 205, + 217, + 126, + 210, + 113, + 201, + 345, + 266, + 108, + 136, + 99, + 194, + 162, + 139, + 316, + 292, + 173, + 65, + 225, + 240, + 72, + 242, + 161, + 166, + 175, + 192, + 144, + 156, + 183, + 198, + 123, + 168, + 211, + 323, + 265, + 301, + 174, + 287, + 176, + 132, + 172, + 203, + 154, + 277, + 283, + 282, + 214, + 353, + 197, + 190, + 221, + 125, + 261, + 130, + 167, + 234, + 439, + 188, + 238, + 219, + 315, + 272, + 236, + 337, + 278, + 193, + 253, + 305, + 151, + 165, + 140, + 273, + 288, + 215, + 96, + 207, + 86, + 187, + 104, + 182, + 150, + 213, + 121, + 268, + 227 + ], + "y": [ + 22, + 2, + 10, + 5, + 36, + 3, + 22, + 21, + 138, + 91, + 186, + 5, + 5, + 19, + 34, + 7, + 2, + 11, + 78, + 7, + 2, + 3, + 2, + 66, + 1, + 23, + 10, + 18, + 7, + 5, + 10, + 9, + 9, + 23, + 27, + 49, + 6, + 13, + 3, + 7, + 8, + 2, + 3, + 42, + 4, + 22, + 12, + 4, + 8, + 29, + 16, + 27, + 19, + 10, + 4, + 7, + 3, + 28, + 33, + 79, + 17, + 1, + 6, + 30, + 1, + 3, + 4, + 6, + 1, + 30, + 11, + 68, + 7, + 21, + 37, + 26, + 46, + 6, + 5, + 15, + 18, + 2, + 218, + 2, + 14, + 12, + 5, + 2, + 5, + 25, + 14, + 5, + 9, + 3, + 31, + 4, + 22, + 1, + 3, + 2, + 12, + 2, + 6, + 14, + 1, + 6, + 7, + 3, + 358, + 10, + 22, + 3, + 3, + 16, + 5, + 23, + 3, + 4, + 4, + 3, + 2, + 3, + 3, + 3, + 2, + 2, + 1, + 2, + 1, + 3, + 1, + 40, + 8, + 1, + 2, + 28, + 49, + 11, + 3, + 6, + 6, + 2, + 2, + 45, + 4, + 2, + 3, + 4, + 1, + 2, + 9, + 4, + 1, + 2, + 1, + 4, + 1, + 1, + 3, + 1, + 1, + 2, + 1, + 1, + 2, + 3, + 4, + 1, + 3, + 4, + 2, + 1, + 3, + 3, + 1, + 1, + 2, + 1, + 2, + 1, + 1, + 2, + 1, + 4, + 1, + 3, + 2, + 1, + 3, + 6, + 2, + 2, + 3, + 3, + 5, + 1, + 1, + 3, + 3, + 2, + 2, + 9, + 1, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 1, + 3, + 2, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 4, + 1, + 1, + 5, + 1, + 3, + 2, + 2, + 1, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 3, + 1, + 3, + 1, + 2, + 1, + 4, + 1, + 1 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution (log-log scale) of Gowalla Checkins Graph" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + }, + "type": "log" + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + }, + "type": "log" + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 33, + 498, + 158, + 143, + 321, + 376, + 203, + 349, + 286, + 329, + 479, + 710, + 76, + 422, + 289, + 600, + 271, + 793, + 469, + 110, + 333, + 1038, + 434, + 371, + 729, + 556, + 276, + 302, + 728, + 477, + 771, + 320, + 700, + 277, + 461, + 507, + 548, + 283, + 493, + 311, + 294, + 444, + 623, + 673, + 468, + 545, + 879, + 502, + 278, + 492, + 598, + 282, + 524, + 578, + 735, + 394, + 449, + 759, + 308, + 388, + 497, + 722, + 476, + 737, + 421, + 315, + 518, + 855, + 1061, + 313, + 335, + 392, + 620, + 454, + 280, + 828, + 406, + 432, + 381, + 383, + 856, + 544, + 327, + 696, + 512, + 564, + 312, + 346, + 674, + 792, + 796, + 521, + 474, + 443, + 466, + 370, + 712, + 859, + 368, + 340, + 970, + 395, + 606, + 316, + 854, + 345, + 689, + 336, + 781, + 279, + 553, + 360, + 378, + 486, + 653, + 331, + 420, + 314, + 902, + 829, + 299, + 632, + 403, + 355, + 292, + 484, + 570, + 281, + 920, + 409, + 325, + 412, + 431, + 428, + 347, + 440, + 773, + 318, + 941, + 705, + 823, + 485, + 552, + 363, + 362, + 652, + 319, + 875, + 451, + 483, + 359, + 944, + 310, + 585, + 684, + 339, + 334, + 495, + 642, + 893, + 305, + 562, + 467, + 780, + 622, + 789, + 560, + 456, + 288, + 455, + 487, + 337, + 442, + 536, + 969, + 373, + 344, + 768, + 482, + 567, + 624, + 803, + 917, + 475, + 905, + 857, + 1004, + 534, + 372, + 390, + 436, + 908, + 743, + 284, + 457, + 450, + 365, + 341, + 832, + 821, + 549, + 509, + 307, + 1, + 898, + 13, + 6, + 74, + 44, + 825, + 160, + 234, + 489, + 625, + 22, + 60, + 40, + 86, + 88, + 87, + 15, + 3, + 49, + 12, + 211, + 539, + 129, + 244, + 532, + 317, + 107, + 580, + 223, + 348, + 242, + 34, + 119, + 441, + 55, + 42, + 257, + 128, + 437, + 256, + 471, + 132, + 207, + 121, + 84, + 850, + 62, + 293, + 609, + 576, + 295, + 361, + 571, + 701, + 516, + 222, + 7, + 100, + 488, + 915, + 351, + 228, + 894, + 382, + 332, + 739, + 59, + 61, + 117, + 185, + 112, + 718, + 125, + 81, + 188, + 255, + 108, + 174, + 526, + 189, + 235, + 910, + 249, + 517, + 241, + 209, + 681, + 219, + 164, + 72, + 167, + 138, + 176, + 246, + 155, + 480, + 73, + 531, + 473, + 470, + 868, + 396, + 306, + 247, + 672, + 530, + 205, + 196, + 152, + 142, + 141, + 175, + 644, + 101, + 503, + 229, + 140, + 811, + 206, + 105, + 104, + 106, + 102, + 187, + 697, + 27, + 71, + 154, + 550, + 691, + 814, + 192, + 91, + 546, + 41, + 157, + 591, + 21, + 231, + 146, + 172, + 830, + 387, + 841, + 411, + 555, + 145, + 551, + 758, + 791, + 197, + 405, + 183, + 410, + 178, + 151, + 890, + 221, + 193, + 232, + 191, + 268, + 245, + 520, + 889, + 43, + 28, + 201, + 379, + 777, + 285, + 45, + 262, + 10, + 204, + 19, + 755, + 23, + 2, + 137, + 500, + 510, + 9, + 522, + 275, + 572, + 8, + 179, + 4, + 790, + 540, + 590, + 243, + 711, + 265, + 264, + 24, + 356, + 58, + 224, + 70, + 490, + 304, + 236, + 272, + 618, + 523, + 838, + 658, + 296, + 404, + 592, + 880, + 621, + 583, + 513, + 662, + 809, + 690, + 588, + 506, + 352, + 640, + 324, + 757, + 251, + 238, + 706, + 651, + 237, + 797, + 646, + 51, + 358, + 426, + 226, + 323, + 648, + 364, + 163, + 90, + 225, + 17, + 326, + 166, + 584, + 96, + 433, + 139, + 367, + 80, + 230, + 5, + 529, + 111, + 679, + 66, + 423, + 64, + 239, + 472, + 89, + 369, + 415, + 462, + 547, + 525, + 79, + 375, + 582, + 414, + 543, + 274, + 478, + 425, + 126, + 602, + 258, + 671, + 180, + 511, + 148, + 505, + 416, + 393, + 669, + 350, + 215, + 504, + 213, + 36, + 398, + 165, + 427, + 131, + 26, + 494, + 465, + 508, + 665, + 377, + 50, + 254, + 32, + 83, + 16, + 94, + 135, + 54, + 212, + 537, + 724, + 198, + 39, + 557, + 48, + 184, + 496, + 692, + 113, + 635, + 565, + 68, + 639, + 63, + 273, + 47, + 56, + 452, + 69, + 218, + 136, + 46, + 723, + 200, + 354, + 569, + 541, + 297, + 14, + 438, + 248, + 447, + 194, + 181, + 663, + 173, + 617, + 408, + 171, + 208, + 252, + 435, + 153, + 267, + 661, + 134, + 501, + 400, + 633, + 563, + 353, + 118, + 605, + 380, + 424, + 568, + 448, + 499, + 328, + 481, + 417, + 491, + 391, + 459, + 343, + 342, + 397, + 594, + 389, + 558, + 384, + 147, + 168, + 182, + 270, + 322, + 120, + 53, + 233, + 97, + 144, + 210, + 300, + 161, + 85, + 123, + 77, + 150, + 130, + 214, + 199, + 149, + 95, + 162, + 57, + 216, + 115, + 92, + 29, + 114, + 202, + 38, + 122, + 301, + 169, + 303, + 67, + 98, + 99, + 177, + 103, + 30, + 18, + 338, + 31, + 78, + 253, + 266, + 269, + 260, + 330, + 259, + 250, + 93, + 116, + 82, + 25, + 11, + 170, + 156, + 65, + 195, + 35, + 20, + 37, + 75, + 109, + 52 + ], + "y": [ + 7, + 2, + 4, + 14, + 7, + 3, + 6, + 3, + 6, + 5, + 2, + 2, + 4, + 4, + 4, + 1, + 1, + 1, + 3, + 1, + 2, + 1, + 1, + 2, + 1, + 2, + 33, + 4, + 1, + 3, + 1, + 4, + 1, + 6, + 3, + 3, + 1, + 5, + 2, + 3, + 2, + 3, + 1, + 1, + 1, + 3, + 1, + 3, + 5, + 4, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 1, + 4, + 3, + 1, + 1, + 2, + 1, + 2, + 3, + 1, + 1, + 1, + 5, + 2, + 4, + 4, + 2, + 3, + 1, + 1, + 4, + 5, + 3, + 2, + 3, + 4, + 1, + 1, + 4, + 2, + 4, + 2, + 1, + 1, + 5, + 2, + 3, + 4, + 5, + 1, + 1, + 1, + 2, + 1, + 4, + 1, + 2, + 1, + 3, + 1, + 2, + 2, + 4, + 1, + 2, + 4, + 2, + 2, + 4, + 1, + 2, + 1, + 1, + 4, + 1, + 1, + 1, + 3, + 4, + 1, + 9, + 1, + 4, + 5, + 2, + 3, + 1, + 5, + 4, + 1, + 2, + 1, + 1, + 1, + 2, + 2, + 4, + 3, + 2, + 1, + 1, + 3, + 2, + 2, + 1, + 1, + 1, + 1, + 3, + 2, + 3, + 1, + 1, + 2, + 2, + 4, + 1, + 1, + 2, + 1, + 3, + 2, + 2, + 1, + 1, + 3, + 3, + 1, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 1, + 3, + 1, + 1, + 1, + 5, + 1, + 1, + 3, + 1, + 2, + 3, + 2, + 4, + 2, + 2, + 1, + 1, + 1, + 3, + 4, + 116, + 1, + 13, + 28, + 10, + 12, + 1, + 3, + 3, + 3, + 1, + 12, + 3, + 7, + 8, + 5, + 4, + 12, + 47, + 6, + 13, + 3, + 2, + 4, + 1, + 1, + 3, + 3, + 1, + 6, + 2, + 2, + 23, + 5, + 2, + 6, + 10, + 2, + 4, + 3, + 2, + 2, + 3, + 2, + 3, + 5, + 1, + 13, + 2, + 2, + 2, + 4, + 3, + 2, + 1, + 4, + 1, + 17, + 3, + 2, + 1, + 3, + 3, + 1, + 1, + 1, + 1, + 7, + 7, + 3, + 2, + 2, + 1, + 2, + 9, + 3, + 1, + 4, + 2, + 4, + 4, + 2, + 1, + 1, + 1, + 3, + 3, + 2, + 3, + 5, + 11, + 1, + 1, + 1, + 5, + 3, + 2, + 5, + 2, + 2, + 2, + 1, + 3, + 3, + 2, + 1, + 2, + 5, + 8, + 8, + 6, + 13, + 3, + 3, + 5, + 2, + 1, + 2, + 1, + 3, + 4, + 3, + 6, + 4, + 5, + 1, + 8, + 9, + 4, + 2, + 1, + 1, + 5, + 5, + 2, + 8, + 2, + 1, + 5, + 2, + 5, + 1, + 1, + 2, + 1, + 2, + 3, + 3, + 1, + 2, + 1, + 5, + 1, + 1, + 2, + 4, + 4, + 1, + 4, + 1, + 3, + 4, + 3, + 3, + 2, + 1, + 15, + 7, + 2, + 1, + 1, + 2, + 5, + 2, + 20, + 3, + 17, + 1, + 7, + 60, + 2, + 3, + 2, + 20, + 1, + 3, + 2, + 13, + 3, + 24, + 1, + 1, + 1, + 2, + 1, + 4, + 3, + 9, + 1, + 6, + 3, + 7, + 3, + 3, + 8, + 4, + 1, + 2, + 1, + 2, + 4, + 2, + 1, + 1, + 1, + 1, + 3, + 1, + 1, + 2, + 1, + 1, + 2, + 1, + 5, + 1, + 1, + 2, + 2, + 1, + 2, + 1, + 1, + 2, + 1, + 1, + 3, + 1, + 1, + 3, + 1, + 2, + 3, + 11, + 1, + 13, + 1, + 6, + 4, + 3, + 3, + 12, + 3, + 20, + 2, + 7, + 2, + 3, + 4, + 8, + 2, + 2, + 6, + 3, + 2, + 2, + 2, + 1, + 3, + 3, + 1, + 1, + 1, + 2, + 1, + 2, + 4, + 2, + 1, + 1, + 3, + 2, + 1, + 1, + 1, + 2, + 1, + 1, + 2, + 2, + 1, + 4, + 1, + 19, + 1, + 1, + 4, + 1, + 2, + 1, + 1, + 1, + 1, + 1, + 12, + 5, + 12, + 1, + 8, + 7, + 2, + 1, + 1, + 4, + 4, + 1, + 8, + 3, + 1, + 1, + 3, + 1, + 1, + 5, + 1, + 5, + 3, + 8, + 6, + 2, + 7, + 1, + 3, + 19, + 1, + 2, + 1, + 1, + 1, + 2, + 14, + 1, + 1, + 3, + 2, + 1, + 1, + 3, + 1, + 1, + 1, + 4, + 2, + 1, + 1, + 1, + 1, + 4, + 3, + 1, + 1, + 2, + 3, + 2, + 1, + 1, + 1, + 1, + 1, + 4, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 3, + 2, + 3, + 2, + 1, + 3, + 37, + 2, + 2, + 3, + 1, + 2, + 1, + 5, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 5, + 1, + 7, + 3, + 2, + 3, + 17, + 5, + 2, + 8, + 2, + 1, + 4, + 1, + 7, + 2, + 4, + 2, + 3, + 8, + 6, + 1, + 4, + 2, + 1, + 1, + 2, + 1, + 1, + 1, + 1, + 5, + 2, + 5, + 8, + 9, + 2, + 1, + 2, + 1, + 4, + 12, + 6, + 2, + 1, + 2 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution (log-log scale) of Foursquare Checkins Graph" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + }, + "type": "log" + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + }, + "type": "log" + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "for G in checkins_graphs:\n", " degree_distribution(G)" @@ -846,9 +7414,2971 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 36, + 17, + 7, + 12, + 42, + 23, + 15, + 6, + 1, + 18, + 9, + 21, + 22, + 5, + 8, + 226, + 3, + 46, + 10, + 11, + 2, + 27, + 14, + 28, + 31, + 58, + 30, + 19, + 41, + 35, + 20, + 75, + 43, + 40, + 74, + 4, + 33, + 26, + 16, + 39, + 13, + 50, + 59, + 25, + 24, + 67, + 82, + 103, + 202, + 55, + 49, + 34, + 29, + 45, + 87, + 56, + 93, + 32, + 44, + 65, + 63, + 89, + 60, + 70, + 47, + 78, + 127, + 48, + 61, + 54, + 72, + 38, + 53, + 52, + 97, + 64, + 62, + 37, + 51 + ], + "y": [ + 4, + 35, + 164, + 64, + 5, + 12, + 37, + 193, + 1908, + 29, + 111, + 17, + 12, + 298, + 122, + 1, + 521, + 5, + 93, + 68, + 999, + 8, + 42, + 14, + 6, + 3, + 4, + 24, + 9, + 7, + 21, + 2, + 2, + 4, + 3, + 351, + 9, + 14, + 34, + 9, + 50, + 1, + 3, + 13, + 13, + 1, + 2, + 1, + 1, + 3, + 2, + 5, + 6, + 5, + 1, + 3, + 1, + 7, + 2, + 1, + 2, + 1, + 1, + 3, + 1, + 1, + 1, + 3, + 1, + 1, + 1, + 8, + 1, + 1, + 1, + 1, + 1, + 3, + 3 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution (log-log scale) of Brightkite Friendship Graph" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + }, + "type": "log" + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + }, + "type": "log" + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 28, + 40, + 10, + 5, + 64, + 34, + 46, + 16, + 1, + 24, + 23, + 17, + 12, + 7, + 4, + 19, + 32, + 9, + 3, + 2, + 15, + 6, + 45, + 38, + 26, + 11, + 35, + 25, + 14, + 8, + 36, + 49, + 39, + 27, + 72, + 43, + 44, + 13, + 58, + 21, + 18, + 20, + 22, + 48, + 54, + 51, + 29, + 33, + 30, + 31, + 42, + 104, + 55, + 37, + 47 + ], + "y": [ + 10, + 1, + 35, + 113, + 1, + 2, + 3, + 16, + 731, + 5, + 3, + 13, + 24, + 91, + 194, + 11, + 6, + 41, + 274, + 432, + 13, + 97, + 2, + 2, + 6, + 24, + 2, + 8, + 9, + 55, + 2, + 1, + 1, + 4, + 1, + 2, + 1, + 24, + 1, + 2, + 5, + 5, + 8, + 1, + 1, + 1, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution (log-log scale) of (Filtered) Gowalla Friendship Graph" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + }, + "type": "log" + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + }, + "type": "log" + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 10, + 13, + 9, + 30, + 14, + 25, + 45, + 18, + 56, + 3, + 8, + 12, + 37, + 66, + 1, + 23, + 36, + 40, + 4, + 5, + 6, + 7, + 33, + 42, + 15, + 19, + 27, + 31, + 49, + 11, + 63, + 22, + 24, + 28, + 46, + 2, + 32, + 149, + 58, + 17, + 54, + 16, + 48, + 21, + 20, + 29, + 59, + 26, + 38, + 51, + 44, + 47, + 43, + 52, + 39, + 53, + 34, + 41, + 73, + 57, + 35 + ], + "y": [ + 30, + 19, + 28, + 2, + 18, + 11, + 3, + 8, + 3, + 130, + 37, + 17, + 5, + 1, + 402, + 12, + 7, + 2, + 94, + 69, + 50, + 43, + 2, + 3, + 21, + 8, + 6, + 5, + 1, + 24, + 1, + 8, + 5, + 8, + 2, + 217, + 5, + 1, + 1, + 15, + 2, + 10, + 2, + 6, + 9, + 8, + 1, + 7, + 2, + 1, + 1, + 1, + 2, + 1, + 6, + 1, + 5, + 4, + 1, + 1, + 2 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution (log-log scale) of Foursquare Friendship Graph" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + }, + "type": "log" + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + }, + "type": "log" + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "for graph in friendships_graph:\n", " degree_distribution(graph)" @@ -867,9 +10397,2976 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Brightkite Checkins Graph Watts-Strogatz\n", + "Number of nodes: 2324\n", + "Number of edges: 246344\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 207, + 208, + 186, + 192, + 220, + 209, + 228, + 182, + 212, + 217, + 206, + 221, + 211, + 200, + 204, + 227, + 215, + 226, + 231, + 216, + 194, + 232, + 201, + 219, + 214, + 197, + 202, + 199, + 196, + 230, + 205, + 203, + 223, + 218, + 222, + 224, + 210, + 198, + 195, + 213, + 237, + 239, + 247, + 193, + 233, + 234, + 225, + 190, + 235, + 236, + 185, + 229, + 240, + 238, + 188, + 191, + 189, + 241, + 180, + 242, + 183, + 245 + ], + "y": [ + 98, + 84, + 2, + 10, + 64, + 81, + 29, + 3, + 89, + 79, + 78, + 66, + 85, + 52, + 77, + 34, + 86, + 35, + 18, + 78, + 22, + 13, + 58, + 69, + 76, + 30, + 57, + 48, + 25, + 21, + 77, + 63, + 55, + 70, + 46, + 42, + 94, + 44, + 16, + 94, + 2, + 3, + 1, + 13, + 16, + 11, + 36, + 8, + 10, + 10, + 6, + 10, + 3, + 5, + 2, + 7, + 5, + 3, + 1, + 1, + 2, + 1 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution of Brightkite Checkins Graph Watts-Strogatz" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + } + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gowalla Checkins Graph Watts-Strogatz\n", + "Number of nodes: 2324\n", + "Number of edges: 246344\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 208, + 222, + 211, + 207, + 199, + 201, + 229, + 231, + 197, + 219, + 204, + 206, + 209, + 203, + 234, + 216, + 210, + 215, + 223, + 213, + 240, + 217, + 221, + 205, + 227, + 202, + 212, + 224, + 214, + 196, + 228, + 218, + 200, + 189, + 225, + 188, + 194, + 220, + 226, + 232, + 198, + 193, + 235, + 230, + 237, + 183, + 195, + 187, + 192, + 191, + 236, + 185, + 233, + 182, + 238, + 242, + 186, + 184, + 190, + 239, + 243, + 244 + ], + "y": [ + 84, + 52, + 83, + 97, + 41, + 52, + 24, + 20, + 32, + 76, + 82, + 79, + 75, + 65, + 9, + 80, + 81, + 90, + 52, + 88, + 6, + 67, + 60, + 84, + 29, + 62, + 83, + 49, + 83, + 25, + 18, + 88, + 48, + 6, + 40, + 7, + 18, + 59, + 37, + 16, + 46, + 18, + 10, + 13, + 8, + 3, + 20, + 6, + 6, + 8, + 8, + 1, + 7, + 2, + 5, + 3, + 2, + 1, + 5, + 3, + 1, + 1 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution of Gowalla Checkins Graph Watts-Strogatz" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + } + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Foursquare Checkins Graph Watts-Strogatz\n", + "Number of nodes: 2324\n", + "Number of edges: 246344\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 223, + 208, + 207, + 212, + 219, + 202, + 220, + 209, + 227, + 218, + 213, + 211, + 221, + 200, + 214, + 222, + 199, + 210, + 184, + 195, + 204, + 229, + 239, + 203, + 198, + 193, + 234, + 216, + 224, + 197, + 206, + 191, + 217, + 230, + 188, + 205, + 201, + 248, + 225, + 192, + 228, + 181, + 196, + 183, + 215, + 233, + 194, + 231, + 243, + 226, + 189, + 235, + 232, + 190, + 240, + 241, + 237, + 187, + 245, + 238, + 236, + 250, + 182 + ], + "y": [ + 39, + 98, + 84, + 85, + 89, + 61, + 76, + 78, + 29, + 86, + 80, + 99, + 61, + 49, + 87, + 49, + 43, + 81, + 3, + 25, + 79, + 28, + 7, + 60, + 49, + 17, + 10, + 73, + 33, + 34, + 68, + 9, + 73, + 18, + 7, + 83, + 45, + 1, + 49, + 9, + 29, + 1, + 22, + 1, + 74, + 12, + 15, + 18, + 3, + 40, + 8, + 3, + 11, + 9, + 4, + 1, + 5, + 6, + 2, + 1, + 3, + 1, + 1 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution of Foursquare Checkins Graph Watts-Strogatz" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + } + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# for each network, create a erdos-renyi model of the original. If you want to test it with the watts-strogatz model, uncomment the code below and comment the first 2 lines of the for loop\n", "\n", @@ -891,9 +13388,2980 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Brightkite Friendship Graph Watts-Strogatz\n", + "Number of nodes: 2324\n", + "Number of edges: 246344\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 210, + 214, + 195, + 208, + 219, + 201, + 216, + 202, + 204, + 217, + 220, + 221, + 213, + 193, + 211, + 209, + 223, + 228, + 222, + 206, + 200, + 233, + 212, + 242, + 227, + 205, + 203, + 207, + 191, + 231, + 226, + 224, + 229, + 198, + 225, + 199, + 218, + 239, + 215, + 196, + 194, + 197, + 184, + 183, + 237, + 230, + 192, + 232, + 186, + 234, + 236, + 240, + 235, + 185, + 188, + 189, + 181, + 246, + 190, + 179, + 245, + 241 + ], + "y": [ + 92, + 88, + 25, + 85, + 76, + 77, + 97, + 54, + 71, + 76, + 55, + 61, + 83, + 13, + 99, + 86, + 52, + 21, + 53, + 96, + 44, + 14, + 91, + 1, + 28, + 88, + 71, + 69, + 10, + 23, + 35, + 50, + 22, + 31, + 45, + 38, + 70, + 1, + 71, + 18, + 19, + 25, + 2, + 1, + 7, + 15, + 13, + 11, + 3, + 12, + 4, + 2, + 8, + 1, + 4, + 8, + 1, + 1, + 4, + 1, + 1, + 1 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution of Brightkite Friendship Graph Watts-Strogatz" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + } + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(Filtered) Gowalla Friendship Graph Watts-Strogatz\n", + "Number of nodes: 2324\n", + "Number of edges: 246344\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 197, + 204, + 229, + 221, + 217, + 223, + 218, + 190, + 213, + 224, + 206, + 222, + 216, + 226, + 228, + 208, + 220, + 194, + 207, + 212, + 205, + 196, + 219, + 225, + 209, + 230, + 201, + 214, + 200, + 202, + 199, + 211, + 193, + 215, + 191, + 231, + 210, + 203, + 227, + 198, + 186, + 187, + 235, + 195, + 236, + 232, + 238, + 244, + 192, + 233, + 240, + 188, + 189, + 239, + 248, + 181, + 234, + 237, + 242, + 183, + 184, + 180, + 254 + ], + "y": [ + 31, + 60, + 20, + 53, + 77, + 42, + 82, + 8, + 103, + 37, + 82, + 66, + 74, + 34, + 30, + 79, + 42, + 21, + 73, + 90, + 92, + 29, + 65, + 41, + 100, + 23, + 47, + 93, + 45, + 66, + 42, + 84, + 14, + 88, + 15, + 27, + 98, + 59, + 40, + 31, + 2, + 5, + 6, + 28, + 5, + 12, + 4, + 1, + 9, + 9, + 3, + 5, + 4, + 4, + 2, + 1, + 11, + 3, + 1, + 3, + 1, + 1, + 1 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution of (Filtered) Gowalla Friendship Graph Watts-Strogatz" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + } + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Foursquare Friendship Graph Watts-Strogatz\n", + "Number of nodes: 2324\n", + "Number of edges: 246344\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "Degree Distribution", + "type": "bar", + "x": [ + 208, + 228, + 215, + 217, + 209, + 204, + 194, + 220, + 237, + 198, + 199, + 211, + 207, + 202, + 201, + 190, + 222, + 182, + 212, + 210, + 218, + 206, + 232, + 238, + 205, + 221, + 225, + 213, + 230, + 216, + 227, + 233, + 231, + 203, + 224, + 223, + 214, + 226, + 197, + 191, + 200, + 229, + 196, + 219, + 235, + 241, + 192, + 236, + 195, + 186, + 193, + 181, + 188, + 245, + 234, + 243, + 247, + 189, + 184, + 185, + 240, + 183, + 239, + 187 + ], + "y": [ + 80, + 24, + 84, + 67, + 98, + 69, + 19, + 68, + 9, + 38, + 38, + 95, + 90, + 50, + 65, + 10, + 59, + 2, + 103, + 92, + 81, + 107, + 19, + 4, + 67, + 48, + 46, + 86, + 16, + 68, + 38, + 13, + 20, + 69, + 45, + 40, + 93, + 23, + 24, + 8, + 45, + 23, + 21, + 67, + 11, + 2, + 7, + 6, + 19, + 6, + 15, + 2, + 4, + 1, + 3, + 1, + 1, + 8, + 1, + 1, + 1, + 1, + 2, + 1 + ] + } + ], + "layout": { + "height": 600, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Degree Distribution of Foursquare Friendship Graph Watts-Strogatz" + }, + "width": 800, + "xaxis": { + "title": { + "text": "Degree" + } + }, + "yaxis": { + "title": { + "text": "Number of Nodes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# for each network, create a erdos-renyi model of the original graph. If you want to test it with the watts-strogatz model, uncomment the code below and comment the first 2 lines of the for loop\n", "\n", @@ -994,6 +16462,60 @@ "a degree that is several times in magnitude greater than the next most connected hub. In both these networks, there are\n", "fewer configurations to increase the clustering of the network. Moreover, in a targeted assault of these networks, the topology is easily destroyed (Albert et al., 2000). Such vulnerability to attack signifies a network that may not be small-world." ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_omega(graph):\n", + " if not nx.is_connected(graph):\n", + " tmp = max(nx.connected_components(graph), key=len)\n", + " graph = graph.subgraph(tmp)\n", + " # omega = nx.omega(graph, niter=2, nrand=2)\n", + " C = analysis_results.loc[analysis_results['Graph'] == graph.name, 'Average Clustering Coefficient'].values[0]\n", + " print(\"Average clustering coefficient for the original graph: \", C)\n", + " L = analysis_results.loc[analysis_results['Graph'] == graph.name, 'Average Shortest Path Length'].values[0]\n", + " print(\"Average shortest path length for the original graph: \", L)\n", + "\n", + " Cr = 0\n", + " Lr = 0\n", + " for i in range(2):\n", + " print(\"\\nIteration: \", i)\n", + " G_rand = nx.random_reference(graph, niter=1, connectivity=True, seed=42)\n", + " print(\"\\tRandom graph created\")\n", + " Cr += nx.average_clustering(G_rand)\n", + " print(\"\\tAverage clustering coefficient computed: \", Cr)\n", + "\n", + " G_latt = nx.lattice_reference(graph, niter=1, seed=42)\n", + " print(\"\\tLattice graph created\")\n", + " Lr += average_shortest_path(G_latt)\n", + " print(\"\\tAverage shortest path computed: \", Lr)\n", + " \n", + " Cr = Cr/2\n", + " Lr = Lr/2\n", + " omega = C/Cr - L/Lr\n", + "\n", + " print(\"Omega coefficient for graph {}: {}\".format(graph.name, omega))\n", + " return (graph.name, omega)\n", + "\n", + "# Create a dataframe to store the results\n", + "omegas = pd.DataFrame(columns=['Graph', 'Omega Coefficient'])\n", + "\n", + "# Set the number of processes to 4\n", + "with multiprocessing.Pool(3) as p:\n", + " # Map the compute_omega function to the list of input graph objects\n", + " results = p.map(compute_omega, checkins_graphs)\n", + " print(results)\n", + "\n", + "# Store the results in the dataframe\n", + "for result in results:\n", + " omegas.loc[omegas['Graph'] == result[0], 'Omega Coefficient'] = result[1]\n", + "\n", + "omegas\n", + "omegas.to_pickle('omegas.pkl')" + ] } ], "metadata": { @@ -1012,7 +16534,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.10.9 (main, Dec 19 2022, 17:35:49) [GCC 12.2.0]" }, "orig_nbformat": 4, "vscode": { diff --git a/omega_sampled_server.py b/omega_sampled_server.py new file mode 100755 index 0000000..d95691a --- /dev/null +++ b/omega_sampled_server.py @@ -0,0 +1,62 @@ +#! /usr/bin/python3 + +import networkx as nx +from utils import * +import warnings +import time +import random +import argparse +warnings.filterwarnings("ignore") + +def random_sample(graph, k): + nodes = list(graph.nodes()) + n = int(k*len(nodes)) + nodes_sample = random.sample(nodes, n) + + G = graph.subgraph(nodes_sample) + + if not nx.is_connected(G): + print("Graph is not connected. Taking the largest connected component") + connected = max(nx.connected_components(G), key=len) + G_connected = graph.subgraph(connected) + + print(nx.is_connected(G_connected)) + + print("Number of nodes in the sampled graph: ", G.number_of_nodes()) + print("Number of edges in the sampled graph: ", G.number_of_edges()) + + return G_connected + +if __name__ == "__main__": + # use argparse to take as input the name of the graph, the options are "foursquare", "gowalla" and "brightkite" + parser = argparse.ArgumentParser() + parser.add_argument("graph", help="Name of the graph to be used. Options are 'foursquare', 'gowalla' and 'brightkite'") + parser.add_argument("k", help="Percentage of nodes to be sampled. Needs to be a float between 0 and 1") + parser.add_argument("niter", help="Number of rewiring per edge. Needs to be an integer. Default is 5") + parser.add_argument("nrand", help="Number of random graphs. Needs to be an integer. Default is 5") + parser.add_help = True + args = parser.parse_args() + + # if no input is given for niter and nrand, set them to default values + if args.niter == None: + print("No input for niter. Setting it to default value: 5") + args.niter = 5 + + if args.nrand == None: + print("No input for nrand. Setting it to default value: 5") + args.nrand = 5 + + # create the graph. G = create_graph_from_checkins('name') where name is the input argument of graph + G = create_graph_from_checkins(str(args.graph)) + G.name = str(args.graph) + " Checkins Graph" + + # sample the graph + G_sample = random_sample(G, float(args.k)) + + # compute omega + start = time.time() + print("\nComputing omega for graph: ", G.name) + omega = nx.omega(G_sample, niter = int(args.niter), nrand = int(args.nrand)) + end = time.time() + print("Omega coefficient for graph {}: {}".format(G.name, omega)) + print("Time taken: ", round(end-start,2)) diff --git a/project.pdf b/project.pdf deleted file mode 100644 index f0adb44..0000000 Binary files a/project.pdf and /dev/null differ diff --git a/testing.ipynb b/testing.ipynb index 40fb88b..f9b9c15 100644 --- a/testing.ipynb +++ b/testing.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -16,372 +16,106 @@ "import pandas as pd\n", "import networkx as nx\n", "import plotly.graph_objects as go\n", - "from utils import *\n", + "# from utils import *\n", "from collections import Counter\n", "from tqdm import tqdm\n", "import time\n", + "import geopandas as gpd\n", + "import gdown # for downloading files from google drive\n", "\n", "# ignore warnings\n", "import warnings\n", + "import sys\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
GraphNumber of NodesNumber of EdgesAverage DegreeAverage Clustering Coefficientlog NAverage Shortest Path Lengthbetweenness centrality
0Brightkite Checkins Graph719136638071018.9979140.7028548.8805862.4110110.00022
1Gowalla Checkins Graph1070230310456.6443660.5055979.2781865.2229030.000301
2Foursquare EU Checkins Graph202827430376732.7064390.5970979.9174892.28430.000089
3Foursquare IT Checkins Graph3730629749337.6670240.6835658.2241642.1854770.000428
4Brightkite Friendship Graph59283467311.6980430.2197498.6874425.0521620.000448
5(Filtered) Gowalla Friendship Graph8396291226.9371130.2175449.0355114.5585320.000357
6Foursquare IT Friendship Graph207362175.998070.1484897.63675219.5307520.000879
7Foursquare EU Friendship Graph16491594197.2062340.1679469.71057023.7138640.000272
\n", - "
" - ], - "text/plain": [ - " Graph Number of Nodes Number of Edges \\\n", - "0 Brightkite Checkins Graph 7191 3663807 \n", - "1 Gowalla Checkins Graph 10702 303104 \n", - "2 Foursquare EU Checkins Graph 20282 7430376 \n", - "3 Foursquare IT Checkins Graph 3730 629749 \n", - "4 Brightkite Friendship Graph 5928 34673 \n", - "5 (Filtered) Gowalla Friendship Graph 8396 29122 \n", - "6 Foursquare IT Friendship Graph 2073 6217 \n", - "7 Foursquare EU Friendship Graph 16491 59419 \n", - "\n", - " Average Degree Average Clustering Coefficient log N \\\n", - "0 1018.997914 0.702854 8.880586 \n", - "1 56.644366 0.505597 9.278186 \n", - "2 732.706439 0.597097 9.917489 \n", - "3 337.667024 0.683565 8.224164 \n", - "4 11.698043 0.219749 8.687442 \n", - "5 6.937113 0.217544 9.035511 \n", - "6 5.99807 0.148489 7.636752 \n", - "7 7.206234 0.167946 9.710570 \n", - "\n", - " Average Shortest Path Length betweenness centrality \n", - "0 2.411011 0.00022 \n", - "1 5.222903 0.000301 \n", - "2 2.2843 0.000089 \n", - "3 2.185477 0.000428 \n", - "4 5.052162 0.000448 \n", - "5 4.558532 0.000357 \n", - "6 19.530752 0.000879 \n", - "7 23.713864 0.000272 " - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# import the graphs from the saved files\n", - "G_brighkite_checkins = nx.read_gpickle(os.path.join('data', 'brightkite', 'brightkite_checkins_graph.gpickle'))\n", - "G_gowalla_checkins = nx.read_gpickle(os.path.join('data', 'gowalla', 'gowalla_checkins_graph.gpickle'))\n", - "G_foursquareEU_checkins = nx.read_gpickle(os.path.join('data', 'foursquare', 'foursquareEU_checkins_graph.gpickle'))\n", - "G_foursquareIT_checkins = nx.read_gpickle(os.path.join('data', 'foursquare', 'foursquareIT_checkins_graph.gpickle'))\n", - "\n", - "G_brighkite_friends = nx.read_gpickle(os.path.join('data', 'brightkite', 'brightkite_friendships_graph.gpickle'))\n", - "G_gowalla_friends = nx.read_gpickle(os.path.join('data', 'gowalla', 'gowalla_friendships_graph.gpickle'))\n", - "G_foursquareEU_friends = nx.read_gpickle(os.path.join('data', 'foursquare', 'foursquareEU_friendships_graph.gpickle'))\n", - "G_foursquareIT_friends = nx.read_gpickle(os.path.join('data', 'foursquare', 'foursquareIT_friendships_graph.gpickle'))\n", - "\n", - "# open the dataframe object\n", - "analysis_results = pd.read_pickle('analysis_results.pkl')\n", - "analysis_results" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first thing that we want to do is very simple, create a random reference for each graph" - ] - }, - { - "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "# analysis_results = pd.DataFrame(columns=['Graph', 'Number of Nodes', 'Number of Edges', 'Average Degree', 'Average Clustering Coefficient', 'log N', 'Average Shortest Path Length', 'betweenness centrality'], index=None)\n", - "\n", - "checkins_graphs = [G_brighkite_checkins, G_gowalla_checkins, G_foursquareEU_checkins, G_foursquareIT_checkins]\n", - "friendships_graph = [G_brighkite_friends, G_gowalla_friends, G_foursquareIT_friends, G_foursquareEU_friends]\n", - "\n", - "graphs_all = checkins_graphs + friendships_graph" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Random shit" + "def download_dataTMPsets():\n", + "\n", + " dict = {\n", + " \"brightkite\": [\"https://snap.stanford.edu/data/loc-brightkite_edges.txt.gz\", \"https://snap.stanford.edu/data/loc-brightkite_totalCheckins.txt.gz\"], \n", + " \"gowalla\": [\"https://snap.stanford.edu/data/loc-gowalla_edges.txt.gz\", \"https://snap.stanford.edu/data/loc-gowalla_totalCheckins.txt.gz\"], \n", + " \"foursquare\": \"https://drive.google.com/file/d/1PNk3zY8NjLcDiAbzjABzY5FiPAFHq6T8/view?usp=sharing\"}\n", + "\n", + " if not os.path.exists(\"dataTMP\"):\n", + " os.mkdir(\"dataTMP\")\n", + " print(\"Created dataTMP folder\")\n", + "\n", + " for folder in dict.keys():\n", + " if not os.path.exists(os.path.join(\"dataTMP\", folder)):\n", + " os.mkdir(os.path.join(\"dataTMP\", folder))\n", + " print(\"Created {} folder\".format(folder))\n", + "\n", + " for folder in dict.keys():\n", + " for url in dict[folder]:\n", + " if folder == \"foursquare\":\n", + " if not os.path.exists(os.path.join(\"dataTMP\", folder, \"foursquare_full.zip\")):\n", + " output = os.path.join(\"dataTMP\", folder, \"foursquare_full.zip\")\n", + " gdown.download(url, output, quiet=False, fuzzy=True)\n", + " else :\n", + " print(\"{} already downloaded\".format(url))\n", + " else:\n", + " if not os.path.exists(os.path.join(\"dataTMP\", folder, url.split(\"/\")[-1])):\n", + " print(\"Downloading {}...\".format(url))\n", + " wget.download(url, os.path.join(\"dataTMP\", folder))\n", + " else :\n", + " print(\"{} already downloaded\".format(url))\n", + "\n", + " for folder in dict.keys():\n", + " for file in os.listdir(os.path.join(\"dataTMP\", folder)):\n", + " if file.endswith(\".gz\"):\n", + " print(\"Unzipping {}...\".format(file))\n", + " os.system(\"gunzip {}\".format(os.path.join(\"dataTMP\", folder, file)))\n", + " elif file.endswith(\".zip\"):\n", + " print(\"Unzipping {}...\".format(file))\n", + " os.system(\"unzip {}\".format(os.path.join(\"dataTMP\", folder, file)))" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# analysis_results_erods = pd.DataFrame(columns=['Graph', 'Number of Nodes', 'Number of Edges', 'Average Degree', 'Average Clustering Coefficient', 'log N', 'Average Shortest Path Length', 'betweenness centrality'], index=None)\n", - "\n", - "# analysis_results_ws = pd.DataFrame(columns=['Graph', 'Number of Nodes', 'Number of Edges', 'Average Degree', 'Average Clustering Coefficient', 'log N', 'Average Shortest Path Length', 'betweenness centrality'], index=None)\n", - "\n", - "# for graph in graphs_all:\n", - "# print(\"\\nCreating random graph for graph: \", graph.name)\n", - "# G_erd = create_random_graphs(graph, model='erdos', save=False)\n", - "# G_ws = create_random_graphs(graph, model='watts_strogatz', save=False)\n", - " \n", - "# # add the basic information to the dataframe\n", - "# analysis_results_erods = analysis_results_erods.append({\n", - "# 'Graph': G_erd.name,\n", - "# 'Number of Nodes': G_erd.number_of_nodes(),\n", - "# 'Number of Edges': G_erd.number_of_edges(),\n", - "# 'log N': np.log(G_erd.number_of_nodes())\n", - "# }, ignore_index=True)\n", - "\n", - "# # add the basic information to the dataframe\n", - "# analysis_results_ws = analysis_results_ws.append({\n", - "# 'Graph': G_ws.name,\n", - "# 'Number of Nodes': G_ws.number_of_nodes(),\n", - "# 'Number of Edges': G_ws.number_of_edges(),\n", - "# 'log N': np.log(G_ws.number_of_nodes())\n", - "# }, ignore_index=True)\n", - "\n", - "# # compute the average degree and add it to the dataframes\n", - "# avg_deg_erd = np.mean([d for n, d in G_erd.degree()])\n", - "# avg_deg_ws = np.mean([d for n, d in G_ws.degree()])\n", - "# analysis_results_erods.loc[analysis_results_erods['Graph'] == G_erd.name, 'Average Degree'] = avg_deg_erd\n", - "# analysis_results_ws.loc[analysis_results_ws['Graph'] == G_ws.name, 'Average Degree'] = avg_deg_ws\n", - "\n", - "# # compute the average clustering coefficient and add it to the dataframes\n", - "# avg_clustering_erd = average_clustering_coefficient(G_erd, k = 0.9)\n", - "# avg_clustering_ws = average_clustering_coefficient(G_ws, k = 0.9)\n", - "# analysis_results_erods.loc[analysis_results_erods['Graph'] == G_erd.name, 'Average Clustering Coefficient'] = avg_clustering_erd\n", - "# analysis_results_ws.loc[analysis_results_ws['Graph'] == G_ws.name, 'Average Clustering Coefficient'] = avg_clustering_ws\n", - "\n", - "# # compute the average shortest path length and add it to the dataframes\n", - "# average_shortest_path_length_erd = average_shortest_path(G_erd, k = 0.9)\n", - "# average_shortest_path_length_ws = average_shortest_path(G_ws, k = 0.9)\n", - "# analysis_results_erods.loc[analysis_results_erods['Graph'] == G.name, 'Average Shortest Path Length'] = average_shortest_path_length_erd\n", - "# analysis_results_ws.loc[analysis_results_ws['Graph'] == G.name, 'Average Shortest Path Length'] = average_shortest_path_length_ws\n", - "\n", - "# # compute the betweenness centrality and add it to the dataframes\n", - "# betweenness_centrality_erd = np.mean(list(betweenness_centrality_parallel(G_erd, 4, k = 0.9).values()))\n", - "# betweenness_centrality_ws = np.mean(list(betweenness_centrality_parallel(G_ws, 4, k = 0.9).values()))\n", - "# analysis_results_erods.loc[analysis_results_erods['Graph'] == G.name, 'betweenness centrality'] = betweenness_centrality_erd\n", - "# analysis_results_ws.loc[analysis_results_ws['Graph'] == G.name, 'betweenness centrality'] = betweenness_centrality_ws\n", - "\n", - "# # save memory\n", - "# del G_erd, G_ws\n", - "\n", - "# analysis_results_erods.to_pickle('analysis_results_erods.pkl')\n", - "# analysis_results_ws.to_pickle('analysis_results_ws.pkl')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Small Worldness\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We have already computed the average clusting coefficient and the average shortesh path len for our networks. We can save a lot of time by skipping this computations" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def omega(G, C_og, L_og, niter, nrand):\n", - " randMetrics = {\"C\": [], \"L\": []}\n", - "\n", - " # Calculate initial average clustering coefficient which potentially will\n", - " # get replaced by higher clustering coefficients from generated lattice\n", - " # reference graphs\n", - " Cl = C_og\n", - "\n", - " niter_lattice_reference = niter\n", - " niter_random_reference = niter * 2\n", - "\n", - " for _ in range(nrand):\n", - " \n", - " # Generate random graph\n", - " Gr = nx.random_reference(G, niter=niter_random_reference, seed=42)\n", - " randMetrics[\"L\"].append(nx.average_shortest_path_length(Gr))\n", - "\n", - " # Generate lattice graph\n", - " Gl = nx.lattice_reference(G, niter=niter_lattice_reference, seed=42)\n", - "\n", - " # Replace old clustering coefficient, if clustering is higher in\n", - " # generated lattice reference\n", - " Cl_temp = nx.average_clustering(Gl)\n", - " if Cl_temp > Cl:\n", - " Cl = Cl_temp\n", - "\n", - " C = C_og\n", - " L = L_og\n", - " Lr = np.mean(randMetrics[\"L\"])\n", - "\n", - " omega = (Lr / L) - (C / Cl)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Brightkite Checkins Graph\n" + "Created dataTMP folder\n", + "Created brightkite folder\n", + "Created gowalla folder\n", + "Created foursquare folder\n", + "Downloading https://snap.stanford.edu/data/loc-brightkite_edges.txt.gz...\n", + "Downloading https://snap.stanford.edu/data/loc-brightkite_totalCheckins.txt.gz...\n", + "Downloading https://snap.stanford.edu/data/loc-gowalla_edges.txt.gz...\n", + "Downloading https://snap.stanford.edu/data/loc-gowalla_totalCheckins.txt.gz...\n" + ] + }, + { + "ename": "MissingSchema", + "evalue": "Invalid URL 'h': No scheme supplied. Perhaps you meant http://h?", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mMissingSchema\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m download_dataTMPsets()\n", + "Cell \u001b[0;32mIn[8], line 22\u001b[0m, in \u001b[0;36mdownload_dataTMPsets\u001b[0;34m()\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39mexists(os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39mjoin(\u001b[39m\"\u001b[39m\u001b[39mdataTMP\u001b[39m\u001b[39m\"\u001b[39m, folder, \u001b[39m\"\u001b[39m\u001b[39mfoursquare_full.zip\u001b[39m\u001b[39m\"\u001b[39m)):\n\u001b[1;32m 21\u001b[0m output \u001b[39m=\u001b[39m os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39mjoin(\u001b[39m\"\u001b[39m\u001b[39mdataTMP\u001b[39m\u001b[39m\"\u001b[39m, folder, \u001b[39m\"\u001b[39m\u001b[39mfoursquare_full.zip\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m---> 22\u001b[0m gdown\u001b[39m.\u001b[39;49mdownload(url, output, quiet\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m, fuzzy\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m)\n\u001b[1;32m 23\u001b[0m \u001b[39melse\u001b[39;00m :\n\u001b[1;32m 24\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39m{}\u001b[39;00m\u001b[39m already downloaded\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mformat(url))\n", + "File \u001b[0;32m/usr/lib/python3.10/site-packages/gdown/download.py:158\u001b[0m, in \u001b[0;36mdownload\u001b[0;34m(url, output, quiet, proxy, speed, use_cookies, verify, id, fuzzy, resume)\u001b[0m\n\u001b[1;32m 156\u001b[0m \u001b[39mwhile\u001b[39;00m \u001b[39mTrue\u001b[39;00m:\n\u001b[1;32m 157\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m--> 158\u001b[0m res \u001b[39m=\u001b[39m sess\u001b[39m.\u001b[39;49mget(url, headers\u001b[39m=\u001b[39;49mheaders, stream\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m, verify\u001b[39m=\u001b[39;49mverify)\n\u001b[1;32m 159\u001b[0m \u001b[39mexcept\u001b[39;00m requests\u001b[39m.\u001b[39mexceptions\u001b[39m.\u001b[39mProxyError \u001b[39mas\u001b[39;00m e:\n\u001b[1;32m 160\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mAn error has occurred using proxy:\u001b[39m\u001b[39m\"\u001b[39m, proxy, file\u001b[39m=\u001b[39msys\u001b[39m.\u001b[39mstderr)\n", + "File \u001b[0;32m/usr/lib/python3.10/site-packages/requests/sessions.py:600\u001b[0m, in \u001b[0;36mSession.get\u001b[0;34m(self, url, **kwargs)\u001b[0m\n\u001b[1;32m 592\u001b[0m \u001b[39m\u001b[39m\u001b[39mr\u001b[39m\u001b[39m\"\"\"Sends a GET request. Returns :class:`Response` object.\u001b[39;00m\n\u001b[1;32m 593\u001b[0m \n\u001b[1;32m 594\u001b[0m \u001b[39m:param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[1;32m 595\u001b[0m \u001b[39m:param \\*\\*kwargs: Optional arguments that ``request`` takes.\u001b[39;00m\n\u001b[1;32m 596\u001b[0m \u001b[39m:rtype: requests.Response\u001b[39;00m\n\u001b[1;32m 597\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 599\u001b[0m kwargs\u001b[39m.\u001b[39msetdefault(\u001b[39m\"\u001b[39m\u001b[39mallow_redirects\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mTrue\u001b[39;00m)\n\u001b[0;32m--> 600\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mrequest(\u001b[39m\"\u001b[39;49m\u001b[39mGET\u001b[39;49m\u001b[39m\"\u001b[39;49m, url, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m/usr/lib/python3.10/site-packages/requests/sessions.py:573\u001b[0m, in \u001b[0;36mSession.request\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m 560\u001b[0m \u001b[39m# Create the Request.\u001b[39;00m\n\u001b[1;32m 561\u001b[0m req \u001b[39m=\u001b[39m Request(\n\u001b[1;32m 562\u001b[0m method\u001b[39m=\u001b[39mmethod\u001b[39m.\u001b[39mupper(),\n\u001b[1;32m 563\u001b[0m url\u001b[39m=\u001b[39murl,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 571\u001b[0m hooks\u001b[39m=\u001b[39mhooks,\n\u001b[1;32m 572\u001b[0m )\n\u001b[0;32m--> 573\u001b[0m prep \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mprepare_request(req)\n\u001b[1;32m 575\u001b[0m proxies \u001b[39m=\u001b[39m proxies \u001b[39mor\u001b[39;00m {}\n\u001b[1;32m 577\u001b[0m settings \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmerge_environment_settings(\n\u001b[1;32m 578\u001b[0m prep\u001b[39m.\u001b[39murl, proxies, stream, verify, cert\n\u001b[1;32m 579\u001b[0m )\n", + "File \u001b[0;32m/usr/lib/python3.10/site-packages/requests/sessions.py:484\u001b[0m, in \u001b[0;36mSession.prepare_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 481\u001b[0m auth \u001b[39m=\u001b[39m get_netrc_auth(request\u001b[39m.\u001b[39murl)\n\u001b[1;32m 483\u001b[0m p \u001b[39m=\u001b[39m PreparedRequest()\n\u001b[0;32m--> 484\u001b[0m p\u001b[39m.\u001b[39;49mprepare(\n\u001b[1;32m 485\u001b[0m method\u001b[39m=\u001b[39;49mrequest\u001b[39m.\u001b[39;49mmethod\u001b[39m.\u001b[39;49mupper(),\n\u001b[1;32m 486\u001b[0m url\u001b[39m=\u001b[39;49mrequest\u001b[39m.\u001b[39;49murl,\n\u001b[1;32m 487\u001b[0m files\u001b[39m=\u001b[39;49mrequest\u001b[39m.\u001b[39;49mfiles,\n\u001b[1;32m 488\u001b[0m data\u001b[39m=\u001b[39;49mrequest\u001b[39m.\u001b[39;49mdata,\n\u001b[1;32m 489\u001b[0m json\u001b[39m=\u001b[39;49mrequest\u001b[39m.\u001b[39;49mjson,\n\u001b[1;32m 490\u001b[0m headers\u001b[39m=\u001b[39;49mmerge_setting(\n\u001b[1;32m 491\u001b[0m request\u001b[39m.\u001b[39;49mheaders, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mheaders, dict_class\u001b[39m=\u001b[39;49mCaseInsensitiveDict\n\u001b[1;32m 492\u001b[0m ),\n\u001b[1;32m 493\u001b[0m params\u001b[39m=\u001b[39;49mmerge_setting(request\u001b[39m.\u001b[39;49mparams, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mparams),\n\u001b[1;32m 494\u001b[0m auth\u001b[39m=\u001b[39;49mmerge_setting(auth, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mauth),\n\u001b[1;32m 495\u001b[0m cookies\u001b[39m=\u001b[39;49mmerged_cookies,\n\u001b[1;32m 496\u001b[0m hooks\u001b[39m=\u001b[39;49mmerge_hooks(request\u001b[39m.\u001b[39;49mhooks, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mhooks),\n\u001b[1;32m 497\u001b[0m )\n\u001b[1;32m 498\u001b[0m \u001b[39mreturn\u001b[39;00m p\n", + "File \u001b[0;32m/usr/lib/python3.10/site-packages/requests/models.py:368\u001b[0m, in \u001b[0;36mPreparedRequest.prepare\u001b[0;34m(self, method, url, headers, files, data, params, auth, cookies, hooks, json)\u001b[0m\n\u001b[1;32m 365\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"Prepares the entire request with the given parameters.\"\"\"\u001b[39;00m\n\u001b[1;32m 367\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mprepare_method(method)\n\u001b[0;32m--> 368\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mprepare_url(url, params)\n\u001b[1;32m 369\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mprepare_headers(headers)\n\u001b[1;32m 370\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mprepare_cookies(cookies)\n", + "File \u001b[0;32m/usr/lib/python3.10/site-packages/requests/models.py:439\u001b[0m, in \u001b[0;36mPreparedRequest.prepare_url\u001b[0;34m(self, url, params)\u001b[0m\n\u001b[1;32m 436\u001b[0m \u001b[39mraise\u001b[39;00m InvalidURL(\u001b[39m*\u001b[39me\u001b[39m.\u001b[39margs)\n\u001b[1;32m 438\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m scheme:\n\u001b[0;32m--> 439\u001b[0m \u001b[39mraise\u001b[39;00m MissingSchema(\n\u001b[1;32m 440\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mInvalid URL \u001b[39m\u001b[39m{\u001b[39;00murl\u001b[39m!r}\u001b[39;00m\u001b[39m: No scheme supplied. \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 441\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mPerhaps you meant http://\u001b[39m\u001b[39m{\u001b[39;00murl\u001b[39m}\u001b[39;00m\u001b[39m?\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 442\u001b[0m )\n\u001b[1;32m 444\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m host:\n\u001b[1;32m 445\u001b[0m \u001b[39mraise\u001b[39;00m InvalidURL(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mInvalid URL \u001b[39m\u001b[39m{\u001b[39;00murl\u001b[39m!r}\u001b[39;00m\u001b[39m: No host supplied\u001b[39m\u001b[39m\"\u001b[39m)\n", + "\u001b[0;31mMissingSchema\u001b[0m: Invalid URL 'h': No scheme supplied. Perhaps you meant http://h?" ] } ], "source": [ - "analysis_results = pd.read_pickle('analysis_results.pkl')\n", - "\n", - "omega_results = pd.DataFrame(columns=['Graph', 'omega'])\n", - "\n", - "for G in checkins_graphs:\n", - " print(G.name)\n", - " C_og = analysis_results.loc[analysis_results['Graph'] == G.name, 'Average Clustering Coefficient'].values[0]\n", - " L_og = analysis_results.loc[analysis_results['Graph'] == G.name, 'Average Shortest Path Length'].values[0]\n", - "\n", - " omega = omega(G, C_og, L_og, 2, 3)\n", - " \n", - " omega_results = omega_results.append({\n", - " 'Graph': G.name,\n", - " 'omega': omega\n", - " }, ignore_index=True)" + "download_dataTMPsets()" ] }, { @@ -390,17 +124,99 @@ "metadata": {}, "outputs": [], "source": [ - "for G in friendships_graphs:\n", - " print(G.name)\n", - " C_og = analysis_results.loc[analysis_results['Graph'] == G.name, 'Average Clustering Coefficient'].values[0]\n", - " L_og = analysis_results.loc[analysis_results['Graph'] == G.name, 'Average Shortest Path Length'].values[0]\n", "\n", - " omega = omega(G, C_og, L_og, 2, 3)\n", - " \n", - " omega_results = omega_results.append({\n", - " 'Graph': G.name,\n", - " 'omega': omega\n", - " }, ignore_index=True)" + "def download_dataTMPsets():\n", + "\n", + " urls = [\n", + " [\"https://snap.stanford.edu/dataTMP/loc-brightkite_edges.txt.gz\", \"https://snap.stanford.edu/dataTMP/loc-brightkite_totalCheckins.txt.gz\"],\n", + " [\"https://snap.stanford.edu/dataTMP/loc-gowalla_edges.txt.gz\", \"https://snap.stanford.edu/dataTMP/loc-gowalla_totalCheckins.txt.gz\"],\n", + " [\"https://drive.google.com/file/d/1PNk3zY8NjLcDiAbzjABzY5FiPAFHq6T8/view?usp=sharing\"]\n", + " ]\n", + "\n", + " folders = [\"brightkite\", \"gowalla\", \"foursquare\"]\n", + "\n", + " if not os.path.exists(\"dataTMP\"):\n", + " os.mkdir(\"dataTMP\")\n", + "\n", + " for folder in folders:\n", + " if not os.path.exists(os.path.join(\"dataTMP\", folder)):\n", + " os.mkdir(os.path.join(\"dataTMP\", folder))\n", + "\n", + " # Download every url in their respective folder. For the last one, we have to use gdown, because it's a google drive link. If the file is already downloaded, skip the download\n", + "\n", + " for i in range(len(urls)):\n", + " for url in urls[i]:\n", + " if not os.path.exists(os.path.join(\"dataTMP\", folders[i], url.split(\"/\")[-1])):\n", + " if i == 2:\n", + " output = os.path.join(\"dataTMP\", folders[i], \"something.zip\")\n", + " gdown.download(url, output, quiet=False, fuzzy=True)\n", + " else:\n", + " wget.download(url, os.path.join(\"dataTMP\", folders[i]))\n", + "\n", + "download_dataTMPsets()\n", + " # # unzip all the files in the 3 folders. Then remove the .gz or .zip files\n", + "\n", + " # for folder in folders:\n", + " # for file in os.listdir(os.path.join(\"dataTMP\", folder)):\n", + " # print(folder, file)\n", + " # if file.endswith(\".gz\"):\n", + " # os.system(\"gunzip {}\".format(os.path.join(\"dataTMP\", folder, file)))\n", + " # elif file.endswith(\".zip\"):\n", + " # os.system(\"unzip {}\".format(os.path.join(\"dataTMP\", folder, file)))\n", + " # os.remove(os.path.join(\"dataTMP\", folder, file))\n", + "\n", + " # # take all the .txt files from dataTMP/foursquare/dataTMPset_WWW2019 and move them to dataTMP/foursquare\n", + "\n", + " # for file in os.listdir(os.path.join(\"dataTMP\", \"foursquare\", \"dataTMPset_WWW2019\")):\n", + " # if file.endswith(\".txt\"):\n", + " # os.rename(os.path.join(\"dataTMP\", \"foursquare\", \"dataTMPset_WWW2019\", file), os.path.join(\"dataTMP\", \"foursquare\", file))\n", + "\n", + " # # remove the dataTMPset_WWW2019 folder, note that is not empty\n", + " # # os.rmdir(os.path.join(\"dataTMP\", \"foursquare\", \"dataTMPset_WWW2019\"))\n", + "\n", + " # for file in [\"dataTMPset_WWW_friendship_old.txt\", \"dataTMPset_WWW_readme.txt\", \"raw_Checkins_anonymized.txt\", \"raw_POIs.txt\"]:\n", + " # os.remove(os.path.join(\"dataTMP\", \"foursquare\", file))\n", + "\n", + " # # Now we want to clean our dataTMP and rename the files.\n", + "\n", + " # for file in os.listdir(os.path.join(\"dataTMP\", \"brightkite\")):\n", + " # if file.endswith(\"_edges.txt\"):\n", + " # os.rename(os.path.join(\"dataTMP\", \"brightkite\", file), os.path.join(\"dataTMP\", \"brightkite\", \"brightkite_friends_edges.txt\"))\n", + "\n", + " # for file in os.listdir(os.path.join(\"dataTMP\", \"gowalla\")):\n", + " # if file.endswith(\"_edges.txt\"):\n", + " # os.rename(os.path.join(\"dataTMP\", \"gowalla\", file), os.path.join(\"dataTMP\", \"gowalla\", \"gowalla_friends_edges.txt\"))\n", + "\n", + " # for file in os.listdir(os.path.join(\"dataTMP\", \"foursquare\")):\n", + " # if file.endswith(\"dataTMPset_WWW_friendship_new.txt\"):\n", + " # os.rename(os.path.join(\"dataTMP\", \"foursquare\", file), os.path.join(\"dataTMP\", \"foursquare\", \"foursquare_friends_edges.txt\"))\n", + "\n", + " # # Now we from the _totalCheckins.txt files we want to keep only the first and last column, which are the user ID and the venue ID. We also want to remove the header of the file.\n", + "\n", + " # for file in os.listdir(os.path.join(\"dataTMP\", \"brightkite\")):\n", + " # if file.endswith(\"_totalCheckins.txt\"):\n", + " # df = pd.read_csv(os.path.join(\"dataTMP\", \"brightkite\", file), sep=\"\\t\", header=None, names=[\"user_id\", \"check-in time\", \"latitude\", \"longitude\", \"venue_id\"])\n", + " # df[\"check-in time\"] = pd.to_datetime(df[\"check-in time\"])\n", + " # df = df[df[\"check-in time\"].dt.year == 2010]\n", + " # df = df.drop([\"check-in time\", \"latitude\", \"longitude\"], axis=1)\n", + " # df.to_csv(os.path.join(\"dataTMP\", \"brightkite\", \"brightkite_checkins.txt\"), sep=\"\\t\", header=False, index=False, errors=\"ignore\", encoding=\"utf-8\")\n", + " # os.remove(os.path.join(\"dataTMP\", \"brightkite\", file))\n", + "\n", + " # for file in os.listdir(os.path.join(\"dataTMP\", \"gowalla\")):\n", + " # if file.endswith(\"_totalCheckins.txt\"):\n", + " # df = pd.read_csv(os.path.join(\"dataTMP\", \"gowalla\", file), sep=\"\\t\", header=None, names=[\"user_id\", \"check-in time\", \"latitude\", \"longitude\", \"venue_id\"])\n", + " # df[\"check-in time\"] = pd.to_datetime(df[\"check-in time\"])\n", + " # df = df[df[\"check-in time\"].dt.year == 2010]\n", + " # df = df.drop([\"check-in time\", \"latitude\", \"longitude\"], axis=1)\n", + " # df.to_csv(os.path.join(\"dataTMP\", \"gowalla\", \"gowalla_checkins.txt\"), sep=\"\\t\", header=False, index=False, errors=\"ignore\", encoding=\"utf-8\")\n", + " # os.remove(os.path.join(\"dataTMP\", \"gowalla\", file))\n", + "\n", + " # for file in os.listdir(os.path.join(\"dataTMP\", \"foursquare\")):\n", + " # if file.endswith(\"dataTMPset_WWW_Checkins_anonymized.txt\"):\n", + " # df = pd.read_csv(os.path.join(\"dataTMP\", \"foursquare\", file), sep=\"\\t\", header=None)\n", + " # df = df[[0, 1]]\n", + " # df.to_csv(os.path.join(\"dataTMP\", \"foursquare\", \"foursquare_checkins.txt\"), sep=\"\\t\", header=False, index=False, errors=\"ignore\", encoding=\"utf-8\")\n", + " # os.remove(os.path.join(\"dataTMP\", \"foursquare\", file))\n" ] } ], diff --git a/utils.py b/utils.py old mode 100644 new mode 100755 index f988fdf..772cf9f --- a/utils.py +++ b/utils.py @@ -126,7 +126,7 @@ def create_graph_from_checkins(dataset: Literal['brightkite', 'gowalla', 'foursq Parameters ---------- - `dataset` : Literal['brightkite', 'gowalla', 'foursquareEU', 'foursquareIT'] + `dataset` : Literal['brightkite', 'gowalla', 'foursquare'] The dataset to use. `create_file` : bool, optional If True, the graph is saved in a file, by default True @@ -142,85 +142,38 @@ def create_graph_from_checkins(dataset: Literal['brightkite', 'gowalla', 'foursq """ - if dataset not in ['brightkite', 'gowalla', 'foursquareEU', 'foursquareIT']: - raise ValueError("Dataset not valid. Please choose between brightkite, gowalla, foursquareEU, foursquareUS, foursquareIT") + if dataset not in ['brightkite', 'gowalla', 'foursquare']: + raise ValueError("Dataset not valid. Please choose between brightkite, gowalla, foursquare") - if dataset in ['brightkite', 'gowalla']: - file = os.path.join("data", dataset, dataset + "_checkins.txt") - - print("\nCreating the graph for the dataset {}...".format(dataset)) - - df = pd.read_csv(file, sep="\t", header=None, names=["user_id", "venue_id"]) - - G = nx.Graph() - venues_users = df.groupby("venue_id")["user_id"].apply(set) - - for users in tqdm.tqdm(venues_users): - for user1, user2 in combinations(users, 2): - G.add_edge(user1, user2) - - # path to the file where we want to save the graph - edges_path = os.path.join("data", dataset , dataset + "_checkins_edges.tsv") - - print("Done! The graph has {} edges".format(G.number_of_edges()), " and {} nodes".format(G.number_of_nodes())) - - # delete from memory the dataframe - del df - - if create_file: - # save the graph in a file - nx.write_edgelist(G, edges_path, data=True, delimiter="\t", encoding="utf-8") - - return G - - else: - # path to the checkins file and the POIS file - path_checkins = os.path.join("data", "foursquare", "foursquare_checkins.txt") - path_POIS = os.path.join("data", "foursquare", "raw_POIs.txt") - - # dataframe with the checkins, we need only the user_id and the venue_id - df_all = pd.read_csv(path_checkins, sep="\t", header=None, names=['user_id', 'venue_id', 'time', 'offset']) - df_all = df_all[['user_id', 'venue_id']] - - # dataframe with the POIS, we need only the venue_id and the country code - df_POIS = pd.read_csv(path_POIS, sep='\t', header=None, names=['venue_id', 'lat', 'lon', 'category', 'country code']) - df_POIS = df_POIS[['venue_id', 'country code']] - - if dataset == "foursquareIT": - venues_array = df_POIS[df_POIS['country code'] == 'IT']['venue_id'].values - - elif dataset == "foursquareEU": - # list of the countries in the EU - EU_countries = ['AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK'] - - venues_array = df_POIS[df_POIS['country code'].isin(EU_countries)]['venue_id'].values + + file = os.path.join("data", dataset, dataset + "_checkins.txt") - print("\nCreating the graph for the dataset {}...".format(dataset)) + print("\nCreating the graph for the dataset {}...".format(dataset)) - # we create a dataframe with the checkins in the corresponding country - df_country = df_all[df_all['venue_id'].isin(venues_array)] + df = pd.read_csv(file, sep="\t", header=None, names=["user_id", "venue_id"], engine='pyarrow') - G = nx.Graph() - venues_users = df_country.groupby("venue_id")["user_id"].apply(set) + G = nx.Graph() + venues_users = df.groupby("venue_id")["user_id"].apply(set) - for users in tqdm.tqdm(venues_users): - for user1, user2 in combinations(users, 2): - G.add_edge(user1, user2) + for users in tqdm.tqdm(venues_users): + for user1, user2 in combinations(users, 2): + G.add_edge(user1, user2) - # path to the file where we want to save the graph - edges_path = os.path.join("data", "foursquare", dataset + "_checkins_edges.tsv") + # path to the file where we want to save the graph + edges_path = os.path.join("data", dataset , dataset + "_checkins_edges.tsv") - print("Done! The graph has {} edges".format(G.number_of_edges()), " and {} nodes".format(G.number_of_nodes())) + print("Done! The graph has {} edges".format(G.number_of_edges()), " and {} nodes".format(G.number_of_nodes())) - # delete from memory the dataframes - del df_all, df_POIS, df_country + # delete from memory the dataframe + del df - if create_file: - # save the graph in a file - nx.write_edgelist(G, edges_path, data=True, delimiter="\t", encoding="utf-8") + if create_file: + # save the graph in a file + nx.write_edgelist(G, edges_path, data=True, delimiter="\t", encoding="utf-8") - return G + return G + # ------------------------------------------------------------------------# def create_friendships_graph(dataset: Literal['brightkite', 'gowalla', 'foursquareEU', 'foursquareIT']) -> nx.Graph: @@ -244,56 +197,28 @@ def create_friendships_graph(dataset: Literal['brightkite', 'gowalla', 'foursqua Since we are taking sub-samples of each check-ins dataset, we are also taking sub-samples of the friendship graph. A user is included in the friendship graph if he has at least one check-in in the sub-sample. """ - if dataset not in ["brightkite", "gowalla", "foursquareEU", "foursquareIT"]: + if dataset not in ["brightkite", "gowalla", "foursquare"]: raise ValueError("The dataset must be brightkite, gowalla or foursquare") - if dataset in ["foursquareEU", "foursquareIT"]: - file = os.path.join("data", "foursquare", "foursquare_friends_edges.txt") - - # dataframe with the edges of the graph (friends) - df_friends_all = pd.read_csv(file, sep="\t", header=None, names=["node1", "node2"]) - - # set of the unique users in the graph (friends) - unique_friends = set(df_friends_all["node1"].unique()).union(set(df_friends_all["node2"].unique())) - - # dataframe with the edges of the graph (checkins) - df_checkins = pd.read_csv(os.path.join("data", "foursquare", dataset + "_checkins_edges.tsv"), sep="\t", header=None, names=["node1", "node2"]) - unique_checkins = set(df_checkins["node1"].unique()).union(set(df_checkins["node2"].unique())) + + file = os.path.join("data", dataset, dataset + "_friends_edges.txt") - # take the intersection of the two sets - unique_users = unique_friends.intersection(unique_checkins) + df_friends_all = pd.read_csv(file, sep="\t", header=None, names=["node1", "node2"], engine='pyarrow') + unique_friends = set(df_friends_all["node1"].unique()).union(set(df_friends_all["node2"].unique())) - # create a dataframe with the edges of the graph - df = df_friends_all[df_friends_all["node1"].isin(unique_users) & df_friends_all["node2"].isin(unique_users)] + df_checkins = pd.read_csv(os.path.join("data", dataset, dataset + "_checkins_edges.tsv"), sep="\t", header=None, names=["node1", "node2"]) + unique_checkins = set(df_checkins["node1"].unique()).union(set(df_checkins["node2"].unique())) - # create a tsv file with the edges of the graph that ends with _filtered.tsv - df.to_csv(os.path.join("data", "foursquare", dataset + "_friends_edges_filtered.tsv"), sep="\t", header=False, index=False) + unique_users = unique_friends.intersection(unique_checkins) - # create the graph - G = nx.from_pandas_edgelist(df, "node1", "node2", create_using=nx.Graph()) - del df_friends_all, df_checkins, df + df = df_friends_all[df_friends_all["node1"].isin(unique_users) & df_friends_all["node2"].isin(unique_users)] - return G + df.to_csv(os.path.join("data", dataset, dataset + "_friends_edges_filtered.tsv"), sep="\t", header=False, index=False) - elif dataset in ["brightkite", "gowalla"]: - file = os.path.join("data", dataset, dataset + "_friends_edges.txt") + G = nx.from_pandas_edgelist(df, "node1", "node2", create_using=nx.Graph()) + del df_friends_all, df_checkins, df - df_friends_all = pd.read_csv(file, sep="\t", header=None, names=["node1", "node2"]) - unique_friends = set(df_friends_all["node1"].unique()).union(set(df_friends_all["node2"].unique())) - - df_checkins = pd.read_csv(os.path.join("data", dataset, dataset + "_checkins_edges.tsv"), sep="\t", header=None, names=["node1", "node2"]) - unique_checkins = set(df_checkins["node1"].unique()).union(set(df_checkins["node2"].unique())) - - unique_users = unique_friends.intersection(unique_checkins) - - df = df_friends_all[df_friends_all["node1"].isin(unique_users) & df_friends_all["node2"].isin(unique_users)] - - df.to_csv(os.path.join("data", dataset, dataset + "_friends_edges_filtered.tsv"), sep="\t", header=False, index=False) - - G = nx.from_pandas_edgelist(df, "node1", "node2", create_using=nx.Graph()) - del df_friends_all, df_checkins, df - - return G + return G # ------------------------------------------------------------------------# @@ -484,7 +409,7 @@ def average_shortest_path(G: nx.Graph, k=None) -> float: if k is not None and (k < 0 or k > 1): raise ValueError("k must be between 0 and 1") elif k is None: - G = G.copy() + G_copy = G.copy() connected_components = list(nx.connected_components(G)) else: G_copy = G.copy()