@MuMPiTz: Ich würde auf jeden Fall das Tutorial in der Python-Dokumentation empfehlen mal durchgearbeitet zu haben.
In dem Video steht doch keine ``while`` sondern eine ``for``-Schleife. Über den Index, was man wie gesagt nicht machen würde. Und der Typ verändert auch die CSV-Datei, damit sein Code der die Datei an '\n' aufteilt, nicht darüber stolpert das die Datei mit einem '\n' endet, und dadurch in seiner `zeilen`-Liste ein leerer Eintrag am Ende steht. Der schreibt gruseligen Code. Und das im 20. Teil des Tutorials, da kann man sich IMHO nicht mehr damit rausreden das man es für Anfänger erst einmal bei primitiven Operationen belassen will. Wobei selbst da die `splitlines()`-Methode das Problem gelöst hätte, ohne dass er vorher manuell die Daten hätte verändern müssen.
Apropos Daten, die kann man von hier herunterladen:
https://archive.ics.uci.edu/ml/datasets/Abalone
Und sie haben im Gegensatz zu dem was Du am Anfang gezeigt hast, tatsächlich Kommas als Trennzeichen. Ist also eine klassische CSV-Datei.
Bitte keine Bilder von Code oder solchen Textdaten posten, sondern tatsächlich Text. Die Bilder sind mehr Datenvolumen ohne Mehrwert, sogar weniger wertvoll, weil man den Code nicht ausprobieren und die Daten nicht einlesen kann.
Was der Typ da umständlich mit den Daten veranstaltet, würde man eigentlich mit `pandas` machen. Oder zumindest mit `numpy`. Eine Abhängigkeit, welche man durch `matplotlib` ja sowieso schon hat.
Mal was der da mit den Daten in dem Video macht ganz ohne das man selbst Schleifen schreiben muss. Also bis auf eine wenn man nach Geschlecht aufgteilt plottet. Einlesen der Daten in ein Numpy-Record-Array:
Code: Alles auswählen
In [40]: rs = np.recfromcsv('abalone.data', names=['sex', 'length', 'diameter',
...: 'height', 'whole_weight', 'shucked_weight', 'viscera_weight', 'shell_we
...: ight', 'rings'])
In [41]: rs
Out[41]:
rec.array([('M', 0.455, 0.365, 0.095, 0.514 , 0.2245, 0.101 , 0.15 , 15),
('M', 0.35 , 0.265, 0.09 , 0.2255, 0.0995, 0.0485, 0.07 , 7),
('F', 0.53 , 0.42 , 0.135, 0.677 , 0.2565, 0.1415, 0.21 , 9),
...,
('M', 0.6 , 0.475, 0.205, 1.176 , 0.5255, 0.2875, 0.308, 9),
('F', 0.625, 0.485, 0.15 , 1.0945, 0.531 , 0.261 , 0.296, 10),
('M', 0.71 , 0.555, 0.195, 1.9485, 0.9455, 0.3765, 0.495, 12)],
dtype=[('sex', 'S1'), ('length', '<f8'), ('diameter', '<f8'), ('height', '<f8'), ('whole_weight', '<f8'), ('shucked_weight', '<f8'), ('viscera_weight', '<f8'), ('shell_weight', '<f8'), ('rings', '<i4')])
Auslesen der Spalten mit der Länge und Höhe der Tiere:
Code: Alles auswählen
In [42]: rs.length
Out[42]: array([ 0.455, 0.35 , 0.53 , ..., 0.6 , 0.625, 0.71 ])
In [43]: rs.height
Out[43]: array([ 0.095, 0.09 , 0.135, ..., 0.205, 0.15 , 0.195])
Und plotten:
Code: Alles auswählen
In [46]: from matplotlib import pyplot as plt
In [47]: plt.scatter(rs.length, rs.height)
Out[47]: <matplotlib.collections.PathCollection at 0xb5424ac>
In [48]: plt.show()
Filtern nach weiblichen Tieren und von denen die Längen:
Code: Alles auswählen
In [51]: rs.sex == 'F'
Out[51]: array([False, False, True, ..., False, True, False], dtype=bool)
In [52]: rs[rs.sex == 'F']
Out[52]:
rec.array([('F', 0.53 , 0.42 , 0.135, 0.677 , 0.2565, 0.1415, 0.21 , 9),
('F', 0.53 , 0.415, 0.15 , 0.7775, 0.237 , 0.1415, 0.33 , 20),
('F', 0.545, 0.425, 0.125, 0.768 , 0.294 , 0.1495, 0.26 , 16),
...,
('F', 0.515, 0.4 , 0.125, 0.615 , 0.2865, 0.123 , 0.1765, 8),
('F', 0.565, 0.45 , 0.165, 0.887 , 0.37 , 0.239 , 0.249 , 11),
('F', 0.625, 0.485, 0.15 , 1.0945, 0.531 , 0.261 , 0.296 , 10)],
dtype=[('sex', 'S1'), ('length', '<f8'), ('diameter', '<f8'), ('height', '<f8'), ('whole_weight', '<f8'), ('shucked_weight', '<f8'), ('viscera_weight', '<f8'), ('shell_weight', '<f8'), ('rings', '<i4')])
In [53]: rs[rs.sex == 'F'].length
Out[53]: array([ 0.53 , 0.53 , 0.545, ..., 0.515, 0.565, 0.625])
Nach Geschlecht geplottet:
Code: Alles auswählen
In [58]: for sex, color in [('F', 'blue'), ('M', 'red'), ('I', 'green')]:
...: rs_by_sex = rs[rs.sex == sex]
...: plt.scatter(rs_by_sex.length, rs_by_sex.whole_weight, color=color,
...: alpha=0.2)
...:
In [59]: plt.show()
Das was Du möchtest, zählen eines bestimmten Geschlechts geht so:
Man sieht jetzt die Plots nicht und die Namen sind für eine interaktive Sitzung okay, aber für ein Skript natürlich Mist, also das ganze noch einmal als Programm:
Code: Alles auswählen
import numpy as np
from matplotlib import pyplot as plt
def main():
column_names = [
'sex', 'length', 'diameter', 'height', 'whole_weight',
'shucked_weight', 'viscera_weight', 'shell_weight', 'rings',
]
records = np.recfromcsv('abalone.data', names=column_names)
plt.scatter(records.length, records.height)
plt.show()
for sex, color in [('F', 'blue'), ('M', 'red'), ('I', 'green')]:
records_by_sex = records[records.sex == sex]
plt.scatter(
records_by_sex.length,
records_by_sex.whole_weight,
color=color,
alpha=0.2,
)
plt.show()
for sex in ['F', 'M', 'I']:
print('{} = #{}'.format(sex, (records.sex == sex).sum()))
if __name__ == '__main__':
main()