Попробуем что-нибудь поделать средствами чистого Python без дополнительных библиотек
! cat data.txt
Feature1,Weight,Height,Bla-bla,Size,Class 10.0,12,344,0,23.0,Class1 7.2,12,208,0,18.0,Class2 19.0,11,344,1,21.0,Class4 7.2,13,208,0,20.0,Class2 9.2,20,208,0,17.0,Class1 19.0,11,254,2,11.0,Class3
Считаем данные и сохраним в удобном для нас формате
fin = open('data.txt')
points = []
first = True
for line in fin:
if first:
first = False
continue
columns = line.strip().split(',')
features = [float(feature) for feature in columns[:5]]
label = columns[5]
points.append({'features': features, 'label': label})
fin.close()
print points
[{'features': [10.0, 12.0, 344.0, 0.0, 23.0], 'label': 'Class1'}, {'features': [7.2, 12.0, 208.0, 0.0, 18.0], 'label': 'Class2'}, {'features': [19.0, 11.0, 344.0, 1.0, 21.0], 'label': 'Class4'}, {'features': [7.2, 13.0, 208.0, 0.0, 20.0], 'label': 'Class2'}, {'features': [9.2, 20.0, 208.0, 0.0, 17.0], 'label': 'Class1'}, {'features': [19.0, 11.0, 254.0, 2.0, 11.0], 'label': 'Class3'}]
Посчитаем количество значений каждого класса
from collections import defaultdict
counter = defaultdict(int)
for point in points:
counter[point['label']] += 1
print counter
defaultdict(<type 'int'>, {'Class4': 1, 'Class2': 2, 'Class3': 1, 'Class1': 2})
Подгружаем нужные библиотеки. Сразу подгружаем все три и дальше, не задумываясь, используем их.
import numpy as np
import pandas as pd
import pylab as pl
Считаем и выведем данные в файле
df = pd.read_csv('data.txt')
df
Feature1 | Weight | Height | Bla-bla | Size | Class | |
---|---|---|---|---|---|---|
0 | 10.0 | 12 | 344 | 0 | 23 | Class1 |
1 | 7.2 | 12 | 208 | 0 | 18 | Class2 |
2 | 19.0 | 11 | 344 | 1 | 21 | Class4 |
3 | 7.2 | 13 | 208 | 0 | 20 | Class2 |
4 | 9.2 | 20 | 208 | 0 | 17 | Class1 |
5 | 19.0 | 11 | 254 | 2 | 11 | Class3 |
Кстати, поведение print немного другое :)
print df
Feature1 Weight Height Bla-bla Size Class 0 10.0 12 344 0 23 Class1 1 7.2 12 208 0 18 Class2 2 19.0 11 344 1 21 Class4 3 7.2 13 208 0 20 Class2 4 9.2 20 208 0 17 Class1 5 19.0 11 254 2 11 Class3
Срезы в dataframe берутся по строкам
df[2:5]
Feature1 | Weight | Height | Bla-bla | Size | Class | |
---|---|---|---|---|---|---|
2 | 19.0 | 11 | 344 | 1 | 21 | Class4 |
3 | 7.2 | 13 | 208 | 0 | 20 | Class2 |
4 | 9.2 | 20 | 208 | 0 | 17 | Class1 |
Зато обращение по одному индексу означает столбец
df['Class']
0 Class1 1 Class2 2 Class4 3 Class2 4 Class1 5 Class3 Name: Class, dtype: object
Вот так одной строчкой можно подсчитать и визуализировать количество объектов каждого класса
df['Class'].value_counts().plot(kind='barh', color="blue", alpha=.65)
<matplotlib.axes.AxesSubplot at 0x106a05850>
Можно просто считать среднее и дисперсию
print df['Feature1'].mean()
print df['Feature1'].var()
11.9333333333 31.1786666667
Можно проверять условия сразу на целый столбец
df['Feature1'] >= 10
0 True 1 False 2 True 3 False 4 False 5 True Name: Feature1, dtype: bool
Также можно использовать полученный бинарный вектор в качестве индексов
df[df['Feature1'] >= 10]
Feature1 | Weight | Height | Bla-bla | Size | Class | |
---|---|---|---|---|---|---|
0 | 10 | 12 | 344 | 0 | 23 | Class1 |
2 | 19 | 11 | 344 | 1 | 21 | Class4 |
5 | 19 | 11 | 254 | 2 | 11 | Class3 |
Разумеется, можно найти высоту столбца
print len(df[df['Feature1'] >= 10])
3
На текущих данных это не актуально, но можно заменять некоторые значения во фрейме на другие. Или же удалять строки с пропущенными значениями.
#df = df.replace('?', np.nan)
#df = df.dropna()
Попробуем удалить столбец с классом.
print df.drop('Class', axis=1)
Feature1 Weight Height Bla-bla Size 0 10.0 12 344 0 23 1 7.2 12 208 0 18 2 19.0 11 344 1 21 3 7.2 13 208 0 20 4 9.2 20 208 0 17 5 19.0 11 254 2 11
Преобразуем его к матрице numpy с вещественными значениями
mat = df.drop('Class', axis=1).values.astype(np.float32)
print mat
[[ 10. 12. 344. 0. 23. ] [ 7.19999981 12. 208. 0. 18. ] [ 19. 11. 344. 1. 21. ] [ 7.19999981 13. 208. 0. 20. ] [ 9.19999981 20. 208. 0. 17. ] [ 19. 11. 254. 2. 11. ]]
В такой матрице можно обращаться по каждой из координат, брать срезы и т.п.
mat[1, 1:]
array([ 12., 208., 0., 18.], dtype=float32)