{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "class ImageProcessor:\n", " def __init__(self, flatmasks):\n", " self.flatmasks = flatmasks\n", " \n", " def update_adjacency_value(self, adjacency_matrix, original, neighbor):\n", " border = False\n", "\n", " if original != 0 and original != neighbor:\n", " border = True\n", " if neighbor != 0:\n", " adjacency_matrix[int(original - 1), int(neighbor - 1)] += 1\n", " return border\n", "\n", " def update_adjacency_matrix(self, plane_mask_flattened, width, height, adjacency_matrix, index):\n", " mod_value_width = index % width\n", " origin_mask = plane_mask_flattened[index]\n", " left, right, up, down = False, False, False, False\n", "\n", " if (mod_value_width != 0):\n", " left = self.update_adjacency_value(adjacency_matrix, origin_mask, plane_mask_flattened[index-1])\n", " if (mod_value_width != width - 1):\n", " right = self.update_adjacency_value(adjacency_matrix, origin_mask, plane_mask_flattened[index+1])\n", " if (index >= width):\n", " up = self.update_adjacency_value(adjacency_matrix, origin_mask, plane_mask_flattened[index-width])\n", " if (index <= len(plane_mask_flattened) - 1 - width):\n", " down = self.update_adjacency_value(adjacency_matrix, origin_mask, plane_mask_flattened[index+width])\n", " \n", " if (left or right or up or down):\n", " adjacency_matrix[int(origin_mask - 1), int(origin_mask-1)] += 1\n", "\n", " def compute_channel_means_sums_compensated(self, image):\n", " height, width, n_channels = image.shape\n", " mask_height, mask_width = self.flatmasks.shape\n", " n_masks = len(np.unique(self.flatmasks)) - 1\n", " channel_sums = np.zeros((n_masks, n_channels))\n", " channel_counts = np.zeros((n_masks, n_channels))\n", " if n_masks == 0:\n", " return channel_sums, channel_sums, channel_counts\n", "\n", " squashed_image = np.reshape(image, (height*width, n_channels))\n", " \n", " #masklocs = np.nonzero(self.flatmasks)\n", " #plane_mask = np.zeros((mask_height, mask_width), dtype = np.uint32)\n", " #plane_mask[masklocs[0], masklocs[1]] = masklocs[2] + 1\n", " #plane_mask = plane_mask.flatten()\n", " plane_mask = self.flatmasks.flatten()\n", " \n", " adjacency_matrix = np.zeros((n_masks, n_masks))\n", " for i in range(len(plane_mask)):\n", " self.update_adjacency_matrix(plane_mask, mask_width, mask_height, adjacency_matrix, i)\n", " \n", " mask_val = plane_mask[i] - 1\n", " if mask_val != -1:\n", " channel_sums[mask_val.astype(np.int32)] += squashed_image[i]\n", " channel_counts[mask_val.astype(np.int32)] += 1\n", " \n", " \n", " # Normalize adjacency matrix\n", " for i in range(n_masks):\n", " adjacency_matrix[i] = adjacency_matrix[i] / (max(adjacency_matrix[i, i], 1) * 2)\n", " adjacency_matrix[i, i] = 1\n", " \n", " means = np.true_divide(channel_sums, channel_counts, out=np.zeros_like(channel_sums, dtype='float'), where=channel_counts!=0)\n", " results = np.linalg.lstsq(adjacency_matrix, means, rcond=None)\n", " compensated_means = np.maximum(results[0], np.zeros((1,1))) \n", "\n", " return compensated_means, means, channel_counts[:,0]" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import torch" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "class ImageProcessor:\n", " def __init__(self, flatmasks):\n", " self.flatmasks = flatmasks\n", " \n", " def update_adjacency_value(self, adjacency_matrix, original, neighbor):\n", " border = False\n", "\n", " if original != 0 and original != neighbor:\n", " border = True\n", " if neighbor != 0:\n", " adjacency_matrix[int(original - 1), int(neighbor - 1)] += 1\n", " return border\n", "\n", " def update_adjacency_matrix(self, plane_mask_flattened, width, height, adjacency_matrix, index):\n", " mod_value_width = index % width\n", " origin_mask = plane_mask_flattened[index]\n", " left, right, up, down = False, False, False, False\n", "\n", " if (mod_value_width != 0):\n", " left = self.update_adjacency_value(adjacency_matrix, origin_mask, plane_mask_flattened[index-1])\n", " if (mod_value_width != width - 1):\n", " right = self.update_adjacency_value(adjacency_matrix, origin_mask, plane_mask_flattened[index+1])\n", " if (index >= width):\n", " up = self.update_adjacency_value(adjacency_matrix, origin_mask, plane_mask_flattened[index-width])\n", " if (index <= len(plane_mask_flattened) - 1 - width):\n", " down = self.update_adjacency_value(adjacency_matrix, origin_mask, plane_mask_flattened[index+width])\n", " \n", " if (left or right or up or down):\n", " adjacency_matrix[int(origin_mask - 1), int(origin_mask-1)] += 1\n", "\n", " def compute_channel_means_sums_compensated(self, image):\n", " height, width, n_channels = image.shape\n", " mask_height, mask_width = self.flatmasks.shape\n", " n_masks = len(np.unique(self.flatmasks)) - 1\n", " channel_sums = np.zeros((n_masks, n_channels))\n", " channel_counts = np.zeros((n_masks, n_channels))\n", " if n_masks == 0:\n", " return channel_sums, channel_sums, channel_counts\n", "\n", " squashed_image = np.reshape(image, (height*width, n_channels))\n", " \n", " #masklocs = np.nonzero(self.flatmasks)\n", " #plane_mask = np.zeros((mask_height, mask_width), dtype = np.uint32)\n", " #plane_mask[masklocs[0], masklocs[1]] = masklocs[2] + 1\n", " #plane_mask = plane_mask.flatten()\n", " plane_mask = self.flatmasks.flatten()\n", " \n", " adjacency_matrix = np.zeros((n_masks, n_masks))\n", " for i in range(len(plane_mask)):\n", " self.update_adjacency_matrix(plane_mask, mask_width, mask_height, adjacency_matrix, i)\n", " \n", " mask_val = plane_mask[i] - 1\n", " if mask_val != -1:\n", " channel_sums[mask_val.astype(np.int32)] += squashed_image[i]\n", " channel_counts[mask_val.astype(np.int32)] += 1\n", " \n", " \n", " # Normalize adjacency matrix\n", " for i in range(n_masks):\n", " adjacency_matrix[i] = adjacency_matrix[i] / (max(adjacency_matrix[i, i], 1) * 2)\n", " adjacency_matrix[i, i] = 1\n", " \n", " means = np.true_divide(channel_sums, channel_counts, out=np.zeros_like(channel_sums, dtype='float'), where=channel_counts!=0)\n", " # Convert your numpy arrays to PyTorch tensors\n", " adjacency_matrix_torch = torch.from_numpy(adjacency_matrix)\n", " means_torch = torch.from_numpy(means)\n", "\n", " # Solve the least squares problem\n", " results_torch = torch.linalg.lstsq(adjacency_matrix_torch, means_torch).solution\n", "\n", " # Convert the result back to a numpy array if needed\n", " # Convert the result back to a numpy array if needed\n", " results = results_torch.numpy()\n", " compensated_means = np.maximum(results, np.zeros(results.shape)) \n", "\n", " return compensated_means, means, channel_counts[:,0]" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "# load pickle file\n", "import pickle \n", "\n", "with open(\"/home/timkempchen/Downloads/seg_output_tonsil2.pickle\", 'rb') as f:\n", " seg_output = pickle.load(f)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['img', 'masks', 'image_dict'])" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seg_output.keys()" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "# get keys of image_dict\n", "channelnames = list(seg_output['image_dict'].keys())\n", "\n", "images = seg_output['image_dict']\n", "masks = seg_output['masks']\n", "masks = masks.squeeze()" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "# Assuming `images` is your dictionary of 2D numpy arrays\n", "# and `masks` is your 2D numpy array of masks\n", "\n", "# Create a list of the 2D numpy arrays in the dictionary\n", "image_list = [images[channel_name] for channel_name in images.keys()]" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [], "source": [ "\n", "\n", "# Stack the 2D numpy arrays along the third dimension to create a 3D numpy array\n", "image = np.stack(image_list, axis=-1)\n", "\n", "# Now you can use `image` as the input for the function\n", "processor = ImageProcessor(masks)\n", "compensated_means, means, channel_counts = processor.compute_channel_means_sums_compensated(image)" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | Unnamed: 0 | \n", "DAPI | \n", "FoxP3 | \n", "HLA-DR | \n", "CD103 | \n", "CHGA | \n", "EGFR | \n", "CD206 | \n", "GFAP | \n", "PD-1 | \n", "... | \n", "GATA3 | \n", "x | \n", "y | \n", "eccentricity | \n", "perimeter | \n", "convex_area | \n", "area | \n", "axis_major_length | \n", "axis_minor_length | \n", "label | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "1 | \n", "105.993197 | \n", "1.340136 | \n", "0.557823 | \n", "16.442177 | \n", "8.278912 | \n", "6.183673 | \n", "3.306122 | \n", "1.068027 | \n", "13.020408 | \n", "... | \n", "11.074830 | \n", "4.986395 | \n", "1472.238095 | \n", "0.603485 | \n", "44.142136 | \n", "154.0 | \n", "147.0 | \n", "15.439633 | \n", "12.311169 | \n", "1 | \n", "
| 1 | \n", "2 | \n", "123.677686 | \n", "0.619835 | \n", "0.830579 | \n", "17.223140 | \n", "17.194215 | \n", "5.975207 | \n", "3.623967 | \n", "0.942149 | \n", "15.983471 | \n", "... | \n", "11.909091 | \n", "5.359504 | \n", "1322.851240 | \n", "0.853893 | \n", "63.248737 | \n", "267.0 | \n", "242.0 | \n", "24.688741 | \n", "12.849201 | \n", "2 | \n", "
| 2 | \n", "3 | \n", "107.203125 | \n", "1.281250 | \n", "0.671875 | \n", "17.925781 | \n", "9.699219 | \n", "6.589844 | \n", "3.566406 | \n", "1.023438 | \n", "13.890625 | \n", "... | \n", "11.816406 | \n", "5.710938 | \n", "1506.226562 | \n", "0.766017 | \n", "61.798990 | \n", "268.0 | \n", "256.0 | \n", "22.855322 | \n", "14.691870 | \n", "3 | \n", "
| 3 | \n", "4 | \n", "49.660959 | \n", "0.136986 | \n", "0.006849 | \n", "39.623288 | \n", "25.102740 | \n", "2.797945 | \n", "0.989726 | \n", "0.801370 | \n", "8.965753 | \n", "... | \n", "6.722603 | \n", "8.544521 | \n", "641.938356 | \n", "0.645764 | \n", "63.112698 | \n", "306.0 | \n", "292.0 | \n", "22.077563 | \n", "16.857044 | \n", "4 | \n", "
| 4 | \n", "5 | \n", "148.702532 | \n", "1.310127 | \n", "1.563291 | \n", "18.183544 | \n", "33.227848 | \n", "7.981013 | \n", "5.082278 | \n", "0.943038 | \n", "21.196203 | \n", "... | \n", "16.829114 | \n", "9.006329 | \n", "1303.702532 | \n", "0.766800 | \n", "48.420310 | \n", "172.0 | \n", "158.0 | \n", "17.888621 | \n", "11.482448 | \n", "5 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 23326 | \n", "23327 | \n", "50.512346 | \n", "0.956790 | \n", "1.401235 | \n", "23.746914 | \n", "18.395062 | \n", "24.481481 | \n", "2.932099 | \n", "0.901235 | \n", "12.617284 | \n", "... | \n", "6.654321 | \n", "2523.888889 | \n", "1384.086420 | \n", "0.761539 | \n", "48.627417 | \n", "176.0 | \n", "162.0 | \n", "17.973486 | \n", "11.648970 | \n", "23327 | \n", "
| 23327 | \n", "23328 | \n", "160.015686 | \n", "1.176471 | \n", "3.137255 | \n", "19.737255 | \n", "34.219608 | \n", "11.309804 | \n", "4.721569 | \n", "0.976471 | \n", "19.717647 | \n", "... | \n", "21.035294 | \n", "2522.047059 | \n", "1438.568627 | \n", "0.722578 | \n", "62.077164 | \n", "274.0 | \n", "255.0 | \n", "21.866422 | \n", "15.116015 | \n", "23328 | \n", "
| 23328 | \n", "23329 | \n", "56.734177 | \n", "0.759494 | \n", "0.860759 | \n", "16.835443 | \n", "17.898734 | \n", "16.405063 | \n", "2.063291 | \n", "0.924051 | \n", "10.569620 | \n", "... | \n", "6.506329 | \n", "2523.924051 | \n", "1349.759494 | \n", "0.707599 | \n", "32.970563 | \n", "86.0 | \n", "79.0 | \n", "12.134167 | \n", "8.574169 | \n", "23329 | \n", "
| 23329 | \n", "23330 | \n", "86.326531 | \n", "0.806122 | \n", "1.316327 | \n", "18.612245 | \n", "19.306122 | \n", "16.571429 | \n", "2.561224 | \n", "1.010204 | \n", "13.540816 | \n", "... | \n", "9.806122 | \n", "2525.234694 | \n", "1420.387755 | \n", "0.760933 | \n", "35.556349 | \n", "103.0 | \n", "98.0 | \n", "13.929985 | \n", "9.038195 | \n", "23330 | \n", "
| 23330 | \n", "23331 | \n", "11.522727 | \n", "0.147727 | \n", "0.000000 | \n", "1.170455 | \n", "1.238636 | \n", "1.397727 | \n", "0.136364 | \n", "0.886364 | \n", "4.488636 | \n", "... | \n", "1.659091 | \n", "2535.886364 | \n", "231.329545 | \n", "0.472365 | \n", "31.556349 | \n", "89.0 | \n", "88.0 | \n", "11.256538 | \n", "9.921544 | \n", "23331 | \n", "
23331 rows × 69 columns
\n", "| \n", " | Unnamed: 0 | \n", "DAPI | \n", "FoxP3 | \n", "HLA-DR | \n", "CD103 | \n", "CHGA | \n", "EGFR | \n", "CD206 | \n", "GFAP | \n", "PD-1 | \n", "... | \n", "GATA3 | \n", "x | \n", "y | \n", "eccentricity | \n", "perimeter | \n", "convex_area | \n", "area | \n", "axis_major_length | \n", "axis_minor_length | \n", "label | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "1 | \n", "105.993197 | \n", "1.340136 | \n", "0.557823 | \n", "16.442177 | \n", "8.278912 | \n", "6.183673 | \n", "3.306122 | \n", "1.068027 | \n", "13.020408 | \n", "... | \n", "11.074830 | \n", "4.986395 | \n", "1472.238095 | \n", "0.603485 | \n", "44.142136 | \n", "154.0 | \n", "147.0 | \n", "15.439633 | \n", "12.311169 | \n", "1 | \n", "
| 1 | \n", "2 | \n", "123.677686 | \n", "0.619835 | \n", "0.830579 | \n", "17.223140 | \n", "17.194215 | \n", "5.975207 | \n", "3.623967 | \n", "0.942149 | \n", "15.983471 | \n", "... | \n", "11.909091 | \n", "5.359504 | \n", "1322.851240 | \n", "0.853893 | \n", "63.248737 | \n", "267.0 | \n", "242.0 | \n", "24.688741 | \n", "12.849201 | \n", "2 | \n", "
| 2 | \n", "3 | \n", "107.203125 | \n", "1.281250 | \n", "0.671875 | \n", "17.925781 | \n", "9.699219 | \n", "6.589844 | \n", "3.566406 | \n", "1.023438 | \n", "13.890625 | \n", "... | \n", "11.816406 | \n", "5.710938 | \n", "1506.226562 | \n", "0.766017 | \n", "61.798990 | \n", "268.0 | \n", "256.0 | \n", "22.855322 | \n", "14.691870 | \n", "3 | \n", "
| 3 | \n", "4 | \n", "49.660959 | \n", "0.136986 | \n", "0.006849 | \n", "39.623288 | \n", "25.102740 | \n", "2.797945 | \n", "0.989726 | \n", "0.801370 | \n", "8.965753 | \n", "... | \n", "6.722603 | \n", "8.544521 | \n", "641.938356 | \n", "0.645764 | \n", "63.112698 | \n", "306.0 | \n", "292.0 | \n", "22.077563 | \n", "16.857044 | \n", "4 | \n", "
| 4 | \n", "5 | \n", "148.702532 | \n", "1.310127 | \n", "1.563291 | \n", "18.183544 | \n", "33.227848 | \n", "7.981013 | \n", "5.082278 | \n", "0.943038 | \n", "21.196203 | \n", "... | \n", "16.829114 | \n", "9.006329 | \n", "1303.702532 | \n", "0.766800 | \n", "48.420310 | \n", "172.0 | \n", "158.0 | \n", "17.888621 | \n", "11.482448 | \n", "5 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 23326 | \n", "23327 | \n", "50.512346 | \n", "0.956790 | \n", "1.401235 | \n", "23.746914 | \n", "18.395062 | \n", "24.481481 | \n", "2.932099 | \n", "0.901235 | \n", "12.617284 | \n", "... | \n", "6.654321 | \n", "2523.888889 | \n", "1384.086420 | \n", "0.761539 | \n", "48.627417 | \n", "176.0 | \n", "162.0 | \n", "17.973486 | \n", "11.648970 | \n", "23327 | \n", "
| 23327 | \n", "23328 | \n", "160.015686 | \n", "1.176471 | \n", "3.137255 | \n", "19.737255 | \n", "34.219608 | \n", "11.309804 | \n", "4.721569 | \n", "0.976471 | \n", "19.717647 | \n", "... | \n", "21.035294 | \n", "2522.047059 | \n", "1438.568627 | \n", "0.722578 | \n", "62.077164 | \n", "274.0 | \n", "255.0 | \n", "21.866422 | \n", "15.116015 | \n", "23328 | \n", "
| 23328 | \n", "23329 | \n", "56.734177 | \n", "0.759494 | \n", "0.860759 | \n", "16.835443 | \n", "17.898734 | \n", "16.405063 | \n", "2.063291 | \n", "0.924051 | \n", "10.569620 | \n", "... | \n", "6.506329 | \n", "2523.924051 | \n", "1349.759494 | \n", "0.707599 | \n", "32.970563 | \n", "86.0 | \n", "79.0 | \n", "12.134167 | \n", "8.574169 | \n", "23329 | \n", "
| 23329 | \n", "23330 | \n", "86.326531 | \n", "0.806122 | \n", "1.316327 | \n", "18.612245 | \n", "19.306122 | \n", "16.571429 | \n", "2.561224 | \n", "1.010204 | \n", "13.540816 | \n", "... | \n", "9.806122 | \n", "2525.234694 | \n", "1420.387755 | \n", "0.760933 | \n", "35.556349 | \n", "103.0 | \n", "98.0 | \n", "13.929985 | \n", "9.038195 | \n", "23330 | \n", "
| 23330 | \n", "23331 | \n", "11.522727 | \n", "0.147727 | \n", "0.000000 | \n", "1.170455 | \n", "1.238636 | \n", "1.397727 | \n", "0.136364 | \n", "0.886364 | \n", "4.488636 | \n", "... | \n", "1.659091 | \n", "2535.886364 | \n", "231.329545 | \n", "0.472365 | \n", "31.556349 | \n", "89.0 | \n", "88.0 | \n", "11.256538 | \n", "9.921544 | \n", "23331 | \n", "
23331 rows × 69 columns
\n", "| \n", " | Unnamed: 0 | \n", "DAPI | \n", "FoxP3 | \n", "HLA-DR | \n", "CD103 | \n", "CHGA | \n", "EGFR | \n", "CD206 | \n", "GFAP | \n", "PD-1 | \n", "... | \n", "x | \n", "y | \n", "eccentricity | \n", "perimeter | \n", "convex_area | \n", "area | \n", "axis_major_length | \n", "axis_minor_length | \n", "label | \n", "segmentation_channel | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "1 | \n", "73.400319 | \n", "0.963145 | \n", "0.000000 | \n", "10.701006 | \n", "0.000000 | \n", "4.174474 | \n", "1.792112 | \n", "0.841941 | \n", "8.013893 | \n", "... | \n", "4.986395 | \n", "1472.238095 | \n", "0.603485 | \n", "44.142136 | \n", "154.0 | \n", "147.0 | \n", "15.439633 | \n", "12.311169 | \n", "1 | \n", "4.104627 | \n", "
| 1 | \n", "2 | \n", "62.184776 | \n", "0.000000 | \n", "0.000000 | \n", "8.109533 | \n", "1.652147 | \n", "2.626056 | \n", "1.173389 | \n", "0.613547 | \n", "7.322614 | \n", "... | \n", "5.359504 | \n", "1322.851240 | \n", "0.853893 | \n", "63.248737 | \n", "267.0 | \n", "242.0 | \n", "24.688741 | \n", "12.849201 | \n", "2 | \n", "2.045059 | \n", "
| 2 | \n", "3 | \n", "95.657189 | \n", "1.131343 | \n", "0.000000 | \n", "15.147517 | \n", "5.491188 | \n", "5.509342 | \n", "3.137370 | \n", "0.875055 | \n", "11.599501 | \n", "... | \n", "5.710938 | \n", "1506.226562 | \n", "0.766017 | \n", "61.798990 | \n", "268.0 | \n", "256.0 | \n", "22.855322 | \n", "14.691870 | \n", "3 | \n", "9.495032 | \n", "
| 3 | \n", "4 | \n", "49.660959 | \n", "0.136986 | \n", "0.006849 | \n", "39.623288 | \n", "25.102740 | \n", "2.797945 | \n", "0.989726 | \n", "0.801370 | \n", "8.965753 | \n", "... | \n", "8.544521 | \n", "641.938356 | \n", "0.645764 | \n", "63.112698 | \n", "306.0 | \n", "292.0 | \n", "22.077563 | \n", "16.857044 | \n", "4 | \n", "17.931507 | \n", "
| 4 | \n", "5 | \n", "114.610899 | \n", "1.152759 | \n", "0.888520 | \n", "13.454905 | \n", "26.300720 | \n", "5.784891 | \n", "3.961348 | \n", "0.703600 | \n", "16.377783 | \n", "... | \n", "9.006329 | \n", "1303.702532 | \n", "0.766800 | \n", "48.420310 | \n", "172.0 | \n", "158.0 | \n", "17.888621 | \n", "11.482448 | \n", "5 | \n", "25.419915 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 23326 | \n", "23327 | \n", "42.196426 | \n", "0.832806 | \n", "1.086360 | \n", "21.067722 | \n", "15.171849 | \n", "22.810752 | \n", "2.518938 | \n", "0.782610 | \n", "10.996428 | \n", "... | \n", "2523.888889 | \n", "1384.086420 | \n", "0.761539 | \n", "48.627417 | \n", "176.0 | \n", "162.0 | \n", "17.973486 | \n", "11.648970 | \n", "23327 | \n", "39.302940 | \n", "
| 23327 | \n", "23328 | \n", "131.577919 | \n", "0.681751 | \n", "2.114098 | \n", "14.009404 | \n", "27.114338 | \n", "7.196972 | \n", "3.672131 | \n", "0.731182 | \n", "14.524425 | \n", "... | \n", "2522.047059 | \n", "1438.568627 | \n", "0.722578 | \n", "62.077164 | \n", "274.0 | \n", "255.0 | \n", "21.866422 | \n", "15.116015 | \n", "23328 | \n", "21.348579 | \n", "
| 23328 | \n", "23329 | \n", "23.747778 | \n", "0.408855 | \n", "1.126567 | \n", "10.593432 | \n", "12.509655 | \n", "11.727330 | \n", "0.997654 | \n", "0.661402 | \n", "6.655545 | \n", "... | \n", "2523.924051 | \n", "1349.759494 | \n", "0.707599 | \n", "32.970563 | \n", "86.0 | \n", "79.0 | \n", "12.134167 | \n", "8.574169 | \n", "23329 | \n", "30.741303 | \n", "
| 23329 | \n", "23330 | \n", "41.325382 | \n", "0.150234 | \n", "0.593619 | \n", "12.793476 | \n", "10.459755 | \n", "14.349209 | \n", "1.055391 | \n", "0.741730 | \n", "3.383721 | \n", "... | \n", "2525.234694 | \n", "1420.387755 | \n", "0.760933 | \n", "35.556349 | \n", "103.0 | \n", "98.0 | \n", "13.929985 | \n", "9.038195 | \n", "23330 | \n", "47.744243 | \n", "
| 23330 | \n", "23331 | \n", "11.522727 | \n", "0.147727 | \n", "0.000000 | \n", "1.170455 | \n", "1.238636 | \n", "1.397727 | \n", "0.136364 | \n", "0.886364 | \n", "4.488636 | \n", "... | \n", "2535.886364 | \n", "231.329545 | \n", "0.472365 | \n", "31.556349 | \n", "89.0 | \n", "88.0 | \n", "11.256538 | \n", "9.921544 | \n", "23331 | \n", "1.886364 | \n", "
23331 rows × 70 columns
\n", "