SkData

SkData es un proyecto nuevo, de 2017, con la finalidad de facilitar el análisis de datos, proviendo funcionalidades como:

  • limpieza de datos;
  • reproducibilidad de la manipulación/tratamiento de los datos;
  • visualización de datos;

Motivaciones

La construcción de la librería fue motivada por:

  • exceso de boilerplate en el análisis de datos;
  • el uso de librerías como pandas, matplotlib, scipy, etc pueden ser difícil en un principio para no programadores;
  • en un escenario dónde la demanda es mayor que los recursos (personas, tiempo, etc) tener mecanismo que pueden agilizar en proceso de análisis de datos es fundamental.

Inspiraciones

SkData se ha inspirado en funcionalidades de otros softwares como:

Las visualizaciones gráficas en weka permiten de manera fácil entender las relaciones entre los atributos del conjunto de datos. El entendimiento previo de estas relaciones ayuda a determinar los pasos siguientes en el análisis de datos. Mientras que, generalmente, la programación de visualización de datos consume un poco de tiempo, tener un medio de hacerlo de manera automática, sin o con muy poco código, facilitaría mucho en el análisis de datos.

La limpieza/tratamiento de los datos pueden ser una tarea que consume mucho tiempo y, muchas veces, el proceso se repite en el análisis de distintos conjunto de datos. A parte de eso, tener el control de los pasos/manipulaciones de los datos, puede facilitar el proceso de análisis sin modificar los datos originales. OpenRefine provee estos recursos y muchas otras funcionalidades para limpieza de datos y otras funcionalidades como reconcilización de datos.

Objetivos

Como ya mencionado, inicialmente skdata tiene 3 objetivos que serán comentados a continuación.

Limpieza de datos

Reproducibilidad

Visualización de datos

Aplicación

SkData provide a data class to structure and organize the preprocessing data.

The data is stored in hdf5 format. The original data is kept and all steps of preprocessing is kept to and applied on demand.

To import data from csv source:

from skdata import SkData

sd = SkData('filename.h5')
sd.import_from(source='filename.csv')

In [1]:
from skdata import SkData

Importing data


In [2]:
sd = SkData('/tmp/titanic.h5')

sd.import_from(
    source='../data/train.csv', 
    index_col='PassengerId',
    target_col='Survived',
    dset_id='train'
)

In [3]:
sd['train'].summary(compute=True)


Out[3]:
Types Set Values Count Set # Observations # NaN
Survived int64 [0, 1] 2 891 0
Pclass int64 [1, 2, 3] 3 891 0
Name object ['Abbing, Mr. Anthony', 'Abbott, Mr. Rossmore ... 891 891 0
Sex object ['female', 'male'] 2 891 0
Age float64 [0.42, 0.67, 0.75, 0.83, 0.92, 1.0, 2.0, 3.0, ... 88 714 177
SibSp int64 [0, 1, 2, 3, 4, 5, 8] 7 891 0
Parch int64 [0, 1, 2, 3, 4, 5, 6] 7 891 0
Ticket object ['110152', '110413', '110465', '110564', '1108... 681 891 0
Fare float64 [0.0, 4.0125, 5.0, 6.2375, 6.4375, 6.45, 6.495... 248 891 0
Cabin object ['A10', 'A14', 'A16', 'A19', 'A20', 'A23', 'A2... 147 204 687
Embarked object ['C', 'Q', 'S'] 3 889 2

In [4]:
sd['train'].computed.head()


Out[4]:
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

Data preparing and cleaning


In [5]:
sd['train']['Sex'].replace({'male': 'Male', 'female': 'Female'})
sd['train']['Embarked'].replace({
    'C': 'Cherbourg', 'Q': 'Queenstown', 'S': 'Southampton'
})

sd['train'].compute()
sd['train'].computed.head()


Out[5]:
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 0 3 Braund, Mr. Owen Harris Male 22.0 1 0 A/5 21171 7.2500 NaN Southampton
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... Female 38.0 1 0 PC 17599 71.2833 C85 Cherbourg
3 1 3 Heikkinen, Miss. Laina Female 26.0 0 0 STON/O2. 3101282 7.9250 NaN Southampton
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) Female 35.0 1 0 113803 53.1000 C123 Southampton
5 0 3 Allen, Mr. William Henry Male 35.0 0 0 373450 8.0500 NaN Southampton

In [6]:
survived_dict = {0: 'Died', 1: 'Survived'}
pclass_dict = {1: 'Upper Class', 2: 'Middle Class', 3: 'Lower Class'}

sd['train']['Pclass'].categorize(categories=pclass_dict)
sd['train']['Survived'].categorize(categories=survived_dict)
sd['train']['Sex'].categorize()
sd['train']['Embarked'].categorize()

sd['train'].summary(compute=True)


Out[6]:
Types Set Values Count Set # Observations # NaN
Survived category ['Died', 'Survived'] 2 891 0
Pclass category ['Lower Class', 'Middle Class', 'Upper Class'] 3 891 0
Name object ['Abbing, Mr. Anthony', 'Abbott, Mr. Rossmore ... 891 891 0
Sex category ['Female', 'Male'] 2 891 0
Age float64 [0.42, 0.67, 0.75, 0.83, 0.92, 1.0, 2.0, 3.0, ... 88 714 177
SibSp int64 [0, 1, 2, 3, 4, 5, 8] 7 891 0
Parch int64 [0, 1, 2, 3, 4, 5, 6] 7 891 0
Ticket object ['110152', '110413', '110465', '110564', '1108... 681 891 0
Fare float64 [0.0, 4.0125, 5.0, 6.2375, 6.4375, 6.45, 6.495... 248 891 0
Cabin object ['A10', 'A14', 'A16', 'A19', 'A20', 'A23', 'A2... 147 204 687
Embarked category ['Cherbourg', 'Queenstown', 'Southampton'] 3 889 2

In [7]:
sd['train'].computed.head()


Out[7]:
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 Died Lower Class Braund, Mr. Owen Harris Male 22.0 1 0 A/5 21171 7.2500 NaN Southampton
2 Survived Upper Class Cumings, Mrs. John Bradley (Florence Briggs Th... Female 38.0 1 0 PC 17599 71.2833 C85 Cherbourg
3 Survived Lower Class Heikkinen, Miss. Laina Female 26.0 0 0 STON/O2. 3101282 7.9250 NaN Southampton
4 Survived Upper Class Futrelle, Mrs. Jacques Heath (Lily May Peel) Female 35.0 1 0 113803 53.1000 C123 Southampton
5 Died Lower Class Allen, Mr. William Henry Male 35.0 0 0 373450 8.0500 NaN Southampton

In [8]:
sd['train'].drop_columns(max_na_values=0.1)
sd['train'].summary(compute=True)


Out[8]:
Types Set Values Count Set # Observations # NaN
Survived category ['Died', 'Survived'] 2 891 0
Pclass category ['Lower Class', 'Middle Class', 'Upper Class'] 3 891 0
Name object ['Abbing, Mr. Anthony', 'Abbott, Mr. Rossmore ... 891 891 0
Sex category ['Female', 'Male'] 2 891 0
SibSp int64 [0, 1, 2, 3, 4, 5, 8] 7 891 0
Parch int64 [0, 1, 2, 3, 4, 5, 6] 7 891 0
Ticket object ['110152', '110413', '110465', '110564', '1108... 681 891 0
Fare float64 [0.0, 4.0125, 5.0, 6.2375, 6.4375, 6.45, 6.495... 248 891 0
Embarked category ['Cherbourg', 'Queenstown', 'Southampton'] 3 889 2

In [9]:
sd['train'].dropna()
sd['train'].summary(compute=True)


Out[9]:
Types Set Values Count Set # Observations # NaN
Survived category ['Died', 'Survived'] 2 889 0
Pclass category ['Lower Class', 'Middle Class', 'Upper Class'] 3 889 0
Name object ['Abbing, Mr. Anthony', 'Abbott, Mr. Rossmore ... 889 889 0
Sex category ['Female', 'Male'] 2 889 0
SibSp int64 [0, 1, 2, 3, 4, 5, 8] 7 889 0
Parch int64 [0, 1, 2, 3, 4, 5, 6] 7 889 0
Ticket object ['110152', '110413', '110465', '110564', '1108... 680 889 0
Fare float64 [0.0, 4.0125, 5.0, 6.2375, 6.4375, 6.45, 6.495... 247 889 0
Embarked category ['Cherbourg', 'Queenstown', 'Southampton'] 3 889 0

In [10]:
sd['train'].drop_columns(max_unique_values=0.3)
sd['train'].summary(compute=True)


Out[10]:
Types Set Values Count Set # Observations # NaN
Survived category ['Died', 'Survived'] 2 889 0
Pclass category ['Lower Class', 'Middle Class', 'Upper Class'] 3 889 0
Sex category ['Female', 'Male'] 2 889 0
SibSp int64 [0, 1, 2, 3, 4, 5, 8] 7 889 0
Parch int64 [0, 1, 2, 3, 4, 5, 6] 7 889 0
Fare float64 [0.0, 4.0125, 5.0, 6.2375, 6.4375, 6.45, 6.495... 247 889 0
Embarked category ['Cherbourg', 'Queenstown', 'Southampton'] 3 889 0