Pokemon - Stärken und Schwächen

In diesem kleinen Projekt werden die Typen der Pokemon mit ihren Stärken, Schwächen und Immunitäten verbunden. Der Sinn dahiner ist es beispielsweise ein Pokemon zu nennen und dessen Informationen zu erhalten. Aber auch die Eingabe des eigenen Pokemon-Teams soll erfolgen, um zu prüfen, gegen welche Typen das Team im Kampf nicht gewappnet ist. Daraufhin hat man die Möglichkeit sein Team zu prüfen oder gar zu ändern.

Folgende Daten wurden dafür verwendet:

- RDF Daten: Pokemon & Attribute
https://triplydb.com/academy/pokemon
- JSON Datei (sonstiges Format): Pokemontypen
https://github.com/filipekiss/pokemon-type-chart/blob/master/types.json

Pokemon RDD Dateien

Zuerst wird, wie im Unterricht gelernt, der SparqlWrapper importiert.

In [1]:
from SPARQLWrapper import SPARQLWrapper, JSON, CSV

Die ersten Versuche mit DBpedia waren eher erfolglos. Es gab zwar ein paar Pokemon, leider aber unter verschiedenen Bezeichnungen und es gab keine Typen der Pokemon, weshalb ich mich auf die Suche nach einer neuen RDF Quelle gemacht habe. Fündig wurde ich hier: https://triplydb.com/academy/pokemon

Diese Datenbank enthaltet gefühlt alle Pokemon, deren Typen und viele weitere Attribute, wie die male/female ratio, rareness, cry als link zum audio file, etc.

In [2]:
sparql = SPARQLWrapper("https://triplydb.com/academy/pokemon/sparql/pokemon")

Nun erfolgt die SparQL query. Hier werden die RDF Daten aus der Datenbank gezogen. Die Prefixe pokemon und type sind auch sehr praktisch, habe ich aber für die Abfrage nicht benötigt. Mit vocab lässt sich dagegen alle gewünschten Pokemon abfragen.

Die NationalNumber, der Pokemon Name auf Deutsch, der Typ, aber auch die Seltenheit des Pokemons werden hier abgefragt.

In [3]:
sparql.setQuery("""
    PREFIX pokemon: <https://triplydb.com/academy/pokemon/id/pokemon/>
    PREFIX type: <https://triplydb.com/academy/pokemon/id/type/>
    PREFIX vocab: <https://triplydb.com/academy/pokemon/vocab/>
    
select distinct ?nationalNumber (LCASE(?name) As ?name) (Strafter(Str(?type), "type/") As ?type) ?rareness 
where {
  ?pokemon vocab:nationalNumber ?nationalNumber .
  ?pokemon vocab:name ?name .
  filter(lang(?name) = 'de-de') .
  ?pokemon vocab:rareness ?rareness .
  ?pokemon vocab:type ?type .
  
}
LIMIT 300

""")
sparql.setReturnFormat(JSON)
poke = sparql.query().convert()

for res in poke["results"]["bindings"]:
    print(res["nationalNumber"]["value"], res["name"]["value"], res["type"]["value"], res["rareness"]["value"])
460 rexblisar grass 60
460 rexblisar ice 60
63 abra psychic 200
359 absol dark 30
142 aerodactyl flying 45
142 aerodactyl rock 45
306 stolloss rock 45
306 stolloss steel 45
190 griffel normal 45
65 simsala psychic 50
334 altaria dragon 45
334 altaria flying 45
424 ambidiffel normal 45
181 ampharos electric 45
347 anorith bug 45
347 anorith rock 45
24 arbok poison 90
59 arkani fire 75
493 arceus normal 3
168 ariados bug 90
168 ariados poison 90
348 armaldo bug 45
348 armaldo rock 45
304 stollunior rock 180
304 stollunior steel 180
144 arktos flying 3
144 arktos ice 3
482 tobutz psychic 3
184 azumarill water 75
298 azurill normal 150
371 kindwurm dragon 45
343 puppance ground 255
343 puppance psychic 255
354 banette ghost 45
339 schmerbe ground 190
339 schmerbe water 190
411 bollterus rock 45
411 bollterus steel 45
153 lorblatt grass 45
267 papinella bug 45
267 papinella flying 45
15 bibor bug 45
15 bibor poison 45
374 tanhel psychic 3
374 tanhel steel 3
182 blubella grass 45
69 knofensa grass 255
69 knofensa poison 255
400 bidifas normal 127
400 bidifas water 127
399 bidiza normal 255
9 turtok water 45
257 lohgock fighting 45
257 lohgock fire 45
242 heiteira normal 30
438 mobai rock 255
286 kapilz fighting 90
286 kapilz grass 90
437 bronzong psychic 90
437 bronzong steel 90
436 bronzel psychic 255
436 bronzel steel 255
406 knospi grass 255
406 knospi poison 255
418 bamelin water 190
1 bisasam grass 45
1 bisasam poison 45
427 haspiror normal 190
412 burmy bug 120
12 smettbo bug 45
12 smettbo flying 45
331 tuska grass 190
332 noktuska dark 60
332 noktuska grass 60
323 camerupt fire 150
323 camerupt ground 150
455 venuflibis grass 200
318 kanivanha dark 225
318 kanivanha water 225
268 panekon bug 120
351 formeo normal 45
10 raupy bug 255
251 celebi grass 45
251 celebi psychic 45
113 chaneira normal 30
6 glurak fire 45
6 glurak flying 45
4 glumanda fire 45
5 glutexo fire 45
441 plaudagei flying 30
441 plaudagei normal 30
421 kinoso grass 75
420 kikugi grass 190
152 endivie grass 45
390 panflam fire 45
358 palimpalim psychic 45
170 lampi electric 190
170 lampi water 190
433 klingplim psychic 120
366 perlu water 255
344 lepumentas ground 90
344 lepumentas psychic 90
36 pixi normal 25
35 piepi normal 150
173 pii normal 150
91 austos ice 60
91 austos water 60
415 wadribie bug 120
415 wadribie flying 120
256 jungglut fighting 45
256 jungglut fire 45
341 krebscorps water 205
222 corasonn rock 60
222 corasonn water 60
346 wielie grass 45
346 wielie rock 45
408 koknodon rock 45
342 krebutack dark 155
342 krebutack water 155
488 cresselia psychic 3
453 glibunkel fighting 140
453 glibunkel poison 140
169 iksbat flying 90
169 iksbat poison 90
159 tyracroc water 45
104 tragosso ground 190
155 feurigel fire 45
491 darkrai dark 3
301 enekoro normal 60
225 botogel flying 45
225 botogel ice 45
386 deoxys psychic 3
87 jugong ice 75
87 jugong water 75
483 dialga dragon 30
483 dialga steel 30
50 digda ground 255
132 ditto normal 35
85 dodri flying 45
85 dodri normal 45
84 dodu flying 190
84 dodu normal 190
232 donphan ground 60
148 dragonir dragon 45
149 dragoran dragon 45
149 dragoran flying 45
452 piondragi dark 45
452 piondragi poison 45
147 dratini dragon 45
426 drifzepeli flying 60
426 drifzepeli ghost 60
425 driftlon flying 125
425 driftlon ghost 125
96 traumato psychic 190
51 digdri ground 50
206 dummisel normal 190
356 zwirrklop ghost 90
477 zwirrfinst ghost 45
355 zwirrlicht ghost 190
269 pudox bug 45
269 pudox poison 45
133 evoli normal 45
23 rettan poison 255
125 elektek electric 45
466 elevoltek electric 30
309 frizelbliz electric 120
101 lektrobal electric 60
239 elekid electric 45
395 impoleon steel 45
395 impoleon water 45
244 entei fire 3
196 psiana psychic 45
102 owei grass 90
102 owei psychic 90
103 kokowei grass 45
103 kokowei psychic 45
295 krawumms normal 45
83 porenta flying 45
83 porenta normal 45
22 ibitak flying 90
22 ibitak normal 90
349 barschwa water 255
160 impergator water 45
456 finneon water 190
180 waaty electric 120
136 flamara fire 45
419 bojelin water 75
330 libelldra dragon 45
330 libelldra ground 45
205 forstellka bug 75
205 forstellka steel 75
478 frosdedje ghost 75
478 frosdedje ice 75
162 wiesenior normal 90
444 knarksel dragon 45
444 knarksel ground 45
475 galagladi fighting 45
475 galagladi psychic 45
445 knakrack dragon 45
445 knakrack ground 45
282 guardevoir psychic 45
92 nebulak ghost 190
92 nebulak poison 190
423 gastrodon ground 75
423 gastrodon water 75
94 gengar ghost 45
94 gengar poison 45
74 kleinstein ground 255
74 kleinstein rock 255
443 kaumalat dragon 45
443 kaumalat ground 45
203 girafarig normal 60
203 girafarig psychic 60
487 giratina dragon 3
487 giratina ghost 3
471 glaziola ice 45
362 firnontor ice 75
431 charmian normal 190
207 skorgla flying 60
207 skorgla ground 60
472 skorgro flying 30
472 skorgro ground 30
44 duflor grass 120
44 duflor poison 120
42 golbat flying 90
42 golbat poison 90
118 goldini water 225
55 entoron water 75
76 geowaz ground 45
76 geowaz rock 45
368 saganabyss water 60
210 granbull normal 75
75 georok ground 120
75 georok rock 120
88 sleima poison 190
388 chelcarain grass 45
383 groudon ground 5
253 reptain grass 45
58 fukano fire 190
326 groink psychic 60
316 schluppuck poison 225
130 garados flying 45
130 garados water 45
440 wonneira normal 130
297 hariyama fighting 200
93 alpollo ghost 90
93 alpollo poison 90
485 heatran fire 3
485 heatran steel 3
214 skaraborn bug 45
214 skaraborn fighting 45
449 hippopotas ground 140
450 hippoterus ground 60
107 nockchan fighting 45
106 kicklee fighting 45
237 kapoera fighting 45
250 ho-oh fire 3
250 ho-oh flying 3
430 kramshef dark 30
430 kramshef flying 30
163 hoothoot flying 255
163 hoothoot normal 255
187 hoppspross flying 255
187 hoppspross grass 255
116 seeper water 225
229 hundemon dark 45
229 hundemon fire 45
228 hunduster dark 120
228 hunduster fire 120
367 aalabyss water 60
97 hypno psychic 75
174 fluffeluff normal 170
314 illumise bug 150
392 panferno fighting 45
392 panferno fire 45
2 bisaknosp grass 45
2 bisaknosp poison 45
39 pummeluff normal 170
385 jirachi psychic 3
385 jirachi steel 3
135 blitza electric 45
189 papungha flying 45
189 papungha grass 45
124 rossana ice 45
124 rossana psychic 45
140 kabuto rock 45
140 kabuto water 45
141 kabutops rock 45
141 kabutops water 45
64 kadabra psychic 100
14 kokuna bug 120
14 kokuna poison 120
115 kangama normal 45
352 kecleon normal 200
230 seedraking dragon 45
230 seedraking water 45
99 kingler water 60
281 kirlia psychic 120
109 smogon poison 190
98 krabby water 225

Wie man sieht hat alles ganz gut funktioniert. Der einzige Mangel ist, dass ein Pokemon mit zwei verschiedenen Typen auf zwei Zeilen aufgeteilt wird. Dies ist jedoch nicht weiter schlimm, da dies als Und-Logig zu verstehen ist, also ein Pokemon hat sowohl die Stärken/Schwächen des ersten Typen, aber auch des Zweiten.

Pokemon-Typen

In Github (https://github.com/filipekiss/pokemon-type-chart/blob/master/types.json) konnte ich eine ideale Tabelle finden, die alle existierenden Typen, sowie deren Immunitäten, Stärken und Schwächen beinhaltet. Diese wird natürlich automatisch gedownloadet. Das bedeutet aber auch, dass wenn dieser Github-Beitrag gelöscht werden sollte, auch dieses Notebook nicht mehr funktioniert.

In [4]:
import requests

r = requests.get('https://raw.githubusercontent.com/filipekiss/pokemon-type-chart/master/types.json')

f = open('pokemontypes.json', 'wb')
f.write(r.content)
f.close()

Nun wird eine neue Datenbank namens "poke" erstellt und die Verbindung hergestellt.

In [5]:
%load_ext sql
%sql sqlite:///poke.db
import sqlite3 
import pandas as pd
conn = sqlite3.connect('poke.db') 

Der Table "poketypes", welcher die Typen der Pokemon enthält, wird gedroppt, falls vorhanden.

In [6]:
%%sql

drop table if exists poketypes;
 * sqlite:///poke.db
Done.
Out[6]:
[]

Hier wird ein Pandas Dataframe mit den erstellt, bearbeitet und befüllt. Zuerst wird eine Spalte passend umbenannt, die Spalten-Typen werden zu "str", um eine weitere Bearbeitung zu ermöglichen und nicht benötigte Zeichen werden gelöscht.

In [7]:
df = pd.read_json('pokemontypes.json')
df=df.rename(columns = {'name':'types'})
df['types']= df['types'].astype('str')
df['immunes']= df['immunes'].astype('str').str.strip('[]')
df['weaknesses']= df['weaknesses'].astype('str').str.strip('[]')
df['strengths']= df['strengths'].astype('str').str.strip('[]')
df.replace(r"'", value="", inplace=True, regex=True)
#df.sort_values(['types']) - kann auch in SQL erfolgen

df.to_sql('poketypes', con=conn, index = False)

Nun wird geprüft, ob der Code von oben funktioniert hat. Siehe da - eine passende Tabelle wird ausgegeben, geordnet nach "types".

In [8]:
%%sql

select * from poketypes
order by types;
 * sqlite:///poke.db
Done.
Out[8]:
types immunes weaknesses strengths
Bug Fire, Fighting, Poison, Flying, Ghost, Steel, Fairy Grass, Psychic, Dark
Dark Fighting, Dark, Fairy Psychic, Ghost
Dragon Fairy Steel Dragon
Electric Ground Electric, Grass, Dragon Water, Flying
Fairy Fire, Poison, Steel Fighting, Dragon, Dark
Fighting Ghost Poison, Flying, Psychic, Bug, Fairy Normal, Ice, Rock, Dark, Steel
Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
Flying Electric, Rock, Steel Grass, Fighting, Bug
Ghost Normal Dark Psychic, Ghost
Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
Normal Ghost Rock, Steel
Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
Psychic Dark Psychic, Steel Fighting, Poison
Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
Water Water, Grass, Dragon Fire, Ground, Rock

Liste der Pokemon

Hier wird nun die Pokemon Liste als CSV geschrieben.

In [9]:
f = open("pokemontypes.json", "w")
f.write("nationalNumber;name;type;rareness\n")
for res in poke["results"]["bindings"]:
    f.write(res["nationalNumber"]["value"] +";"+ res["name"]["value"] +";"+ res["type"]["value"] +";"+ res["rareness"]["value"] +"\n")
f.close()

Der Table poke, welcher die Liste der Pokemon enthält, wird gedroppt, falls schon vorhanden.

In [10]:
%%sql

drop table if exists poke;
 * sqlite:///poke.db
Done.
Out[10]:
[]

Die vorhin erstellte csv Datei wird nun wieder eingelesen. Um später die Tabels miteinander verbinden zu können, werden die Spalten-Typen name und type zum Format "str" konvertiert, aber auch die ersten Buchstaben als Großbuchstaben dargestellt. Die hätte auch in SQL erfolgen können, was sich aber als ein Mehraufwand herausgestellt hat.

In [11]:
tdf = pd.read_csv('pokemontypes.json', delimiter=";")
tdf['name']= tdf['name'].astype('str').str.capitalize()
tdf['type']= tdf['type'].astype('str').str.capitalize()

tdf.to_sql('poke', conn, index = False)

Nun wird überprüft, ob der Tabel nun befüllt ist. Das hat ebenfalls geklappt!

In [12]:
%%sql

select * from poke limit 10;
 * sqlite:///poke.db
Done.
Out[12]:
nationalNumber name type rareness
460 Rexblisar Grass 60
460 Rexblisar Ice 60
63 Abra Psychic 200
359 Absol Dark 30
142 Aerodactyl Flying 45
142 Aerodactyl Rock 45
306 Stolloss Rock 45
306 Stolloss Steel 45
190 Griffel Normal 45
65 Simsala Psychic 50

Verbinden der Tabellen

Nun wird die Key-Spalte type verwendet, um die beiden Tabellen zu joinen/mergen. Nun erhalten wir einen Output, der uns zeigt, welche Immunitäten, Stärken und Schwächen ein Pokemon hat.

Somit können wir auch herausfinden, welches Pokemon gegen welchen Typ eine bessere Chance im Kampf hat. (Dies kommt natürlich auch auf deren verwendeten Attaken an, aber der Pokemon Typ sagt darüber natürlich viel aus.)

In [13]:
%%sql

select nationalNumber, name, type, immunes, weaknesses, strengths
from poke join poketypes on poke.type = poketypes.types 
order by name
limit 200;
 * sqlite:///poke.db
Done.
Out[13]:
nationalNumber name type immunes weaknesses strengths
367 Aalabyss Water Water, Grass, Dragon Fire, Ground, Rock
63 Abra Psychic Dark Psychic, Steel Fighting, Poison
359 Absol Dark Fighting, Dark, Fairy Psychic, Ghost
142 Aerodactyl Flying Electric, Rock, Steel Grass, Fighting, Bug
142 Aerodactyl Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
93 Alpollo Ghost Normal Dark Psychic, Ghost
93 Alpollo Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
334 Altaria Dragon Fairy Steel Dragon
334 Altaria Flying Electric, Rock, Steel Grass, Fighting, Bug
424 Ambidiffel Normal Ghost Rock, Steel
181 Ampharos Electric Ground Electric, Grass, Dragon Water, Flying
347 Anorith Bug Fire, Fighting, Poison, Flying, Ghost, Steel, Fairy Grass, Psychic, Dark
347 Anorith Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
24 Arbok Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
493 Arceus Normal Ghost Rock, Steel
168 Ariados Bug Fire, Fighting, Poison, Flying, Ghost, Steel, Fairy Grass, Psychic, Dark
168 Ariados Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
59 Arkani Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
144 Arktos Flying Electric, Rock, Steel Grass, Fighting, Bug
144 Arktos Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
348 Armaldo Bug Fire, Fighting, Poison, Flying, Ghost, Steel, Fairy Grass, Psychic, Dark
348 Armaldo Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
91 Austos Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
91 Austos Water Water, Grass, Dragon Fire, Ground, Rock
184 Azumarill Water Water, Grass, Dragon Fire, Ground, Rock
298 Azurill Normal Ghost Rock, Steel
418 Bamelin Water Water, Grass, Dragon Fire, Ground, Rock
354 Banette Ghost Normal Dark Psychic, Ghost
349 Barschwa Water Water, Grass, Dragon Fire, Ground, Rock
15 Bibor Bug Fire, Fighting, Poison, Flying, Ghost, Steel, Fairy Grass, Psychic, Dark
15 Bibor Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
400 Bidifas Normal Ghost Rock, Steel
400 Bidifas Water Water, Grass, Dragon Fire, Ground, Rock
399 Bidiza Normal Ghost Rock, Steel
2 Bisaknosp Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
2 Bisaknosp Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
1 Bisasam Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
1 Bisasam Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
135 Blitza Electric Ground Electric, Grass, Dragon Water, Flying
182 Blubella Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
419 Bojelin Water Water, Grass, Dragon Fire, Ground, Rock
411 Bollterus Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
411 Bollterus Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
225 Botogel Flying Electric, Rock, Steel Grass, Fighting, Bug
225 Botogel Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
436 Bronzel Psychic Dark Psychic, Steel Fighting, Poison
436 Bronzel Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
437 Bronzong Psychic Dark Psychic, Steel Fighting, Poison
437 Bronzong Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
412 Burmy Bug Fire, Fighting, Poison, Flying, Ghost, Steel, Fairy Grass, Psychic, Dark
323 Camerupt Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
323 Camerupt Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
251 Celebi Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
251 Celebi Psychic Dark Psychic, Steel Fighting, Poison
113 Chaneira Normal Ghost Rock, Steel
431 Charmian Normal Ghost Rock, Steel
388 Chelcarain Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
222 Corasonn Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
222 Corasonn Water Water, Grass, Dragon Fire, Ground, Rock
488 Cresselia Psychic Dark Psychic, Steel Fighting, Poison
491 Darkrai Dark Fighting, Dark, Fairy Psychic, Ghost
386 Deoxys Psychic Dark Psychic, Steel Fighting, Poison
483 Dialga Dragon Fairy Steel Dragon
483 Dialga Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
50 Digda Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
51 Digdri Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
132 Ditto Normal Ghost Rock, Steel
85 Dodri Flying Electric, Rock, Steel Grass, Fighting, Bug
85 Dodri Normal Ghost Rock, Steel
84 Dodu Flying Electric, Rock, Steel Grass, Fighting, Bug
84 Dodu Normal Ghost Rock, Steel
232 Donphan Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
148 Dragonir Dragon Fairy Steel Dragon
149 Dragoran Dragon Fairy Steel Dragon
149 Dragoran Flying Electric, Rock, Steel Grass, Fighting, Bug
147 Dratini Dragon Fairy Steel Dragon
425 Driftlon Flying Electric, Rock, Steel Grass, Fighting, Bug
425 Driftlon Ghost Normal Dark Psychic, Ghost
426 Drifzepeli Flying Electric, Rock, Steel Grass, Fighting, Bug
426 Drifzepeli Ghost Normal Dark Psychic, Ghost
44 Duflor Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
44 Duflor Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
206 Dummisel Normal Ghost Rock, Steel
239 Elekid Electric Ground Electric, Grass, Dragon Water, Flying
125 Elektek Electric Ground Electric, Grass, Dragon Water, Flying
466 Elevoltek Electric Ground Electric, Grass, Dragon Water, Flying
152 Endivie Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
301 Enekoro Normal Ghost Rock, Steel
244 Entei Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
55 Entoron Water Water, Grass, Dragon Fire, Ground, Rock
133 Evoli Normal Ghost Rock, Steel
155 Feurigel Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
456 Finneon Water Water, Grass, Dragon Fire, Ground, Rock
362 Firnontor Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
136 Flamara Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
174 Fluffeluff Normal Ghost Rock, Steel
351 Formeo Normal Ghost Rock, Steel
205 Forstellka Bug Fire, Fighting, Poison, Flying, Ghost, Steel, Fairy Grass, Psychic, Dark
205 Forstellka Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
309 Frizelbliz Electric Ground Electric, Grass, Dragon Water, Flying
478 Frosdedje Ghost Normal Dark Psychic, Ghost
478 Frosdedje Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
58 Fukano Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
475 Galagladi Fighting Ghost Poison, Flying, Psychic, Bug, Fairy Normal, Ice, Rock, Dark, Steel
475 Galagladi Psychic Dark Psychic, Steel Fighting, Poison
130 Garados Flying Electric, Rock, Steel Grass, Fighting, Bug
130 Garados Water Water, Grass, Dragon Fire, Ground, Rock
423 Gastrodon Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
423 Gastrodon Water Water, Grass, Dragon Fire, Ground, Rock
94 Gengar Ghost Normal Dark Psychic, Ghost
94 Gengar Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
75 Georok Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
75 Georok Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
76 Geowaz Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
76 Geowaz Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
203 Girafarig Normal Ghost Rock, Steel
203 Girafarig Psychic Dark Psychic, Steel Fighting, Poison
487 Giratina Dragon Fairy Steel Dragon
487 Giratina Ghost Normal Dark Psychic, Ghost
471 Glaziola Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
453 Glibunkel Fighting Ghost Poison, Flying, Psychic, Bug, Fairy Normal, Ice, Rock, Dark, Steel
453 Glibunkel Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
4 Glumanda Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
6 Glurak Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
6 Glurak Flying Electric, Rock, Steel Grass, Fighting, Bug
5 Glutexo Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
42 Golbat Flying Electric, Rock, Steel Grass, Fighting, Bug
42 Golbat Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
118 Goldini Water Water, Grass, Dragon Fire, Ground, Rock
210 Granbull Normal Ghost Rock, Steel
190 Griffel Normal Ghost Rock, Steel
326 Groink Psychic Dark Psychic, Steel Fighting, Poison
383 Groudon Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
282 Guardevoir Psychic Dark Psychic, Steel Fighting, Poison
297 Hariyama Fighting Ghost Poison, Flying, Psychic, Bug, Fairy Normal, Ice, Rock, Dark, Steel
427 Haspiror Normal Ghost Rock, Steel
485 Heatran Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
485 Heatran Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
242 Heiteira Normal Ghost Rock, Steel
449 Hippopotas Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
450 Hippoterus Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
250 Ho-oh Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
250 Ho-oh Flying Electric, Rock, Steel Grass, Fighting, Bug
163 Hoothoot Flying Electric, Rock, Steel Grass, Fighting, Bug
163 Hoothoot Normal Ghost Rock, Steel
187 Hoppspross Flying Electric, Rock, Steel Grass, Fighting, Bug
187 Hoppspross Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
229 Hundemon Dark Fighting, Dark, Fairy Psychic, Ghost
229 Hundemon Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
228 Hunduster Dark Fighting, Dark, Fairy Psychic, Ghost
228 Hunduster Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
97 Hypno Psychic Dark Psychic, Steel Fighting, Poison
22 Ibitak Flying Electric, Rock, Steel Grass, Fighting, Bug
22 Ibitak Normal Ghost Rock, Steel
169 Iksbat Flying Electric, Rock, Steel Grass, Fighting, Bug
169 Iksbat Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
314 Illumise Bug Fire, Fighting, Poison, Flying, Ghost, Steel, Fairy Grass, Psychic, Dark
160 Impergator Water Water, Grass, Dragon Fire, Ground, Rock
395 Impoleon Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
395 Impoleon Water Water, Grass, Dragon Fire, Ground, Rock
385 Jirachi Psychic Dark Psychic, Steel Fighting, Poison
385 Jirachi Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
87 Jugong Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
87 Jugong Water Water, Grass, Dragon Fire, Ground, Rock
256 Jungglut Fighting Ghost Poison, Flying, Psychic, Bug, Fairy Normal, Ice, Rock, Dark, Steel
256 Jungglut Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
140 Kabuto Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
140 Kabuto Water Water, Grass, Dragon Fire, Ground, Rock
141 Kabutops Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
141 Kabutops Water Water, Grass, Dragon Fire, Ground, Rock
64 Kadabra Psychic Dark Psychic, Steel Fighting, Poison
115 Kangama Normal Ghost Rock, Steel
318 Kanivanha Dark Fighting, Dark, Fairy Psychic, Ghost
318 Kanivanha Water Water, Grass, Dragon Fire, Ground, Rock
286 Kapilz Fighting Ghost Poison, Flying, Psychic, Bug, Fairy Normal, Ice, Rock, Dark, Steel
286 Kapilz Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
237 Kapoera Fighting Ghost Poison, Flying, Psychic, Bug, Fairy Normal, Ice, Rock, Dark, Steel
443 Kaumalat Dragon Fairy Steel Dragon
443 Kaumalat Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
352 Kecleon Normal Ghost Rock, Steel
106 Kicklee Fighting Ghost Poison, Flying, Psychic, Bug, Fairy Normal, Ice, Rock, Dark, Steel
420 Kikugi Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
371 Kindwurm Dragon Fairy Steel Dragon
99 Kingler Water Water, Grass, Dragon Fire, Ground, Rock
421 Kinoso Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
281 Kirlia Psychic Dark Psychic, Steel Fighting, Poison
74 Kleinstein Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
74 Kleinstein Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
433 Klingplim Psychic Dark Psychic, Steel Fighting, Poison
445 Knakrack Dragon Fairy Steel Dragon
445 Knakrack Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
444 Knarksel Dragon Fairy Steel Dragon
444 Knarksel Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel
69 Knofensa Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
69 Knofensa Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
406 Knospi Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
406 Knospi Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy
408 Koknodon Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
103 Kokowei Grass Fire, Grass, Poison, Flying, Bug, Dragon, Steel Water, Ground, Rock
103 Kokowei Psychic Dark Psychic, Steel Fighting, Poison

SQL Abfragen

Nun da die Arbeit erledigt ist folgen nun noch kleine SQL Abfragen, um die Verbindung der Tabellen einen Sinn zu geben.

Eine view namens pokejoin wird erstellt. Sie hat enthält das Ergebnis der gejointen Tabellen.

In [14]:
%%sql

drop view if exists pokejoin;

create view pokejoin as select nationalNumber, name, type, immunes, weaknesses, strengths
from poke join poketypes on poke.type = poketypes.types ;
 * sqlite:///poke.db
Done.
Done.
Out[14]:
[]

Lieblingspokemon

Hier kann ein Pokemon, vielleicht sogar das eigene Lieblingspokemon, abgefragt werden, um zu sehen, gegen welche Typen man es eher kämfen lassen sollte bzw. einen Kampf versucht zu vermeiden. Falls kein Pokemon gefunden wurde, kann es daran liegen, dass das Limit in der SparQL Abfrage zu niedrig gesetzt wurde. Die Prozentzeichen beim Namen verhindern, dass ein vielleicht eingeschlichenes Leerzeichen die Abfrage ehlschlagen lässt.

In [15]:
%%sql
select * from pokejoin 
where name like '%Libelldra%'
limit 2
 * sqlite:///poke.db
Done.
Out[15]:
nationalNumber name type immunes weaknesses strengths
330 Libelldra Dragon Fairy Steel Dragon
330 Libelldra Ground Flying Grass, Bug Fire, Electric, Poison, Rock, Steel

Typenkontrolle

Wenn man gegen ein Pokemon wie z.B. Libelldra, ein Boden Drachen Pokemon, kämpft, will man wissen welche Pokemon dagegen geeignet sind. Das erledigt diese Abfrage.

Wenn im Code steht: "and" sind die gegebenen Pokemon sehr wahrscheinlich sehr effektiv gegen die eingegebenen Typen. "or" sind diese Pokemon wahrscheinlich nur effektiv.

In [16]:
%%sql
select * from pokejoin 
where  strengths like '%Dragon%' and strengths like '%Ground%'
limit 20
 * sqlite:///poke.db
Done.
Out[16]:
nationalNumber name type immunes weaknesses strengths
87 Jugong Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
91 Austos Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
124 Rossana Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
144 Arktos Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
225 Botogel Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
362 Firnontor Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
460 Rexblisar Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
471 Glaziola Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon
478 Frosdedje Ice Fire, Water, Ice, Steel Grass, Ground, Flying, Dragon

Mein Pokemon Team

Zuerst wird eine view namens myteam erstellt, die, wie erwartet, (m)ein Pokemon-Team beinhaltet. Dazu werden die Namen der Pokemon aus der Spalte name aus pokejoin abgefragt. Das Prozentzeichen müsste nicht verwendet werden, wenn mit einer trim() Funktion alle Leerzeichen herausgelöscht worden wären.

In [17]:
%%sql

drop view if exists myteam;

create view myteam as select * from pokejoin
where name like '%Arkani%' 
    or name like '%Absol%' 
    or name like '%Stollos%' 
    or name like '%Lampi%' 
    or name like '%Lohgock%' 
    or name like '%Pudox%' ;

select * from myteam;
 * sqlite:///poke.db
Done.
Done.
Done.
Out[17]:
nationalNumber name type immunes weaknesses strengths
359 Absol Dark Fighting, Dark, Fairy Psychic, Ghost
306 Stolloss Rock Fighting, Ground, Steel Fire, Ice, Flying, Bug
306 Stolloss Steel Fire, Water, Electric, Steel Ice, Rock, Fairy
59 Arkani Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
257 Lohgock Fighting Ghost Poison, Flying, Psychic, Bug, Fairy Normal, Ice, Rock, Dark, Steel
257 Lohgock Fire Fire, Water, Rock, Dragon Grass, Ice, Bug, Steel
170 Lampi Electric Ground Electric, Grass, Dragon Water, Flying
170 Lampi Water Water, Grass, Dragon Fire, Ground, Rock
269 Pudox Bug Fire, Fighting, Poison, Flying, Ghost, Steel, Fairy Grass, Psychic, Dark
269 Pudox Poison Steel Poison, Ground, Rock, Ghost Grass, Fairy

Mit dieser etwas aufwändigeren Abfrage konnte ich eine view erstellen mit allen Stärken meines Teams, also alle Typen, gegen die mein Team gut kämpfen kann. Da SQLite nicht alle Funktionen, wie String_Split(), ermöglicht, wurde die Abfrage etwas länger.

In [18]:
%%sql
drop view if exists myteam_strengths;

create view myteam_strengths as 
WITH split(word, str) AS (
    SELECT '', (select group_concat(strengths) from myteam) ||','
    UNION ALL SELECT
    substr(str, 0, instr(str, ',')),
    substr(str, instr(str, ',')+1)
    FROM split WHERE str!=''
) SELECT distinct cast(trim(word) as text) as types FROM split WHERE word!=''
order by word;

select types from myteam_strengths;
 * sqlite:///poke.db
Done.
Done.
Done.
Out[18]:
types
Bug
Dark
Fairy
Flying
Ghost
Ground
Ice
Rock
Steel
Fire
Grass
Normal
Psychic
Water

Nun wird noch eine view namens result erstellt, die die allgemeine Typenliste und die Liste der Stärken meines Teams vergleicht. Typen, die nicht in beiden Listen vorkommen, werden im Output sichtbar.

In [19]:
%%sql

drop view if exists result;

create view result as 
select types from poketypes except select types from myteam_strengths;

select * from result;
 * sqlite:///poke.db
Done.
Done.
Done.
Out[19]:
types
Dragon
Electric
Fighting
Poison

Siehe da - vier Pokemon Typen fehlen! Demnach wäre es gescheit eines oder mehrere Pokemon auszutauschen, um gegen alle Typen erfolgreich zu sein.

Ungebrauchte Codes

Diese Abfrage wurde verwendet, um den Datei-Typen der Tables herauszufinden, woraufhin eine cast funktion (siehe oben) angewendet wurde.

In [20]:
#%%sql
#PRAGMA table_info(myteam_strengths);

Diese Abfrage funktioniert, jedoch gibt sie einen String mit den Typen aus, womit ich nicht weiterarbeiten konnte. Würde die Funktion String_Split() in SQLite funktionieren, wäre der Code sehr einfach und nützlich gewesen.

In [21]:
#%%sql
#
#drop view if exists myteam_strengths;
#
#create view myteam_strengths as 
#select group_concat(strengths) as strengths from myteam;
#
#select * from myteam_strengths;