Эффективный способ кодировать фрейм данных в древовидную структуру, если вложенный-если? - PullRequest
0 голосов
/ 19 января 2020

Предположим, у меня был pandas фрейм данных, который выглядел примерно так:

 A   B   C   D   value
 1   4   6   9   100
 1   4   6   10  101
 1   5   7   9   100
 1   5   7   11  102
 1   5   8   10  105

То есть есть некоторые идентифицирующие признаки, комбинация которых однозначно идентифицирует строку, а затем некоторое значение. В этом случае в A, B, C, D имеется 4 идентифицирующих объекта, и комбинация из четырех значений будет уникальной в рамках фрейма данных.

И я хочу print следующий вложенный оператор if:

if A == 1
    if B == 4
        if C == 6
            if D == 9
                100
            if D == 10
                101
    if B == 5
        if C == 7
            if D == 9
                100
            if D == 11
                102
        if C == 8
            if D == 10
                105

Каков эффективный (с точки зрения памяти, требуемой для хранения строки) способ кодирования данных с переменным числом идентификаторов A, B, ... в этот формат, если я знаю, что идентифицирующие столбцы уже расположены в порядке увеличение мощности?

and также разрешено, поэтому я также могу представить дерево как:

if A == 1
    if B == 4 and C == 6
        if D == 9
            100
        if D == 10
            101
    if B == 5
        if C == 7
            if D == 9
                100
            if D == 11
                102
        if C == 8 and D == 10
            105

Было бы экстатически c о последнем, но решение, которое достигает первого, уже будет решить мою проблему!

Вот пример df Я булыжник:

pd.DataFrame({'A': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3], 
              'B': [4, 4, 5, 5, 5, 4, 4, 4, 4, 5, 4, 5, 5, 5, 5], 
              'C': [6, 6, 7, 7, 8, 6, 7, 7, 7, 8, 6, 7, 8, 8, 8], 
              'D': [9, 10, 9, 11, 10, 12, 12, 13, 15, 10, 9, 10, 9, 16, 17],
              'value': [100, 101, 100, 102, 105, 103, 103, 100, 101, 107, 102, 100, 111, 105, 109]})

1 Ответ

0 голосов
/ 19 января 2020

Хорошо, так что это не совсем то, что вы просили, но я думаю, что стоит подумать.

Может быть, вы могли бы обучить классификатор дерева решений. Затем вы можете экспортировать дерево, а затем написать собственный код для преобразования дерева в операторы if, что должно быть простым. Вот код, с которым я возился:

import pandas as pd
from sklearn import tree
from graphviz import Source
import numpy as np

data = pd.DataFrame({'A': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3], 
                     'B': [4, 4, 5, 5, 5, 4, 4, 4, 4, 5, 4, 5, 5, 5, 5], 
                     'C': [6, 6, 7, 7, 8, 6, 7, 7, 7, 8, 6, 7, 8, 8, 8], 
                     'D': [9, 10, 9, 11, 10, 12, 12, 13, 15, 10, 9, 10, 9, 16, 17], 
                     'value': [100, 101, 100, 102, 105, 103, 103, 100, 101, 107, 102, 100, 111, 105, 109]})


X = data[['A', 'B', 'C', "D"]]
Y = data["value"]

clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)

# Display Tree
classes = Y.unique().astype(np.str)
Source( tree.export_graphviz(clf, out_file=None, feature_names=X.columns, class_names=classes) ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...