{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Written by Doug Issichopoulos, [dougissi.com](https://dougissi.com)\n",
"\n",
"Feb 6, 2020"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Imports"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2021-12-01T14:53:08.040695Z",
"start_time": "2021-12-01T14:53:05.857789Z"
}
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import networkx as nx"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Example 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2021-12-01T14:53:08.099323Z",
"start_time": "2021-12-01T14:53:08.044613Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
" E | \n",
"
\n",
" \n",
" \n",
" \n",
" A | \n",
" 0.0 | \n",
" 1.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" B | \n",
" 1.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" C | \n",
" 1.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" D | \n",
" 0.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" E | \n",
" 0.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C D E\n",
"A 0.0 1.0 1.0 0.0 0.0\n",
"B 1.0 0.0 1.0 0.0 0.0\n",
"C 1.0 1.0 0.0 1.0 1.0\n",
"D 0.0 0.0 1.0 0.0 0.0\n",
"E 0.0 0.0 1.0 0.0 0.0"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = {\n",
" 'A': {'B':1, 'C':1},\n",
" 'B': {'A':1, 'C':1},\n",
" 'C': {'A':1, 'B':1, 'D':1, 'E':1},\n",
" 'D': {'C':1},\n",
" 'E': {'C':1},\n",
"}\n",
"df = pd.DataFrame(data).fillna(0)\n",
"df.sort_index(inplace=True)\n",
"df.sort_index(axis=1, inplace=True)\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2021-12-01T14:53:09.160365Z",
"start_time": "2021-12-01T14:53:08.105512Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"G = nx.Graph(df)\n",
"pos = nx.spring_layout(G)\n",
"nx.draw_networkx(G, pos=pos)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Count Triangles"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2021-12-01T14:53:09.174679Z",
"start_time": "2021-12-01T14:53:09.164623Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[0., 1., 1., 0., 0.],\n",
" [1., 0., 1., 0., 0.],\n",
" [1., 1., 0., 1., 1.],\n",
" [0., 0., 1., 0., 0.],\n",
" [0., 0., 1., 0., 0.]])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"S1 = df.values\n",
"S1"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2021-12-01T14:53:09.199519Z",
"start_time": "2021-12-01T14:53:09.183136Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[2., 1., 1., 1., 1.],\n",
" [1., 2., 1., 1., 1.],\n",
" [1., 1., 4., 0., 0.],\n",
" [1., 1., 0., 1., 1.],\n",
" [1., 1., 0., 1., 1.]])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"S2 = S1.dot(S1)\n",
"S2"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2021-12-01T14:53:09.224545Z",
"start_time": "2021-12-01T14:53:09.208737Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[2., 3., 5., 1., 1.],\n",
" [3., 2., 5., 1., 1.],\n",
" [5., 5., 2., 4., 4.],\n",
" [1., 1., 4., 0., 0.],\n",
" [1., 1., 4., 0., 0.]])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"S3 = S2.dot(S1)\n",
"S3"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2021-12-01T14:53:09.251610Z",
"start_time": "2021-12-01T14:53:09.234406Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"1.0"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"S3.trace() / 6"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Example 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2021-12-01T14:53:09.307102Z",
"start_time": "2021-12-01T14:53:09.266156Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
" E | \n",
"
\n",
" \n",
" \n",
" \n",
" A | \n",
" 0.0 | \n",
" 1.0 | \n",
" 1.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" B | \n",
" 1.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" C | \n",
" 1.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" D | \n",
" 1.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" E | \n",
" 0.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C D E\n",
"A 0.0 1.0 1.0 1.0 0.0\n",
"B 1.0 0.0 1.0 0.0 0.0\n",
"C 1.0 1.0 0.0 1.0 1.0\n",
"D 1.0 0.0 1.0 0.0 1.0\n",
"E 0.0 0.0 1.0 1.0 0.0"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = {\n",
" 'A': {'B':1, 'C':1, 'D': 1},\n",
" 'B': {'A':1, 'C':1},\n",
" 'C': {'A':1, 'B':1, 'D':1, 'E':1},\n",
" 'D': {'A': 1, 'C':1, 'E':1},\n",
" 'E': {'C':1, 'D': 1},\n",
"}\n",
"df = pd.DataFrame(data).fillna(0)\n",
"df.sort_index(inplace=True)\n",
"df.sort_index(axis=1, inplace=True)\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2021-12-01T14:53:09.768256Z",
"start_time": "2021-12-01T14:53:09.312495Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"