2017-06-19 6 views
2

ich bin mit pandas dataframe woking und ich möchte es in orange Datentabelle konvertieren, um fehlende Werte zu imputieren. mein Datenrahmen sieht aus wiekonvertieren pandas datenframe zu Orange datentabelle

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

wo Rang Ordnungs mit Werten zwischen 1 und Wiederholung 5.Type ist kategorisch mit Typen Geschäft, Geschäft usw. und Rating ist integer type.value ist Gleitkomma. Ich möchte es in Orange Datentabelle konvertieren und fehlende Werte imputieren. Ich hatte auch this angesehen, aber diese Funktionen gibt mir einen Fehler und funktionierte nicht für mich.

Antwort

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()) 

Gebrauch -> pandas_to_orange (Datenrahmen)

Verwandte Themen