2017-06-19 4 views
2

Je suis wroking avec pandas dataframe et je veux le convertir en tableau de données orange pour imputer des valeurs manquantes. mon dataframe ressembleconvertir données pandas à Orange tableau de données

locationId rank Rating type value 
1   1 10  shop 2.668 
2   4 8  store 3.921 
3   3 NAN shop 3.122 

où le rang est ordinale avec répétition des valeurs entre 1 et 5.Saisissez est catégorique avec magasin de types, etc magasin et note est type.value entier est en virgule flottante. Je veux le convertir en tableau de données d'Orange et imputer des valeurs manquantes. J'avais également vu this mais ces fonctions me donnent une erreur et n'ont pas fonctionné pour moi.

Répondre

1
import numpy as np 
import pandas as pd 
import Orange 
import csv 
from io import StringIO 
from collections import OrderedDict 
from Orange.data import Table, Domain, ContinuousVariable, DiscreteVariable 


def pandas_to_orange(df): 
    domain, attributes, metas = construct_domain(df) 
    orange_table = Orange.data.Table.from_numpy(domain = domain, X = df[attributes].values, Y = None, metas = df[metas].values, W = None) 
    return orange_table 

def construct_domain(df): 
    columns = OrderedDict(df.dtypes) 
    attributes = OrderedDict() 
    metas = OrderedDict() 
    for name, dtype in columns.items(): 

     if issubclass(dtype.type, np.number): 
      if len(df[name].unique()) >= 13 or issubclass(dtype.type, np.inexact) or (df[name].max() > len(df[name].unique())): 
       attributes[name] = Orange.data.ContinuousVariable(name) 
      else: 
       df[name] = df[name].astype(str) 
       attributes[name] = Orange.data.DiscreteVariable(name, values = sorted(df[name].unique().tolist())) 
     else: 
      metas[name] = Orange.data.StringVariable(name) 

    domain = Orange.data.Domain(attributes = attributes.values(), metas = metas.values()) 

    return domain, list(attributes.keys()), list(metas.keys()) 

utilisation -> pandas_to_orange (dataframe)