From f772a06fed306586cf1095f8b24608f46e2ee0b0 Mon Sep 17 00:00:00 2001 From: Bill Freeman Date: Sat, 24 Feb 2024 12:15:51 -0600 Subject: [PATCH] WIP --- .../Untitled-checkpoint.ipynb | 6 + docs/datascience/adx/cs2/csds/Untitled.ipynb | 884 ++++++++++++++++++ docs/datascience/adx/cs2/csds/csds | Bin 0 -> 4496 bytes 3 files changed, 890 insertions(+) create mode 100644 docs/datascience/adx/cs2/csds/.ipynb_checkpoints/Untitled-checkpoint.ipynb create mode 100644 docs/datascience/adx/cs2/csds/Untitled.ipynb create mode 100644 docs/datascience/adx/cs2/csds/csds diff --git a/docs/datascience/adx/cs2/csds/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/docs/datascience/adx/cs2/csds/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 0000000..363fcab --- /dev/null +++ b/docs/datascience/adx/cs2/csds/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/datascience/adx/cs2/csds/Untitled.ipynb b/docs/datascience/adx/cs2/csds/Untitled.ipynb new file mode 100644 index 0000000..0e870b9 --- /dev/null +++ b/docs/datascience/adx/cs2/csds/Untitled.ipynb @@ -0,0 +1,884 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "be9002d6-c1a7-4d4e-990d-d8f7f3f5d32b", + "metadata": {}, + "outputs": [], + "source": [ + "from io import BytesIO\n", + "from gzip import GzipFile\n", + "import json\n", + "import gzip" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "52bb848f-690b-4fa5-8ed3-4636cf3cded3", + "metadata": {}, + "outputs": [], + "source": [ + "with gzip.open('csds', 'r') as fin:\n", + " data = json.loads(fin.read().decode('utf-8'))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6435382f-41bb-4b87-a971-a6341597a777", + "metadata": {}, + "outputs": [], + "source": [ + "channels = data['channels']" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "4db86556-55fe-40dc-b9d8-63da7027cf81", + "metadata": {}, + "outputs": [], + "source": [ + "def print_row(row):\n", + " data=['']\n", + " data.append(row['name'])\n", + " data.append(row['origin'])\n", + " data.append(', '.join(row.get('dependents',[])))\n", + " data.append(', '.join(row.get('mergeKeys',[])))\n", + " data.append('')\n", + " print('|'.join(data))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "b93b36fa-d917-4d51-a123-a4d4a2139e6f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## bomb_action - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|event_type|replay|||\n", + "|player_id|replay|||\n", + "|player_id_pawn|replay|||\n", + "|site_code|replay|||\n", + "|entity_id|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n", + "## bomb_defuse - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|event_type|replay|||\n", + "|player_id|replay|||\n", + "|has_kit|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n", + "## bomb_state - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|event_type|replay|||\n", + "|player_id|replay|||\n", + "|site_code|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n", + "## bot_takeover - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|bot_id|replay|||\n", + "|player_index|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n", + "## grenade_state - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|event_type|replay|||\n", + "|entity_id|replay|||\n", + "|player_id|replay|||\n", + "|x_pos|replay|||\n", + "|y_pos|replay|||\n", + "|z_pos|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|entity_id_fixed|calculated|round, entity_id, event_type, tick||\n", + "|tick_throw|calculated|round, player_id, weapon_name, tick||\n", + "|player_x_pos|merged||tick_throw, player_id|\n", + "|player_y_pos|merged||tick_throw, player_id|\n", + "|player_z_pos|merged||tick_throw, player_id|\n", + "|player_x_vel|merged||tick_throw, player_id|\n", + "|player_y_vel|merged||tick_throw, player_id|\n", + "|player_z_vel|merged||tick_throw, player_id|\n", + "|player_phi_ang|merged||tick_throw, player_id|\n", + "|player_theta_ang|merged||tick_throw, player_id|\n", + "|player_weapon_code|merged||tick_throw, player_id|\n", + "|player_team_code|merged||tick_throw, player_id|\n", + "\n", + "## header - \n", + "\n", + "|magic|replay|||\n", + "|network_protocol|replay|||\n", + "|server_name|replay|||\n", + "|client_name|replay|||\n", + "|map_name|replay|||\n", + "|game_directory|replay|||\n", + "|fullpackets_version|replay|||\n", + "|allow_clientside_entities|replay|||\n", + "|allow_clientside_particles|replay|||\n", + "|addons|replay|||\n", + "|demo_version_name|replay|||\n", + "|demo_version_guid|replay|||\n", + "|build_num|replay|||\n", + "|game|replay|||\n", + "|magic|replay|||\n", + "|protocol|replay|||\n", + "|network_protocol|replay|||\n", + "|server_name|replay|||\n", + "|client_name|replay|||\n", + "|map_name|replay|||\n", + "|game_directory|replay|||\n", + "|playback_time|replay|||\n", + "|playback_ticks|replay|||\n", + "|playback_frames|replay|||\n", + "|signon_length|replay|||\n", + "|tick_rate|calculated|playback_ticks, playback_time||\n", + "|tick_save_rate|calculated|playback_frames, playback_time||\n", + "|rushb_version|calculated|meta:metadata.rushbVersion||\n", + "|ppp_version|calculated|meta:context.version||\n", + "|match_date|calculated|meta:matchDate||\n", + "|demo_id|calculated-redacted|meta:demoId||\n", + "|sharecode|calculated-redacted|meta:sharecode||\n", + "|platform|calculated|meta:platform||\n", + "|match_type|calculated|meta:matchType||\n", + "|game|calculated|meta:game||\n", + "|second|calculated|tick, tick_rate||\n", + "|t_starters_avg_rank|calculated|is_bot, round, rank, steam_id, team_code||\n", + "|t_starters_avg_wins|calculated|is_bot, round, wins, steam_id, team_code||\n", + "|ct_starters_avg_rank|calculated|is_bot, round, rank, steam_id, team_code||\n", + "|ct_starters_avg_wins|calculated|is_bot, round, wins, steam_id, team_code||\n", + "|ct_starters_score_final|calculated|round_state:ct_score||\n", + "|t_starters_score_final|calculated|round_state:t_score||\n", + "|providence|calculated|metademo:providence||\n", + "|number_of_points|calculated|shape of all data frames||\n", + "\n", + "## item_equip - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|item|replay|||\n", + "|def_index|replay|||\n", + "|can_zoom|replay|||\n", + "|has_silencer|replay|||\n", + "|is_silenced|replay|||\n", + "|has_tracers|replay|||\n", + "|weapon_type_code|replay|||\n", + "|is_painted|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n", + "## item_pickup - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|item|replay|||\n", + "|def_index|replay|||\n", + "|is_silent|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n", + "## molotov_state - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|event_type|replay|||\n", + "|entity_id|replay|||\n", + "|x_pos|replay|||\n", + "|y_pos|replay|||\n", + "|z_pos|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|entity_id_fixed|calculated|round, entity_id, event_type, tick||\n", + "|burn_duration|calculated|second, entity_id_fixed, event_type||\n", + "|was_extinguished_by_smoke|calculated|second, entity_id_fixed, event_type, burn_duration||\n", + "|extinguisher_id|calculated|second, entity_id_fixed, event_type, x_pos, y_pos, z_pos, player_id||\n", + "|extinguisher_id_fixed|calculated|second, entity_id, entity_id_fixed, event_type, x_pos, y_pos, z_pos, player_id_fixed||\n", + "|smoke_entity_id|calculated|second, entity_id, entity_id_fixed, event_type, x_pos, y_pos, z_pos||\n", + "|was_extinguished_by_thrown_smoke|calculated|second, entity_id, entity_id_fixed, event_type, x_pos, y_pos, z_pos||\n", + "|player_id|calculated|event_type, second, round||\n", + "|player_id_fixed|calculated|event_type, second, round||\n", + "|tick_throw|calculated|event_type, second, round||\n", + "|player_x_pos|merged||tick_throw, player_id|\n", + "|player_y_pos|merged||tick_throw, player_id|\n", + "|player_z_pos|merged||tick_throw, player_id|\n", + "|player_x_vel|merged||tick_throw, player_id|\n", + "|player_y_vel|merged||tick_throw, player_id|\n", + "|player_z_vel|merged||tick_throw, player_id|\n", + "|player_phi_ang|merged||tick_throw, player_id|\n", + "|player_theta_ang|merged||tick_throw, player_id|\n", + "|player_weapon_code|merged||tick_throw, player_id|\n", + "|player_team_code|merged||tick_throw, player_id|\n", + "\n", + "## other_death - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|other_type|replay|||\n", + "|attacker_id|replay|||\n", + "|weapon_name|replay|||\n", + "|is_headshot|replay|||\n", + "|penetration_amount|replay|||\n", + "|is_through_smoke|replay|||\n", + "|is_attacker_blind|replay|||\n", + "|is_noscope|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|attacker_id_fixed|merged||attacker_id, round, steam_id|\n", + "|attacker_x_pos|merged||attacker_id, tick|\n", + "|attacker_y_pos|merged||attacker_id, tick|\n", + "|attacker_z_pos|merged||attacker_id, tick|\n", + "|attacker_x_vel|merged||attacker_id, tick|\n", + "|attacker_y_vel|merged||attacker_id, tick|\n", + "|attacker_z_vel|merged||attacker_id, tick|\n", + "|attacker_phi_ang|merged||attacker_id, tick|\n", + "|attacker_theta_ang|merged||attacker_id, tick|\n", + "|attacker_weapon_code|merged||attacker_id, tick|\n", + "|attacker_team_code|merged||attacker_id, tick|\n", + "|attacker_tick|merged||attacker_id, tick|\n", + "|attacker_player_id|merged||attacker_id, tick|\n", + "\n", + "## player_action - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|event_type|replay|||\n", + "|player_id|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n", + "## player_blind - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|entity_id|replay|||\n", + "|attacker_id|replay|||\n", + "|blind_duration|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|attacker_id_fixed|merged||attacker_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "|attacker_x_pos|merged||attacker_id, tick|\n", + "|attacker_y_pos|merged||attacker_id, tick|\n", + "|attacker_z_pos|merged||attacker_id, tick|\n", + "|attacker_x_vel|merged||attacker_id, tick|\n", + "|attacker_y_vel|merged||attacker_id, tick|\n", + "|attacker_z_vel|merged||attacker_id, tick|\n", + "|attacker_phi_ang|merged||attacker_id, tick|\n", + "|attacker_theta_ang|merged||attacker_id, tick|\n", + "|attacker_weapon_code|merged||attacker_id, tick|\n", + "|attacker_team_code|merged||attacker_id, tick|\n", + "|attacker_tick|merged||attacker_id, tick|\n", + "|attacker_player_id|merged||attacker_id, tick|\n", + "\n", + "## player_death - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|attacker_id|replay|||\n", + "|assister_id|replay|||\n", + "|weapon_name|replay|||\n", + "|is_headshot|replay|||\n", + "|penetration_amount|replay|||\n", + "|has_replay|replay|||\n", + "|is_flash_assist|replay|||\n", + "|is_through_smoke|replay|||\n", + "|is_attacker_blind|replay|||\n", + "|is_noscope|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|attacker_id_fixed|merged||attacker_id, round, steam_id|\n", + "|assister_id_fixed|merged||assister_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "|attacker_x_pos|merged||attacker_id, tick|\n", + "|attacker_y_pos|merged||attacker_id, tick|\n", + "|attacker_z_pos|merged||attacker_id, tick|\n", + "|attacker_x_vel|merged||attacker_id, tick|\n", + "|attacker_y_vel|merged||attacker_id, tick|\n", + "|attacker_z_vel|merged||attacker_id, tick|\n", + "|attacker_phi_ang|merged||attacker_id, tick|\n", + "|attacker_theta_ang|merged||attacker_id, tick|\n", + "|attacker_weapon_code|merged||attacker_id, tick|\n", + "|attacker_team_code|merged||attacker_id, tick|\n", + "|attacker_tick|merged||attacker_id, tick|\n", + "|attacker_player_id|merged||attacker_id, tick|\n", + "|assister_x_pos|merged||assister_id, tick|\n", + "|assister_y_pos|merged||assister_id, tick|\n", + "|assister_z_pos|merged||assister_id, tick|\n", + "|assister_x_vel|merged||assister_id, tick|\n", + "|assister_y_vel|merged||assister_id, tick|\n", + "|assister_z_vel|merged||assister_id, tick|\n", + "|assister_phi_ang|merged||assister_id, tick|\n", + "|assister_theta_ang|merged||assister_id, tick|\n", + "|assister_weapon_code|merged||assister_id, tick|\n", + "|assister_team_code|merged||assister_id, tick|\n", + "|assister_tick|merged||assister_id, tick|\n", + "|assister_player_id|merged||assister_id, tick|\n", + "\n", + "## player_disconnect - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|disconnect_reason|replay|||\n", + "|is_bot|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "\n", + "## player_footstep - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "\n", + "## player_hurt - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|attacker_id|replay|||\n", + "|health|replay|||\n", + "|armor|replay|||\n", + "|weapon_name|replay|||\n", + "|health_removed|replay|||\n", + "|armor_removed|replay|||\n", + "|hit_box_code|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|attacker_id_fixed|merged||attacker_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "|attacker_x_pos|merged||attacker_id, tick|\n", + "|attacker_y_pos|merged||attacker_id, tick|\n", + "|attacker_z_pos|merged||attacker_id, tick|\n", + "|attacker_x_vel|merged||attacker_id, tick|\n", + "|attacker_y_vel|merged||attacker_id, tick|\n", + "|attacker_z_vel|merged||attacker_id, tick|\n", + "|attacker_phi_ang|merged||attacker_id, tick|\n", + "|attacker_theta_ang|merged||attacker_id, tick|\n", + "|attacker_weapon_code|merged||attacker_id, tick|\n", + "|attacker_team_code|merged||attacker_id, tick|\n", + "|attacker_tick|merged||attacker_id, tick|\n", + "|attacker_player_id|merged||attacker_id, tick|\n", + "|effective_health_removed|calculated|player_id, round, health||\n", + "\n", + "## player_info - \n", + "\n", + "|round|replay|||\n", + "|tick|replay-deleted|||\n", + "|player_id|replay|||\n", + "|team_code|replay|||\n", + "|wins|replay-capped|||\n", + "|rank|replay|||\n", + "|radar_color_code|replay|||\n", + "|second|calculated-deleted|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|rank_raw|calculated|player_info:rank||\n", + "|rank_platform|calculated|player_personal:rank||\n", + "\n", + "## player_name - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|name_new|replay-redacted|||\n", + "|name_old|replay-redacted|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "\n", + "## player_personal - \n", + "\n", + "|round|replay|||\n", + "|tick|replay-deleted|||\n", + "|player_id|replay|||\n", + "|player_controller_id|replay|||\n", + "|player_id_pawn|replay|||\n", + "|name|replay-redacted|||\n", + "|clan_tag|replay-redacted|||\n", + "|steam_id|replay-redacted|||\n", + "|second|calculated-deleted|tick, tick_rate||\n", + "|is_bot|calculated|steam_id||\n", + "|player_id_fixed|calculated|steam_id, is_bot||\n", + "\n", + "## player_spawn - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n", + "## player_status - \n", + "\n", + "|tick|replay|||\n", + "|round|replay|||\n", + "|player_id|replay|||\n", + "|player_controller_id|replay|||\n", + "|armor|replay|||\n", + "|health|replay|||\n", + "|place_name|replay|||\n", + "|inv_primary|replay|||\n", + "|inv_secondary|replay|||\n", + "|inv_flashbang|replay|||\n", + "|inv_taser|replay|||\n", + "|inv_hegrenade|replay|||\n", + "|inv_smokegrenade|replay|||\n", + "|inv_molotov|replay|||\n", + "|inv_decoy|replay|||\n", + "|inv_incgrenade|replay|||\n", + "|inv_c4|replay|||\n", + "|current_equipment_cost|replay|||\n", + "|freezetime_end_equipment_cost|replay|||\n", + "|money|replay|||\n", + "|ping|replay-redacted|||\n", + "|round_start_equipment_cost|replay|||\n", + "|zoom_level|replay|||\n", + "|iron_sight_mode|replay|||\n", + "|burst_mode|replay|||\n", + "|is_silenced|replay|||\n", + "|reload_visually_complete|replay|||\n", + "|weapon_mode|replay|||\n", + "|flash_duration|replay|||\n", + "|flash_max_alpha|replay|||\n", + "|has_c4|replay|||\n", + "|has_defuser|replay|||\n", + "|has_helmet|replay|||\n", + "|is_defusing|replay|||\n", + "|is_fake_player|replay|||\n", + "|is_in_bomb_zone|replay|||\n", + "|is_in_buy_zone|replay|||\n", + "|is_scoped|replay|||\n", + "|is_spotted|replay|||\n", + "|is_walking|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|equipment_value_calc|calculated|inv_flashbang, inv_taser, inv_hegrenade, inv_smokegrenade, inv_molotov, inv_decoy, inv_incgrenade, inv_c4, armor, has_defuser, has_helmet, inv_primary, inv_secondary||\n", + "\n", + "## player_vector - \n", + "\n", + "|tick|replay|||\n", + "|round|replay|||\n", + "|player_id|replay|||\n", + "|x_pos|replay|||\n", + "|y_pos|replay|||\n", + "|z_pos|replay|||\n", + "|x_aimpunch|replay|||\n", + "|y_aimpunch|replay|||\n", + "|current_ammo|replay|||\n", + "|weapon_code|replay|||\n", + "|inaccuracy|replay|||\n", + "|last_shot_time|replay|||\n", + "|recoil_index|replay|||\n", + "|phi_ang|replay|||\n", + "|theta_ang|replay|||\n", + "|is_ducked|replay|||\n", + "|is_ducking|replay|||\n", + "|duck_amount|replay|||\n", + "|duck_speed|replay|||\n", + "|fall_velocity|replay|||\n", + "|view_punch_angle_tick|replay|||\n", + "|aim_punch_angle_vel_x|replay|||\n", + "|aim_punch_angle_vel_y|replay|||\n", + "|aim_punch_angle_vel_z|replay|||\n", + "|is_rescuing|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|team_code|merged||round, player_id|\n", + "|theta_vel|calculated|second, player_id, theta||\n", + "|phi_vel|calculated|second, player_id, phi||\n", + "|ang_vel|calculated|phi_vel, theta_vel||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|x_vel|calculated|second, x_pos||\n", + "|y_vel|calculated|second, y_pos||\n", + "|z_vel|calculated|second, z_pos||\n", + "|speed_2d|calculated|x_vel, y_vel||\n", + "|movement_angle|calculated|second, x_vel, y_vel||\n", + "|movement_angle_diff|calculated|second, speed_2d, theta_ang, movement_angle||\n", + "\n", + "## round_end - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|winner_team_code|replay|||\n", + "|win_reason_code|replay|||\n", + "|win_reason_message|replay|||\n", + "|legacy_code|replay|||\n", + "|player_count|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "\n", + "## round_mvp - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|mvp_reason_code|replay|||\n", + "|music_kit_mvps|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "\n", + "## round_start - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|time_limit|replay|||\n", + "|frag_limit|replay|||\n", + "|objective|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "\n", + "## round_state - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|event_type|replay|||\n", + "|t_score|replay_fixed|||\n", + "|ct_score|replay_fixed|||\n", + "|t_score_raw|replay|||\n", + "|ct_score_raw|replay|||\n", + "|phase|replay|||\n", + "|is_warmup|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "\n", + "## tick - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|previous_phase|calculated|event_type, second||\n", + "|second_since_previous_phase|calculated|second||\n", + "\n", + "## weapon_action - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|event_type|replay|||\n", + "|player_id|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n", + "## weapon_fire - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|player_id_pawn|replay|||\n", + "|weapon_name|replay|||\n", + "|is_silenced|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "|missed_molotov|calculated|event_type-molotov_state, second-molotov_state||\n", + "\n", + "## item_remove - \n", + "\n", + "|round|replay|||\n", + "|tick|replay|||\n", + "|player_id|replay|||\n", + "|item|replay|||\n", + "|def_index|replay|||\n", + "|second|calculated|tick, tick_rate||\n", + "|player_id_fixed|merged||player_id, round, steam_id|\n", + "|player_x_pos|merged||player_id, tick|\n", + "|player_y_pos|merged||player_id, tick|\n", + "|player_z_pos|merged||player_id, tick|\n", + "|player_x_vel|merged||player_id, tick|\n", + "|player_y_vel|merged||player_id, tick|\n", + "|player_z_vel|merged||player_id, tick|\n", + "|player_phi_ang|merged||player_id, tick|\n", + "|player_theta_ang|merged||player_id, tick|\n", + "|player_weapon_code|merged||player_id, tick|\n", + "|player_team_code|merged||player_id, tick|\n", + "|player_tick|merged||player_id, tick|\n", + "|player_player_id|merged||player_id, tick|\n", + "\n" + ] + } + ], + "source": [ + "for channel in channels:\n", + " print(\"## \"+channel['channel']+' - ')\n", + " print()\n", + " for column in channel['columns']:\n", + " print_row(column)\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "7ee5100b-8432-4e23-956c-60e9270e2a68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'.'.join([])\n", + "# Events that trigger this channel: bomb_abort_plant, bomb_begin_plant, bomb_dropped, bomb_pickup, player_given_c4\n", + "\n", + "# | Col Name | Origin | Dependents | Merge Keys |\n", + "# | ------------------ | ---------- | --------------- | -------------------------- |\n", + "# | round | replay | none | none |\n", + "# | tick | replay | none | none |\n", + "# | event_type | replay | none | none |\n", + "# | player_id | replay | none | none |\n", + "# | site_code | replay | none | none |\n", + "# | entity_id | replay | none | none |\n", + "# | second | calculated | tick, tick_rate | none |\n", + "# | player_id_fixed | merged | none | player_id, round, steam_id |\n", + "# | player_x_pos | merged | none | player_id, tick |\n", + "# | player_y_pos | merged | none | player_id, tick |\n", + "# | player_z_pos | merged | none | player_id, tick |\n", + "# | player_x_vel | merged | none | player_id, tick |\n", + "# | player_y_vel | merged | none | player_id, tick |\n", + "# | player_z_vel | merged | none | player_id, tick |\n", + "# | player_phi_ang | merged | none | player_id, tick |\n", + "# | player_theta_ang | merged | none | player_id, tick |\n", + "# | player_weapon_code | merged | none | player_id, tick |\n", + "# | player_team_code | merged | none | player_id, tick |\n", + "# | player_tick | merged | none | player_id, tick |\n", + "# | player_player_id | merged | none | player_id, tick |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf351e7d-32bc-4899-a8b5-ffd04d589844", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/datascience/adx/cs2/csds/csds b/docs/datascience/adx/cs2/csds/csds new file mode 100644 index 0000000000000000000000000000000000000000..91ec364d2691ec80b9e5b694f7347d28fef0ac1a GIT binary patch literal 4496 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 ivOBku2fBqkjMc~J6LjeG{2ibW5 literal 0 HcmV?d00001