From 248ad8b09907b4a75b5c19e1059893d6db6cef3a Mon Sep 17 00:00:00 2001 From: Ryan Brideau Date: Thu, 28 Jul 2016 13:20:28 -0300 Subject: [PATCH] Added pokemon_info table --- DateTimeDimensionGenerator.ipynb | 133 ++++++++++++++++++++++++--- README.md | 12 ++- pokemon_go_db_backup.tar | Bin 67422 -> 70475 bytes pokemon_info.csv | 152 +++++++++++++++++++++++++++++++ pokemon_info_table_patch.tar | Bin 0 -> 16384 bytes 5 files changed, 282 insertions(+), 15 deletions(-) create mode 100644 pokemon_info.csv create mode 100644 pokemon_info_table_patch.tar diff --git a/DateTimeDimensionGenerator.ipynb b/DateTimeDimensionGenerator.ipynb index c5cf5fb..1e45358 100644 --- a/DateTimeDimensionGenerator.ipynb +++ b/DateTimeDimensionGenerator.ipynb @@ -30,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 86, "metadata": { "collapsed": false }, @@ -39,14 +39,42 @@ "name": "stdout", "output_type": "stream", "text": [ - "········\n" + "Host Address: 159.203.20.161\n" ] } ], "source": [ - "host = \"ec2-52-87-185-170.compute-1.amazonaws.com\"\n", + "host = raw_input(\"Host Address: \")" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ "db_name = \"pokemon_go\"\n", - "username = \"pokemon_go_role\"\n", + "username = \"postgres\"" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "········\n" + ] + } + ], + "source": [ "password = getpass.getpass()" ] }, @@ -732,7 +760,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 78, "metadata": { "collapsed": false }, @@ -2308,7 +2336,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 93, "metadata": { "collapsed": false }, @@ -2352,7 +2380,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 94, "metadata": { "collapsed": false }, @@ -2366,7 +2394,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 81, "metadata": { "collapsed": true }, @@ -2383,7 +2411,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 82, "metadata": { "collapsed": true }, @@ -2424,6 +2452,34 @@ "date_dim_file" ] }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'date_dim_file' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mautocommit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mload_file\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtable_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'date_dimension'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprimary_key\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"date_key\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile_object\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdate_dim_file\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'date_dim_file' is not defined" + ] + } + ], + "source": [ + "conn = psycopg2.connect(connection_string)\n", + "conn.autocommit = True\n", + "try:\n", + " load_file(conn, table_name='date_dimension', primary_key=\"date_key\", file_object=date_dim_file)\n", + "finally:\n", + " conn.close()" + ] + }, { "cell_type": "code", "execution_count": 54, @@ -2449,23 +2505,72 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 92, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'time_dim_file' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mautocommit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mload_file\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtable_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'time_dimension'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprimary_key\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"time_key\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile_object\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtime_dim_file\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'time_dim_file' is not defined" + ] + } + ], "source": [ "conn = psycopg2.connect(connection_string)\n", "conn.autocommit = True\n", "try:\n", - " load_file(conn, table_name='date_dimension', primary_key=\"date_key\", file_object=date_dim_file)\n", + " load_file(conn, table_name='time_dimension', primary_key=\"time_key\", file_object=time_dim_file)\n", "finally:\n", " conn.close()" ] }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 98, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "pokemon_info_df = pd.read_csv(filepath_or_buffer=\"./pokemon_info.csv\")\n", + "empty_pokemon_pk_info = pokemon_info_df.copy()\n", + "empty_pokemon_pk_info = empty_pokemon_pk_info.drop(empty_pokemon_pk_info.index[0:empty_pokemon_pk_info.shape[0]])\n", + "empty_pokemon_pk_info.to_sql(\"pokemon_info\", engine, if_exists=\"replace\", index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pokemon_info_dim_file = open(\"./pokemon_info.csv\")\n", + "pokemon_info_dim_file" + ] + }, + { + "cell_type": "code", + "execution_count": 100, "metadata": { "collapsed": false }, @@ -2474,7 +2579,7 @@ "conn = psycopg2.connect(connection_string)\n", "conn.autocommit = True\n", "try:\n", - " load_file(conn, table_name='time_dimension', primary_key=\"time_key\", file_object=time_dim_file)\n", + " load_file(conn, table_name='pokemon_info', primary_key=\"pokemon_id\", file_object=pokemon_info_dim_file)\n", "finally:\n", " conn.close()" ] diff --git a/README.md b/README.md index da3809d..792535b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,17 @@ A data model for doing geospatial analysis and regular analytics on Pokemon Go d ## Patches -### Jul 27, 2016 ~11PM EDT +### Jul 28, 2016 ~12PM EDT + +I've added a table for doing analysis using various Pokemon properties, such as type, classification, weight and height. To patch an existing database to support this, first drop the existing pokemon_info table from pgAdmin or using: + +```sql +DROP TABLE public.pokemon_info; +``` + +And then use the same Restore feature you used to load the database initially to load the pokemon_into_table_patch.tar file available in the repo. + +### Jul 27, 2016 ~11PM EDT If you loaded the database backup file before this time ([commit bd81308](https://github.com/Brideau/pokelyzer/commit/bd813085e0ce5518ae55e33dcc87241b710fb215)), run the following command to patch your existing database. It fixes an issue with joining tables in Tableau. diff --git a/pokemon_go_db_backup.tar b/pokemon_go_db_backup.tar index 73c35d2a541e73dbf8d17eee9c2dd7ab6d4560f7..f429c062e1d089e96b260954c33ea67c2fc53272 100644 GIT binary patch delta 3870 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 Rji>MC2>UW*fQj#;-rqpR7K;D? diff --git a/pokemon_info.csv b/pokemon_info.csv new file mode 100644 index 0000000..50423c7 --- /dev/null +++ b/pokemon_info.csv @@ -0,0 +1,152 @@ +"pokemon_id","name","classification","type_1","type_2","weight","height" +"1","Bulbasaur","Seed Pokèmon","Grass","Poison","6.9","0.7" +"2","Ivysaur","Seed Pokèmon","Grass","Poison","13.0","1.0" +"3","Venusaur","Seed Pokèmon","Grass","Poison","1.0","2.0" +"4","Charmander","Lizard Pokèmon","Fire","N/A","8.5","0.6" +"5","Charmeleon","Flame Pokèmon","Fire","N/A","19.0","1.1" +"6","Charizard","Flame Pokèmon","Fire","Flying","90.5","1.7" +"7","Squirtle","Tiny Turtle Pokèmon","Water","N/A","9.0","0.5" +"8","Wartortle","Turtle Pokèmon","Water","N/A","22.5","1.0" +"9","Blastoise","Shellfish Pokèmon","Water","N/A","85.5","1.6" +"10","Caterpie","Worm Pokèmon","Bug","N/A","2.9","0.3" +"11","Metapod","Cocoon Pokèmon","Bug","N/A","9.9","0.7" +"12","Butterfree","Butterfly Pokèmon","Bug","Flying","32.0","1.1" +"13","Weedle","Hairy Pokèmon","Bug","Poison","3.2","0.3" +"14","Kakuna","Cocoon Pokèmon","Bug","Poison","10.0","0.6" +"15","Beedrill","Poison Bee Pokèmon","Bug","Poison","29.5","1.0" +"16","Pidgey","Tiny Bird Pokèmon","Normal","Flying","1.8","0.3" +"17","Pidgeotto","Bird Pokèmon","Normal","Flying","30.0","1.1" +"18","Pidgeot","Bird Pokèmon","Normal","Flying","39.5","1.5" +"19","Rattata","Mouse Pokèmon","Normal","N/A","3.5","0.3" +"20","Raticate","Mouse Pokèmon","Normal","N/A","18.5","0.7" +"21","Spearow","Tiny Bird Pokèmon","Normal","Flying","2.0","0.3" +"22","Fearow","Beak Pokèmon","Normal","Flying","38.0","1.2" +"23","Ekans","Snake Pokèmon","Poison","N/A","6.9","2.0" +"24","Arbok","Cobra Pokèmon","Poison","N/A","65.0","3.5" +"25","Pikachu","Mouse Pokèmon","Electric","N/A","6.0","0.4" +"26","Raichu","Mouse Pokèmon","Electric","N/A","30.0","0.8" +"27","Sandshrew","Mouse Pokèmon","Ground","N/A","12.0","0.6" +"28","Sandslash","Mouse Pokèmon","Ground","N/A","29.5","1.0" +"29","Nidoran F","Poison Pin Pokèmon","Poison","N/A","7.0","0.4" +"30","Nidorina","Poison Pin Pokèmon","Poison","N/A","20.0","0.8" +"31","Nidoqueen","Drill Pokèmon","Poison","Ground","60.0","1.3" +"32","Nidoran M","Poison Pin Pokèmon","Poison","N/A","9.0","0.5" +"33","Nidorino","Poison Pin Pokèmon","Poison","N/A","19.5","0.9" +"34","Nidoking","Drill Pokèmon","Poison","Ground","62.0","1.4" +"35","Clefairy","Fairy Pokèmon","Normal","N/A","7.5","0.6" +"36","Clefable","Fairy Pokèmon","Normal","N/A","40.0","1.3" +"37","Vulpix","Fox Pokèmon","Fire","N/A","9.9","0.6" +"38","Ninetales","Fox Pokèmon","Fire","N/A","19.9","1.1" +"39","Jigglypuff","Balloon Pokèmon","Normal","N/A","5.5","0.5" +"40","Wigglytuff","Balloon Pokèmon","Normal","N/A","12.0","1.0" +"41","Zubat","Bat Pokèmon","Poison","Flying","7.5","0.8" +"42","Golbat","Bat Pokèmon","Poison","Flying","55.0","1.6" +"43","Oddish","Weed Pokèmon","Grass","Poison","5.4","0.5" +"44","Gloom","Weed Pokèmon","Grass","Poison","8.6","0.8" +"45","Vileplume","Flower Pokèmon","Grass","Poison","18.6","1.2" +"46","Paras","Mushroom Pokèmon","Bug","Grass","5.4","0.3" +"47","Parasect","Mushroom Pokèmon","Bug","Grass","29.5","1.0" +"48","Venonat","Insect Pokèmon","Bug","Poison","30.0","1.0" +"49","Venomoth","Poison Moth Pokèmon","Bug","Poison","12.5","1.5" +"50","Diglett","Mole Pokèmon","Ground","N/A","0.8","0.2" +"51","Dugtrio","Mole Pokèmon","Ground","N/A","33.3","0.7" +"52","Meowth","Scratch Cat Pokèmon","Normal","N/A","4.2","0.4" +"53","Persian","Classy Cat Pokèmon","Normal","N/A","32.0","1.0" +"54","Psyduck","Duck Pokèmon","Water","N/A","19.6","0.8" +"55","Golduck","Duck Pokèmon","Water","N/A","76.6","1.7" +"56","Mankey","Pig Monkey Pokèmon","Fighting","N/A","28.0","0.5" +"57","Primeape","Pig Monkey Pokèmon","Fighting","N/A","32.0","1.0" +"58","Growlithe","Puppy Pokèmon","Fire","N/A","19.0","0.7" +"59","Arcanine","Legendary Pokèmon","Fire","N/A","155.0","1.9" +"60","Poliwag","Tadpole Pokèmon","Water","N/A","12.4","0.6" +"61","Poliwhirl","Tadpole Pokèmon","Water","N/A","20.0","1.0" +"62","Poliwrath","Tadpole Pokèmon","Water","Fighting","54.0","1.3" +"63","Abra","Psi Pokèmon","Psychic","N/A","19.5","0.9" +"64","Kadabra","Psi Pokèmon","Psychic","N/A","56.5","1.3" +"65","Alakazam","Psi Pokèmon","Psychic","N/A","48.0","1.5" +"66","Machop","Superpower Pokèmon","Fighting","N/A","19.5","0.8" +"67","Machoke","Superpower Pokèmon","Fighting","N/A","70.5","1.5" +"68","Machamp","Superpower Pokèmon","Fighting","N/A","130.0","1.6" +"69","Bellsprout","Flower Pokèmon","Grass","Poison","4.0","0.7" +"70","Weepinbell","Flycatcher Pokèmon","Grass","Poison","6.4","1.0" +"71","Victreebel","Flycatcher Pokèmon","Grass","Poison","15.5","1.7" +"72","Tentacool","Jellyfish Pokèmon","Water","Poison","45.5","0.9" +"73","Tentacruel","Jellyfish Pokèmon","Water","Poison","55.0","1.6" +"74","Geodude","Rock Pokèmon","Rock","Ground","20.0","0.4" +"75","Graveler","Rock Pokèmon","Rock","Ground","105.0","1.0" +"76","Golem","Megaton Pokèmon","Rock","Ground","300.0","1.4" +"77","Ponyta","Fire Horse Pokèmon","Fire","N/A","30.0","1.0" +"78","Rapidash","Fire Horse Pokèmon","Fire","N/A","95.0","1.7" +"79","Slowpoke","Dopey Pokèmon","Water","Psychic","36.0","1.2" +"80","Slowbro","Hermit Crab Pokèmon","Water","Psychic","78.5","1.6" +"81","Magnemite","Magnet Pokèmon","Electric","Steel","6.0","0.3" +"82","Magneton","Magnet Pokèmon","Electric","Steel","60.0","1.0" +"83","Farfetch'd","Wild Duck Pokèmon","Normal","Flying","15.0","0.8" +"84","Doduo","Twin Bird Pokèmon","Normal","Flying","39.2","1.4" +"85","Dodrio","Triple Bird Pokèmon","Normal","Flying","85.2","1.8" +"86","Seel","Sea Lion Pokèmon","Water","N/A","90.0","1.1" +"87","Dewgong","Sea Lion Pokèmon","Water","Ice","120.0","1.7" +"88","Grimer","Sludge Pokèmon","Poison","N/A","30.0","0.9" +"89","Muk","Sludge Pokèmon","Poison","N/A","30.0","1.2" +"90","Shellder","Bivalve Pokèmon","Water","N/A","4.0","0.3" +"91","Cloyster","Bivalve Pokèmon","Water","Ice","132.5","1.5" +"92","Gastly","Gas Pokèmon","Ghost","Poison","0.1","1.3" +"93","Haunter","Gas Pokèmon","Ghost","Poison","0.1","1.6" +"94","Gengar","Shadow Pokèmon","Ghost","Poison","40.5","1.5" +"95","Onix","Rock Snake Pokèmon","Rock","Ground","210.0","8.8" +"96","Drowzee","Hypnosis Pokèmon","Psychic","N/A","32.4","1.0" +"97","Hypno","Hypnosis Pokèmon","Psychic","N/A","75.6","1.6" +"98","Krabby","River Crab Pokèmon","Water","N/A","6.5","0.4" +"99","Kingler","Pincer Pokèmon","Water","N/A","60.0","1.3" +"100","Voltorb","Ball Pokèmon","Electric","N/A","10.4","0.5" +"101","Electrode","Ball Pokèmon","Electric","N/A","66.6","1.2" +"102","Exeggcute","Egg Pokèmon","Grass","Psychic","2.5","0.4" +"103","Exeggutor","Coconut Pokèmon","Grass","Psychic","120.0","2.0" +"104","Cubone","Lonely Pokèmon","Ground","N/A","6.5","0.4" +"105","Marowak","Bone Keeper Pokèmon","Ground","N/A","45.0","1.0" +"106","Hitmonlee","Kicking Pokèmon","Fighting","N/A","49.8","1.5" +"107","Hitmonchan","Punching Pokèmon","Fighting","N/A","50.2","1.4" +"108","Lickitung","Licking Pokèmon","Normal","N/A","65.5","1.2" +"109","Koffing","Poison Gas Pokèmon","Poison","N/A","1.0","0.6" +"110","Weezing","Poison Gas Pokèmon","Poison","N/A","9.5","1.2" +"111","Rhyhorn","Spikes Pokèmon","Ground","Rock","115.0","1.0" +"112","Rhydon","Drill Pokèmon","Ground","Rock","120.0","1.9" +"113","Chansey","Egg Pokèmon","Normal","N/A","34.6","1.1" +"114","Tangela","Vine Pokèmon","Grass","N/A","35.0","1.0" +"115","Kangaskhan","Parent Pokèmon","Normal","N/A","80.0","2.2" +"116","Horsea","Dragon Pokèmon","Water","N/A","8.0","0.4" +"117","Seadra","Dragon Pokèmon","Water","N/A","25.0","1.2" +"118","Goldeen","Goldfish Pokèmon","Water","N/A","15.0","0.6" +"119","Seaking","Goldfish Pokèmon","Water","N/A","39.0","1.3" +"120","Staryu","Starshape Pokèmon","Water","N/A","34.5","0.8" +"121","Starmie","Mysterious Pokèmon","Water","Psychic","80.0","1.1" +"122","Mr. Mime","Barrier Pokèmon","Psychic","N/A","54.5","1.3" +"123","Scyther","Mantis Pokèmon","Bug","Flying","56.0","1.5" +"124","Jynx","Humanshape Pokèmon","Ice","Psychic","40.6","1.4" +"125","Electabuzz","Electric Pokèmon","Electric","N/A","30.0","1.1" +"126","Magmar","Spitfire Pokèmon","Fire","N/A","44.5","1.3" +"127","Pinsir","Stagbeetle Pokèmon","Bug","N/A","55.0","1.5" +"128","Tauros","Wild Bull Pokèmon","Normal","N/A","88.4","1.4" +"129","Magikarp","Fish Pokèmon","Water","N/A","10.0","0.9" +"130","Gyarados","Atrocious Pokèmon","Water","Flying","235.0","6.5" +"131","Lapras","Transport Pokèmon","Water","Ice","220.0","2.5" +"132","Ditto","Transform Pokèmon","Normal","N/A","4.0","0.3" +"133","Eevee","Evolution Pokèmon","Normal","N/A","6.5","0.3" +"134","Vaporeon","Bubble Jet Pokèmon","Water","N/A","29.0","1.0" +"135","Jolteon","Lightning Pokèmon","Electric","N/A","24.5","0.8" +"136","Flareon","Flame Pokèmon","Fire","N/A","25.0","0.9" +"137","Porygon","Virtual Pokèmon","Normal","N/A","36.5","0.8" +"138","Omanyte","Spiral Pokèmon","Rock","Water","7.5","0.4" +"139","Omastar","Spiral Pokèmon","Rock","Water","35.0","1.0" +"140","Kabuto","Shellfish Pokèmon","Rock","Water","11.5","0.5" +"141","Kabutops","Shellfish Pokèmon","Rock","Water","40.5","1.3" +"142","Aerodactyl","Fossil Pokèmon","Rock","Flying","59.0","1.8" +"143","Snorlax","Sleeping Pokèmon","Normal","N/A","460.0","2.1" +"144","Articuno","Freeze Pokèmon","Ice","Flying","55.4","1.7" +"145","Zapdos","Electric Pokèmon","Electric","Flying","52.6","1.6" +"146","Moltres","Flame Pokèmon","Fire","Flying","60.0","2.0" +"147","Dratini","Dragon Pokèmon","Dragon","N/A","3.3","1.8" +"148","Dragonair","Dragon Pokèmon","Dragon","N/A","16.5","4.0" +"149","Dragonite","Dragon Pokèmon","Dragon","Flying","210.0","2.2" +"150","Mewtwo","Genetic Pokèmon","Psychic","N/A","122.0","2.0" +"151","Mew","New Species Pokèmon","Psychic","N/A","4.0","0.4" diff --git a/pokemon_info_table_patch.tar b/pokemon_info_table_patch.tar new file mode 100644 index 0000000000000000000000000000000000000000..b9e0a0d45d823b92233a59d68b3d0fd05a375457 GIT binary patch literal 16384 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 literal 0 HcmV?d00001