Last active
January 2, 2016 15:59
-
-
Save erinaceous/8326735 to your computer and use it in GitHub Desktop.
Decision Tree Python implementation
Using CSV file available from: http://www.reversewinesnob.com/p/interactive-wine-ranking-spreadsheet.html
(On embedded spreadsheet, select Menu > Download > CSV)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# vim: set tabstop=4 shiftwidth=4 textwidth=79 cc=72,79: | |
""" | |
decision_tree: Python implementation of an ID3 decision tree. | |
Based mostly on Chapter 18, Section 18.3 'Learning Decision Trees' | |
Of the book 'Artificial Intelligence: A Modern Approach' | |
By Russel & Norvig, 1995. | |
Original Author: Owain Jones [github.com/doomcat] [contact@odj.me] | |
""" | |
from __future__ import print_function | |
#from scipy.stats import chisquare | |
import copy | |
import math | |
#import sys | |
def entropy(Set): | |
"""Entropy: Expected number of bits needed to encode the class | |
(e.g. is it positive or is it negative?) of any member of the | |
set Set. | |
This function measures the entropy of a sample of training | |
examples - the set Set. Training examples in Set are either | |
positive or negative. | |
""" | |
Entropy = 0.0 | |
# Get a set of unique values within Set (the classes) | |
# (If you have a set of positive examples encoded as 0 and 1, e.g. | |
# Set = [0, 1, 0, 1, 1, 0], then Set_unique = {0, 1}). | |
# If you have more than 2 classes, this still works. | |
Set_unique = set(Set) | |
# If we only have one type of class, entropy will be zero anyway. | |
# But explicitly returning 0 here prevents a ZeroDivisionError | |
# from occurring when we try to do math.log(1, 1) later on. | |
if len(Set_unique) == 1: | |
return 0.0 | |
for C in Set_unique: | |
# Calculate proportions of the different classes in Set | |
P = float(len([X for X in Set if X == C])) / float(len(Set)) | |
# And subtract that from the overall entropy of Set | |
Entropy -= P * math.log(P, 2) | |
return Entropy | |
def information_gain(Attribute, Split_On): | |
"""Calculate the Information Gain of an attribute within Set. | |
Attribute: Attribute (given as list) to calculate the entropy of | |
Split_On: Attribute (as list) used to split the data into | |
positive and negative examples. Assumes that this | |
attribute only has two possible classes | |
(e.g. 0 or 1, True or False, 'Yes' or 'No') - | |
If there are more than two classes given in Split_On, | |
it won't work right. | |
Returns a tuple containing: (Gain, Remainder, ) | |
""" | |
Remainder = 0.0 | |
Gain = 0.0 | |
Deviation = 0.0 | |
Split_On_unique = list(set(Split_On)) | |
if len(Split_On_unique) > 2: | |
raise Exception("Split_On should have two classes. " + | |
"(Found %d classes)" % len(Split_On_unique)) | |
P = len([X for X in Split_On if X == Split_On_unique[0]]) | |
N = len([X for X in Split_On if X == Split_On_unique[1]]) | |
Attribute_unique = set(Attribute) | |
for E in Attribute_unique: | |
# Because everyone looooves reading list comprehensions | |
# Pi and Ni are just used to keep count of the positive and | |
# negative examples for each attribute. | |
# ^ This might be the wrong thing to do ?????????? | |
Pi = float(len([X for i, X in enumerate(Attribute) | |
if X == E and Split_On[i] == Split_On_unique[0]])) | |
Ni = float(len([X for i, X in enumerate(Attribute) | |
if X == E and Split_On[i] == Split_On_unique[1]])) | |
Example = [Split_On[i] for i, X in enumerate(Attribute) if X == E] | |
Prime_i = (float(Pi + Ni) / float(P + N)) | |
Pi_prime = P * Prime_i | |
Ni_prime = N * Prime_i | |
Remainder += Prime_i * entropy(Example) | |
# Calculate chi-squared total deviation | |
Deviation += ((((Pi - Pi_prime) ** 2) / Pi_prime) + | |
(((Ni - Ni_prime) ** 2) / Ni_prime)) | |
Gain = entropy(Attribute) - Remainder | |
return (Gain, Remainder, Deviation) | |
def gain_ratio(Attribute, Split_On): | |
"""Information Gain is biased towards Attributes with many distinct | |
values. | |
GainRatio = Gain / Entropy | |
Returns a tuple containing: (Gain Ratio, Gain, Remainder, Deviation) | |
""" | |
Gain, Remainder, Deviation = information_gain(Attribute, Split_On) | |
try: | |
GainRatio = Gain / entropy(Attribute) | |
except ZeroDivisionError: | |
GainRatio = 0.0 | |
return (GainRatio, Gain, Remainder, Deviation) | |
def learn_tree(Examples, Attributes, Classifier, Default=None, Depth=0): | |
"""Generate a decision tree via inductive learning. | |
Based on the algorithm given in: | |
Figure 18.7, Page 537, Section 18.3, 'Learning Decision Trees', | |
Artificial Intelligence: A Modern Approach, 1995 Edition | |
Examples: List of list (table) of training examples. | |
Attributes: List of attributes (table headers). | |
Default: Default classification (e.g. 0 or False or 'No') | |
Classifier: List used to classify examples. | |
(e.g. last column of table) | |
""" | |
# If Classifier is a string, we extract the column of the Examples | |
# table that it's referring to, | |
# And remove that column from the table. | |
if type(Classifier) == str: | |
Classifier_id = Classifier | |
Classifier = [X[Attributes.index(Classifier)] for X in Examples] | |
Examples = copy.deepcopy(Examples) | |
for X in Examples: | |
del X[Attributes.index(Classifier_id)] | |
Attributes = copy.deepcopy(Attributes) | |
Attributes.remove(Classifier_id) | |
# If the default is empty, find most common value of it. | |
if Default is None: | |
Default = max(Classifier) | |
# If examples is empty then return the default | |
if len(Examples) == 0: | |
return Default | |
# If no attributes, then return the majority-value | |
if len(Attributes) == 0: | |
return max(Classifier) | |
# If all examples have the same classification then return that | |
# classification | |
if len(set(Classifier)) == 1: | |
return list(set(Classifier))[0] | |
# Else: | |
# Choose the best remaining attribute (the one with the highest | |
# information gain) | |
# This might be wrong????????? Should it be picking minimums or | |
# maximums? | |
Gains = dict() | |
Deviations = dict() | |
for Key in Attributes: | |
Gains[Key] = 0.0 | |
Attribute = [X[Attributes.index(Key)] for X in Examples] | |
GainRatio, Gain, Remainder, Deviation = gain_ratio(Attribute, | |
Classifier) | |
Gains[Key] = GainRatio | |
Deviations[Key] = Deviation | |
Best = max(Gains) | |
Best_index = Attributes.index(Best) | |
# Make a copy of the Attributes list, and then remove the current | |
# best attribute from it. | |
# (You don't want to modify Attributes directly because the changes | |
# to the list will propagate up through the recursion of this | |
# function) | |
Attributes_minus_Best = [X for X in Attributes] | |
Attributes_minus_Best.remove(Best) | |
# New decision tree with root test Best | |
Tree = dict() | |
for V_i in Examples: | |
# Get elements of Examples where V_i == Best | |
# Making copies of the Examples and Classifier lists again. | |
Examples_i = [X for i, X in enumerate(Examples) | |
if X[Best_index] == V_i[Best_index]] | |
Classifier_i = [Classifier[i] for i, X in enumerate(Examples) | |
if X[Best_index] == V_i[Best_index]] | |
Examples_i = [[X for X in Y] for Y in Examples_i] | |
Classifier_i = [X for X in Classifier_i] | |
# Remove current 'Best' column |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# vim: set tabstop=4 shiftwidth=4 textwidth=79 cc=72,79: | |
""" | |
example_data: Table of examples of wines I've drunk in the past and | |
How much I liked them. | |
Lol this data is such bullshit and I know it. I am far from Wine | |
connoisseur. I just looked at the types, countries, profiles etc. | |
on the Morrison's website. The data is biased towards (hopefully) | |
cheap Chilean Merlot cos that is what I always end up drinking. | |
Original Author: Owain Jones [github.com/doomcat] [contact@odj.me] | |
""" | |
keys = ['Profile', 'Type', 'Variety', 'Country', 'Price', 'Tasty'] | |
data = [ | |
['Fresh', 'Red', 'Cabernet Franc', 'Argentinia', 'Cheaper', 'Yes'], | |
['Fresh', 'Red', 'Cabernet Sauvignon', 'Argentinia', 'Expensive', 'Yes'], | |
['Sweet', 'Rose', 'Merlot', 'Australia', 'Expensive', 'No'], | |
['Smooth', 'White', 'Merlot', 'Chile', 'Cheaper', 'No'], | |
['Smooth', 'Rose', 'Chardonnay', 'Chile', 'Cheaper', 'No'], | |
['Intense', 'Red', 'Merlot', 'Chile', 'Cheaper', 'Yes'], | |
['Fresh', 'Red', 'Cabernet Sauvignon', 'Chile', 'Expensive', 'Yes'], | |
['Intense', 'Red', 'Grenache', 'France', 'Royalty', 'No'], | |
['Suspicious', 'White', 'Grape Juice', 'Australia', 'Cheaper', 'No'], | |
['Crunk', 'Red', 'Merlot', 'Chile', 'Expensive', 'No'], | |
['Intense', 'Rose', 'Merlot', 'Chile', 'Cheap', 'Yes'], | |
['Intense', 'Red', 'Merlot', 'Argentinia', 'Cheap', 'No'], | |
['Intense', 'Red', 'Merlot', 'Argentinia', 'Cheap', 'Yes'], | |
['Intense', 'Red', 'Merlot', 'Argentinia', 'Cheap', 'No'], | |
[''] | |
] | |
def from_csv(csvfile): | |
from collections import OrderedDict | |
import csv | |
if type(csvfile) == str: | |
csvfile = open(csvfile, 'r') | |
else: | |
csvfile.seek(0) | |
reader = csv.reader(csvfile) | |
examples = list() | |
for row in reader: | |
attributes = row | |
break | |
for row in reader: | |
examples.append(row) | |
tmp_attributes = list() | |
attributes.append('IsTasty') | |
attributes.append('DiscreteCost') | |
for i, example in enumerate(examples): | |
e_dict = {attributes[i]: x for i, x in enumerate(example)} | |
e_dict = OrderedDict(sorted(e_dict.items())) | |
tasty = 'No' | |
cost = 'Cheapest' | |
try: | |
e_dict['Taste'] = float(e_dict['Taste']) | |
if e_dict['Taste'] > 7: | |
tasty = 'Yes' | |
except ValueError: | |
tasty = 'No' | |
e_dict['Cost'] = float(e_dict['Cost'].replace('$', '')) | |
if e_dict['Cost'] > 7: | |
cost = 'Cheap' | |
if e_dict['Cost'] > 11: | |
cost = 'Expensive' | |
if e_dict['Cost'] > 15: | |
cost = 'Royalty' | |
e_dict['IsTasty'] = tasty | |
e_dict['DiscreteCost'] = cost | |
for attr in list(e_dict.keys()): | |
if attr in ['Cost', 'Wine', 'Review', | |
'Overall', 'Taste', 'Rating']: | |
del e_dict[attr] | |
for attr in e_dict: | |
e_dict[attr] = e_dict[attr].lower().strip() # normalize | |
tmp_attributes = list(e_dict.keys()) | |
examples[i] = list(e_dict.values()) | |
attributes = tmp_attributes | |
return (attributes, examples) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"agiorgitiko": "no", | |
"albarino": { | |
"white": { | |
"other": { | |
"cheap": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"amarone": "no", | |
"assyrtiko": "yes", | |
"barbera": "no", | |
"beaujolais": { | |
"red": { | |
"other": { | |
"expensive": "yes" | |
} | |
} | |
}, | |
"blend": { | |
"port": { | |
"other": { | |
"royalty": "yes" | |
} | |
}, | |
"red": { | |
"costco": { | |
"cheap": "yes", | |
"cheapest": "yes", | |
"expensive": "yes" | |
}, | |
"other": { | |
"cheap": "yes", | |
"cheapest": "yes", | |
"expensive": "yes", | |
"royalty": "yes" | |
}, | |
"trader joe's": { | |
"cheapest": "yes" | |
} | |
}, | |
"ros\u00e9": { | |
"costco": "no", | |
"other": { | |
"cheap": "no", | |
"expensive": "yes" | |
} | |
}, | |
"sparkling": { | |
"other": { | |
"cheap": "no", | |
"royalty": "yes" | |
} | |
}, | |
"white": { | |
"other": { | |
"cheap": "yes", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"bonarda": "no", | |
"cabernet franc": "yes", | |
"cabernet sauvignon": { | |
"red": { | |
"costco": { | |
"cheap": "yes", | |
"cheapest": "no", | |
"expensive": "no", | |
"royalty": "yes" | |
}, | |
"other": { | |
"cheap": "yes", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
}, | |
"ros\u00e9": "yes" | |
}, | |
"carmenere": { | |
"red": { | |
"other": { | |
"cheap": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
}, | |
"trader joe's": "no" | |
} | |
}, | |
"chardonnay": { | |
"white": { | |
"costco": "yes", | |
"other": { | |
"cheap": "no", | |
"expensive": "yes" | |
} | |
} | |
}, | |
"chenin blanc": { | |
"white": { | |
"other": { | |
"cheap": "no", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"garganega": "yes", | |
"garnacha": { | |
"red": { | |
"costco": "yes", | |
"other": { | |
"cheap": "yes", | |
"cheapest": "yes", | |
"royalty": "yes" | |
}, | |
"trader joe's": "no" | |
}, | |
"ros\u00e9": "no" | |
}, | |
"gavi": "yes", | |
"gewurztraminer": { | |
"dessert": "no", | |
"white": "yes" | |
}, | |
"grechetto": "yes", | |
"grenache": { | |
"dessert": "yes", | |
"red": "no", | |
"ros\u00e9": { | |
"other": { | |
"cheap": "no", | |
"expensive": "yes" | |
} | |
} | |
}, | |
"gruner veltliner": { | |
"white": { | |
"other": { | |
"expensive": "yes", | |
"royalty": "no" | |
} | |
} | |
}, | |
"lagrein": { | |
"red": { | |
"other": { | |
"expensive": "yes", | |
"royalty": "no" | |
} | |
} | |
}, | |
"macabeo": "no", | |
"malbec": { | |
"red": { | |
"costco": { | |
"cheap": "yes", | |
"cheapest": "no" | |
}, | |
"other": { | |
"cheap": "yes", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
}, | |
"trader joe's": "no" | |
}, | |
"ros\u00e9": "no" | |
}, | |
"meritage": { | |
"red": { | |
"costco": "yes", | |
"other": { | |
"expensive": "yes", | |
"royalty": "no" | |
} | |
} | |
}, | |
"merlot": { | |
"red": { | |
"costco": "yes", | |
"other": { | |
"cheap": "yes", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"monastrell": "no", | |
"montepulciano": "no", | |
"moscatel": "yes", | |
"moscato": { | |
"dessert": "no", | |
"ros\u00e9": "no", | |
"sparkling": "yes", | |
"white": { | |
"other": { | |
"cheap": "yes" | |
} | |
} | |
}, | |
"moschofilero": "yes", | |
"mourvedre": "yes", | |
"muscat": "yes", | |
"nebbiolo": { | |
"red": { | |
"other": { | |
"expensive": "yes", | |
"royalty": "yes" | |
}, | |
"trader joe's": "yes" | |
} | |
}, | |
"negroamaro": { | |
"red": { | |
"other": "yes", | |
"trader joe's": "no" | |
} | |
}, | |
"nero d'avola": { | |
"red": { | |
"other": "yes", | |
"trader joe's": "no" | |
} | |
}, | |
"petite sirah": { | |
"red": { | |
"costco": "no", | |
"other": { | |
"cheap": "no", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"pinot bianco": "yes", | |
"pinot blanc": "yes", | |
"pinot grigio": { | |
"white": { | |
"costco": "no", | |
"other": { | |
"cheap": "no", | |
"cheapest": "no", | |
"expensive": "yes" | |
} | |
} | |
}, | |
"pinot gris": "yes", | |
"pinot noir": { | |
"red": { | |
"costco": { | |
"expensive": "yes", | |
"royalty": "no" | |
}, | |
"other": { | |
"cheap": "yes", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
}, | |
"trader joe's": "no" | |
} | |
}, | |
"pinotage": "yes", | |
"prosecco": { | |
"sparkling": { | |
"other": { | |
"cheap": "no", | |
"expensive": "yes" | |
} | |
} | |
}, | |
"red blend": "yes", | |
"riesling": { | |
"white": { | |
"costco": "yes", | |
"other": { | |
"cheap": "yes", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"ros\u00e9": "no", | |
"sangiovese": { | |
"red": { | |
"costco": { | |
"royalty": "yes" | |
}, | |
"other": { | |
"cheap": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
}, | |
"trader joe's": "no" | |
} | |
}, | |
"sauvignon blanc": { | |
"white": { | |
"other": { | |
"cheap": "no", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"schiava": "yes", | |
"semillon": "no", | |
"shiraz": { | |
"dessert": "no", | |
"red": { | |
"costco": "yes", | |
"other": { | |
"cheap": "yes", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"st laurent": "yes", | |
"syrah": { | |
"red": { | |
"costco": "yes", | |
"other": { | |
"cheap": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
}, | |
"trader joe's": "no" | |
}, | |
"ros\u00e9": "no" | |
}, | |
"tannat": { | |
"red": { | |
"other": { | |
"cheap": "no", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"tempranillo": { | |
"red": { | |
"costco": "yes", | |
"other": { | |
"cheap": "no", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"torrontes": "yes", | |
"torront\u00e9s": "no", | |
"touriga nacional": "no", | |
"vermentino": "yes", | |
"vinho verde": "no", | |
"viognier": "yes", | |
"white": "yes", | |
"zinfandel": { | |
"port": "yes", | |
"red": { | |
"costco": "yes", | |
"other": { | |
"cheap": "yes", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"zweigelt": "no" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"agiorgitiko": "no", | |
"albarino": { | |
"white": { | |
"other": { | |
"cheap": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"amarone": "no", | |
"assyrtiko": "yes", | |
"barbera": "no", | |
"beaujolais": "yes", | |
"blend": { | |
"port": "yes", | |
"red": "yes", | |
"ros\u00e9": "no", | |
"sparkling": { | |
"other": { | |
"cheap": "no", | |
"royalty": "yes" | |
} | |
}, | |
"white": { | |
"other": { | |
"cheap": "yes", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"bonarda": "no", | |
"cabernet franc": "yes", | |
"cabernet sauvignon": "yes", | |
"carmenere": "no", | |
"chardonnay": "yes", | |
"chenin blanc": { | |
"white": { | |
"other": { | |
"cheap": "no", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"garganega": "yes", | |
"garnacha": "no", | |
"gavi": "yes", | |
"gewurztraminer": { | |
"dessert": "no", | |
"white": "yes" | |
}, | |
"grechetto": "yes", | |
"grenache": { | |
"dessert": "yes", | |
"red": "no", | |
"ros\u00e9": { | |
"other": { | |
"cheap": "no", | |
"expensive": "yes" | |
} | |
} | |
}, | |
"gruner veltliner": { | |
"white": { | |
"other": { | |
"expensive": "yes", | |
"royalty": "no" | |
} | |
} | |
}, | |
"lagrein": { | |
"red": { | |
"other": { | |
"expensive": "yes", | |
"royalty": "no" | |
} | |
} | |
}, | |
"macabeo": "no", | |
"malbec": "no", | |
"meritage": "yes", | |
"merlot": "yes", | |
"monastrell": "no", | |
"montepulciano": "no", | |
"moscatel": "yes", | |
"moscato": { | |
"dessert": "no", | |
"ros\u00e9": "no", | |
"sparkling": "yes", | |
"white": "yes" | |
}, | |
"moschofilero": "yes", | |
"mourvedre": "yes", | |
"muscat": "yes", | |
"nebbiolo": "yes", | |
"negroamaro": { | |
"red": { | |
"other": "yes", | |
"trader joe's": "no" | |
} | |
}, | |
"nero d'avola": { | |
"red": { | |
"other": "yes", | |
"trader joe's": "no" | |
} | |
}, | |
"petite sirah": "no", | |
"pinot bianco": "yes", | |
"pinot blanc": "yes", | |
"pinot grigio": "no", | |
"pinot gris": "yes", | |
"pinot noir": "no", | |
"pinotage": "yes", | |
"prosecco": { | |
"sparkling": { | |
"other": { | |
"cheap": "no", | |
"expensive": "yes" | |
} | |
} | |
}, | |
"red blend": "yes", | |
"riesling": "yes", | |
"ros\u00e9": "no", | |
"sangiovese": { | |
"red": { | |
"costco": "yes", | |
"other": { | |
"cheap": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
}, | |
"trader joe's": "no" | |
} | |
}, | |
"sauvignon blanc": { | |
"white": { | |
"other": { | |
"cheap": "no", | |
"cheapest": "no", | |
"expensive": "yes", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"schiava": "yes", | |
"semillon": "no", | |
"shiraz": { | |
"dessert": "no", | |
"red": "yes" | |
}, | |
"st laurent": "yes", | |
"syrah": "no", | |
"tannat": { | |
"red": { | |
"other": { | |
"cheap": "no", | |
"royalty": "yes" | |
} | |
} | |
}, | |
"tempranillo": "yes", | |
"torrontes": "yes", | |
"torront\u00e9s": "no", | |
"touriga nacional": "no", | |
"vermentino": "yes", | |
"vinho verde": "no", | |
"viognier": "yes", | |
"white": "yes", | |
"zinfandel": "yes", | |
"zweigelt": "no" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Characteristics -> Real Learn Prune | |
["trader joe's", 'red', 'shiraz', 'yes', 'cheap'] yes no yes | |
['other', 'sparkling', 'blend', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'tempranillo', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'tempranillo', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'torrontés', 'no', 'cheap'] no no no | |
['other', 'red', 'barbera', 'yes', 'royalty'] yes no no | |
["trader joe's", 'red', 'zinfandel', 'no', 'cheapest'] no no yes | |
['other', 'red', 'pinot noir', 'yes', 'royalty'] yes yes no | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'no', 'royalty'] no yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'white', 'blend', 'no', 'royalty'] no yes yes | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['costco', 'white', 'torrontés', 'no', 'cheap'] no no no | |
['other', 'white', 'blend', 'yes', 'expensive'] yes yes yes | |
['costco', 'red', 'meritage', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'riesling', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'syrah', 'yes', 'royalty'] yes yes no | |
['other', 'red', 'tempranillo', 'no', 'royalty'] no yes yes | |
["trader joe's", 'red', 'blend', 'no', 'cheap'] no no yes | |
['other', 'red', 'merlot', 'no', 'cheap'] no yes yes | |
['other', 'red', 'malbec', 'no', 'cheap'] no yes no | |
['costco', 'red', 'cabernet sauvignon', 'no', 'cheap'] no yes yes | |
['other', 'rosé', 'syrah', 'yes', 'royalty'] yes no no | |
['other', 'white', 'chardonnay', 'yes', 'royalty'] yes no yes | |
['other', 'dessert', 'muscat', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'zinfandel', 'no', 'cheapest'] no no yes | |
['other', 'red', 'malbec', 'no', 'cheap'] no yes no | |
['other', 'red', 'petite sirah', 'yes', 'cheap'] yes no no | |
['other', 'white', 'chardonnay', 'yes', 'royalty'] yes no yes | |
['other', 'red', 'freisa', 'yes', 'royalty'] yes no no | |
["trader joe's", 'red', 'aglianico', 'no', 'cheapest'] no no no | |
['other', 'red', 'malbec', 'yes', 'cheap'] yes yes no | |
['other', 'sparkling', 'blend', 'no', 'expensive'] no no no | |
['other', 'red', 'pinot noir', 'no', 'cheap'] no yes no | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'malbec', 'yes', 'cheap'] yes yes no | |
['other', 'red', 'tannat', 'yes', 'royalty'] yes yes yes | |
['other', 'rosé', 'blend', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'barbera', 'no', 'royalty'] no no no | |
['other', 'red', 'chianti', 'no', 'cheap'] no no no | |
['other', 'white', 'chardonnay', 'no', 'expensive'] no yes yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'rosé', 'agiorgitiko', 'yes', 'expensive'] yes no no | |
['other', 'white', 'chardonnay', 'yes', 'royalty'] yes no yes | |
['other', 'red', 'petite sirah', 'yes', 'cheap'] yes no no | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'gruner veltliner', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'petite sirah', 'yes', 'cheap'] yes no no | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'red', 'pinot noir', 'yes', 'royalty'] yes yes no | |
['costco', 'red', 'zinfandel', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'carmenere', 'yes', 'expensive'] yes yes no | |
['other', 'white', 'chardonnay', 'yes', 'royalty'] yes no yes | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'red', 'pinot noir', 'no', 'expensive'] no yes no | |
['other', 'white', 'sauvignon blanc', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'white', 'chardonnay', 'no', 'expensive'] no yes yes | |
['other', 'red', 'syrah', 'yes', 'expensive'] yes yes no | |
['costco', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'petite sirah', 'no', 'cheapest'] no no no | |
['other', 'red', 'tempranillo', 'yes', 'cheap'] yes no yes | |
['other', 'red', 'petite sirah', 'no', 'cheapest'] no no no | |
['costco', 'red', 'chianti', 'yes', 'expensive'] yes no no | |
['other', 'red', 'pinot noir', 'yes', 'royalty'] yes yes no | |
['other', 'red', 'blend', 'no', 'expensive'] no yes yes | |
['other', 'red', 'pinot noir', 'yes', 'royalty'] yes yes no | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['costco', 'red', 'garnacha', 'yes', 'expensive'] yes yes no | |
['other', 'white', 'pinot grigio', 'no', 'cheap'] no no no | |
['other', 'white', 'pinot bianco', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'pinot blanc', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'white', 'vinho verde', 'yes', 'cheap'] yes no no | |
['other', 'red', 'blend', 'no', 'royalty'] no yes yes | |
['other', 'white', 'roditis', 'no', 'royalty'] no yes yes | |
['other', 'white', 'chenin blanc', 'yes', 'cheapest'] yes no no | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'white', 'blend', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'malbec', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'shiraz', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'blend', 'no', 'royalty'] no yes yes | |
['costco', 'sparkling', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'red', 'malbec', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'tempranillo', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'merlot', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'blend', 'no', 'cheapest'] no yes yes | |
['other', 'white', 'sauvignon blanc', 'no', 'cheapest'] no no no | |
['other', 'white', 'sauvignon blanc', 'no', 'cheap'] no no no | |
['other', 'red', 'sangiovese', 'no', 'cheap'] no no no | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'sparkling', 'prosecco', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'red', 'malbec', 'yes', 'royalty'] yes yes no | |
['other', 'red', 'tempranillo', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'barbera', 'yes', 'expensive'] yes no no | |
['other', 'white', 'pinot grigio', 'no', 'cheap'] no no no | |
['other', 'white', 'assyrtico', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'albarino', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'riesling', 'no', 'cheapest'] no no yes | |
['other', 'red', 'cabernet sauvignon', 'no', 'cheapest'] no no yes | |
['other', 'white', 'sauvignon blanc', 'no', 'cheap'] no no no | |
['other', 'rosé', 'blend', 'no', 'expensive'] no yes no | |
['costco', 'red', 'cabernet sauvignon', 'no', 'expensive'] no no yes | |
['other', 'red', 'syrah', 'yes', 'cheap'] yes no no | |
['other', 'white', 'albarino', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'sauvignon blanc', 'no', 'cheapest'] no no no | |
['other', 'red', 'malbec', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'cabernet sauvignon', 'no', 'cheap'] no yes yes | |
['other', 'red', 'tempranillo', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'blend', 'no', 'expensive'] no yes yes | |
['other', 'white', 'moscato', 'no', 'cheapest'] no no yes | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'pinot noir', 'yes', 'expensive'] yes yes no | |
["trader joe's", 'red', 'blend', 'yes', 'cheap'] yes no yes | |
['other', 'red', 'xinomavro', 'no', 'royalty'] no no no | |
['other', 'red', 'syrah', 'no', 'cheap'] no no no | |
['other', 'red', 'malbec', 'yes', 'cheap'] yes yes no | |
['other', 'red', 'blend', 'no', 'royalty'] no yes yes | |
['costco', 'red', 'pinot noir', 'yes', 'royalty'] yes no no | |
['other', 'red', 'blaufrankisch', 'yes', 'royalty'] yes no no | |
['other', 'red', 'sangiovese', 'yes', 'royalty'] yes yes yes | |
['costco', 'red', 'cabernet sauvignon', 'no', 'cheap'] no yes yes | |
['other', 'red', 'cabernet sauvignon', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'riesling', 'yes', 'expensive'] yes yes yes | |
['other', 'sparkling', 'prosecco', 'no', 'cheap'] no no no | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'white', 'pinot gris', 'yes', 'cheap'] yes yes yes | |
['other', 'white', 'torrontés', 'yes', 'expensive'] yes no no | |
['other', 'red', 'cabernet sauvignon', 'no', 'royalty'] no yes yes | |
['other', 'red', 'meritage', 'yes', 'royalty'] yes no yes | |
['other', 'red', 'meritage', 'no', 'royalty'] no no yes | |
['other', 'red', 'cabernet franc', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['costco', 'red', 'tempranillo', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'cabernet sauvignon', 'no', 'expensive'] no yes yes | |
['other', 'red', 'tempranillo', 'no', 'expensive'] no yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
["trader joe's", 'red', 'sangiovese', 'yes', 'expensive'] yes no no | |
["trader joe's", 'red', 'blend', 'no', 'cheapest'] no yes yes | |
['costco', 'red', 'meritage', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'gruner veltliner', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'tempranillo', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'shiraz', 'yes', 'expensive'] yes yes yes | |
['other', 'sparkling', 'pinot noir', 'yes', 'expensive'] yes no no | |
['costco', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'cabernet sauvignon', 'no', 'cheap'] no yes yes | |
['other', 'red', 'aglianico', 'yes', 'expensive'] yes no no | |
['other', 'red', 'garnacha', 'no', 'cheap'] no yes no | |
['costco', 'red', 'blend', 'no', 'cheapest'] no yes yes | |
['other', 'rosé', 'blend', 'no', 'expensive'] no yes no | |
['other', 'red', 'shiraz', 'yes', 'expensive'] yes yes yes | |
["trader joe's", 'red', 'blend', 'no', 'cheapest'] no yes yes | |
['other', 'red', 'meritage', 'no', 'royalty'] no no yes | |
['other', 'red', 'sangiovese', 'no', 'cheap'] no no no | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'white', 'malagousia', 'yes', 'royalty'] yes yes yes | |
["trader joe's", 'red', 'blend', 'yes', 'cheap'] yes no yes | |
['other', 'rosé', 'pinotage', 'yes', 'cheap'] yes yes yes | |
['other', 'rosé', 'pinot noir', 'yes', 'expensive'] yes no no | |
['other', 'red', 'pinot noir', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'montepulciano', 'no', 'cheap'] no no no | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'garnacha', 'yes', 'cheap'] yes yes no | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'tannat', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'gruner veltliner', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['costco', 'red', 'garnacha', 'yes', 'cheap'] yes yes no | |
['other', 'white', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'red', 'primitivo', 'yes', 'royalty'] yes no no | |
['other', 'red', 'malbec', 'no', 'cheap'] no yes no | |
['other', 'sparkling', 'blend', 'yes', 'cheap'] yes no no | |
['costco', 'red', 'shiraz', 'no', 'expensive'] no yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'malbec', 'no', 'cheap'] no yes no | |
['other', 'white', 'chenin blanc', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'meritage', 'no', 'royalty'] no no yes | |
['other', 'red', 'cabernet sauvignon', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'tempranillo', 'no', 'royalty'] no yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'pinot noir', 'yes', 'royalty'] yes yes no | |
['other', 'white', 'chardonnay', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'malbec', 'no', 'cheap'] no yes no | |
['other', 'red', 'pinot noir', 'yes', 'cheap'] yes yes no | |
['other', 'red', 'blend', 'no', 'royalty'] no yes yes | |
['other', 'red', 'garnacha', 'yes', 'expensive'] yes no no | |
['other', 'red', 'pinot noir', 'no', 'royalty'] no yes no | |
["trader joe's", 'red', 'malbec', 'no', 'cheap'] no no no | |
['other', 'white', 'riesling', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'no', 'royalty'] no yes yes | |
["trader joe's", 'red', 'syrah', 'no', 'cheapest'] no no no | |
['other', 'red', 'merlot', 'yes', 'cheap'] yes yes yes | |
['costco', 'red', 'blend', 'no', 'expensive'] no yes yes | |
["trader joe's", 'red', 'amarone', 'yes', 'royalty'] yes no no | |
['other', 'red', 'shiraz', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'malbec', 'yes', 'royalty'] yes yes no | |
['other', 'red', 'cabernet sauvignon', 'no', 'cheap'] no yes yes | |
['other', 'white', 'pinot grigio', 'no', 'cheap'] no no no | |
["trader joe's", 'red', "nero d'avola", 'no', 'cheapest'] no no no | |
['other', 'red', 'merlot', 'no', 'cheap'] no yes yes | |
['other', 'white', 'friulano', 'yes', 'expensive'] yes yes yes | |
['other', 'rosé', 'blend', 'no', 'cheap'] no no no | |
['costco', 'red', 'montepulciano', 'no', 'expensive'] no no no | |
['other', 'white', 'sauvignon blanc', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'garnacha', 'yes', 'expensive'] yes no no | |
['other', 'red', 'pinot noir', 'no', 'cheap'] no yes no | |
['other', 'red', 'zweigelt', 'no', 'expensive'] no no no | |
['other', 'white', 'riesling', 'no', 'expensive'] no yes yes | |
['other', 'red', 'malbec', 'yes', 'cheap'] yes yes no | |
['other', 'white', 'pinot grigio', 'no', 'cheap'] no no no | |
['other', 'rosé', 'blend', 'yes', 'royalty'] yes no no | |
['other', 'red', 'meritage', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'zinfandel', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'tempranillo', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['costco', 'red', 'tempranillo', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'shiraz', 'no', 'cheap'] no yes yes | |
['other', 'rosé', 'cabernet franc', 'no', 'expensive'] no yes yes | |
['other', 'sparkling', 'blend', 'no', 'cheap'] no no no | |
['other', 'white', 'blend', 'no', 'cheapest'] no no no | |
["trader joe's", 'red', 'cabernet sauvignon', 'no', 'cheapest'] no no yes | |
['other', 'red', 'montepulciano', 'no', 'expensive'] no no no | |
['other', 'white', 'chardonnay', 'yes', 'expensive'] yes yes yes | |
["trader joe's", 'red', 'primitivo', 'no', 'cheapest'] no no no | |
['other', 'white', 'sauvignon blanc', 'no', 'cheap'] no no no | |
['other', 'red', 'bonarda', 'no', 'cheap'] no no no | |
['other', 'white', 'blend', 'no', 'expensive'] no yes yes | |
['other', 'red', 'malbec', 'no', 'expensive'] no yes no | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'malbec', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'tempranillo', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['other', 'sparkling', 'blend', 'no', 'cheap'] no no no | |
['other', 'sparkling', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'red', 'blend', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'blend', 'yes', 'cheap'] yes yes yes | |
['costco', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'no', 'royalty'] no yes yes | |
['other', 'white', 'sauvignon blanc', 'no', 'cheap'] no no no | |
['other', 'red', 'cabernet sauvignon', 'no', 'cheapest'] no no yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'malbec', 'no', 'expensive'] no yes no | |
['other', 'red', 'cabernet sauvignon', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'cabernet sauvignon', 'no', 'cheapest'] no no yes | |
['other', 'red', 'cabernet sauvignon', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'montepulciano', 'yes', 'expensive'] yes no no | |
['other', 'white', 'chardonnay', 'no', 'expensive'] no yes yes | |
['other', 'red', 'tempranillo', 'no', 'expensive'] no yes yes | |
['other', 'red', 'merlot', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'moscato', 'yes', 'royalty'] yes no yes | |
['other', 'red', 'blend', 'yes', 'cheap'] yes yes yes | |
['other', 'red', 'blend', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'blend', 'yes', 'expensive'] yes yes yes | |
['costco', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'sparkling', 'blend', 'no', 'cheapest'] no no no | |
['other', 'red', 'syrah', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'tempranillo', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
["trader joe's", 'red', 'blend', 'no', 'cheap'] no no yes | |
['other', 'white', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'white', 'torrontés', 'yes', 'expensive'] yes no no | |
['other', 'red', 'cabernet sauvignon', 'no', 'cheap'] no yes yes | |
['other', 'red', 'tempranillo', 'no', 'expensive'] no yes yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'rosé', 'tempranillo', 'yes', 'cheap'] yes no yes | |
['costco', 'red', 'pinot noir', 'yes', 'royalty'] yes no no | |
['costco', 'red', 'cabernet sauvignon', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'cabernet sauvignon', 'no', 'cheapest'] no no yes | |
['other', 'sparkling', 'blend', 'yes', 'expensive'] yes no no | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'red', 'cabernet sauvignon', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'garnacha', 'yes', 'cheap'] yes yes no | |
['other', 'red', 'cabernet sauvignon', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'zinfandel', 'no', 'royalty'] no yes yes | |
['other', 'white', 'pinot gris', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'graciano', 'yes', 'cheap'] yes no no | |
['other', 'red', 'shiraz', 'no', 'cheap'] no yes yes | |
['other', 'red', 'zinfandel', 'yes', 'expensive'] yes yes yes | |
['other', 'sparkling', 'blend', 'yes', 'royalty'] yes yes yes | |
["trader joe's", 'red', 'blend', 'no', 'cheapest'] no yes yes | |
['costco', 'red', 'sangiovese', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'shiraz', 'no', 'expensive'] no yes yes | |
['other', 'red', 'nebbiolo', 'no', 'royalty'] no yes yes | |
['other', 'red', 'sangiovese', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'chardonnay', 'yes', 'expensive'] yes yes yes | |
['other', 'rosé', 'blend', 'no', 'cheap'] no no no | |
['other', 'red', 'pinot noir', 'no', 'cheap'] no yes no | |
['other', 'white', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'white', 'chardonnay', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'viognier', 'no', 'cheap'] no yes yes | |
['other', 'white', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'rosé', 'blend', 'yes', 'cheap'] yes no no | |
['other', 'red', 'cabernet sauvignon', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'syrah', 'no', 'royalty'] no yes no | |
['other', 'red', 'meritage', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'grillo', 'no', 'expensive'] no yes yes | |
['other', 'red', 'shiraz', 'no', 'expensive'] no yes yes | |
['other', 'red', 'pinot noir', 'yes', 'cheap'] yes yes no | |
['other', 'rosé', 'syrah', 'yes', 'cheap'] yes no no | |
['other', 'red', 'pinot noir', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'syrah', 'yes', 'royalty'] yes yes no | |
['other', 'cider wine', 'cider wine', 'yes', 'expensive'] yes no no | |
['other', 'red', 'pinot noir', 'yes', 'royalty'] yes yes no | |
['other', 'rosé', 'blend', 'no', 'cheap'] no no no | |
['costco', 'red', 'malbec', 'no', 'cheap'] no yes no | |
['other', 'white', 'torrontés', 'no', 'cheap'] no no no | |
['other', 'white', 'albarino', 'no', 'expensive'] no yes yes | |
['other', 'red', 'syrah', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'cabernet sauvignon', 'no', 'cheapest'] no no yes | |
['other', 'red', 'malbec', 'yes', 'expensive'] yes yes no | |
['costco', 'red', 'carmenere', 'no', 'expensive'] no no no | |
['other', 'white', 'pinot grigio', 'no', 'cheap'] no no no | |
['other', 'white', 'sauvignon blanc', 'yes', 'royalty'] yes yes yes | |
['other', 'white', 'pinot grigio', 'no', 'cheap'] no no no | |
['costco', 'red', 'cabernet sauvignon', 'no', 'expensive'] no no yes | |
["trader joe's", 'white', 'riesling', 'no', 'cheapest'] no no yes | |
['other', 'white', 'torrontés', 'no', 'cheap'] no no no | |
['costco', 'red', 'cabernet sauvignon', 'yes', 'expensive'] yes no yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'cabernet franc', 'no', 'royalty'] no yes yes | |
['costco', 'port', 'blend', 'yes', 'expensive'] yes no yes | |
['other', 'red', 'blend', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'lagrein', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'carmenere', 'yes', 'expensive'] yes yes no | |
['other', 'red', 'cabernet sauvignon', 'yes', 'expensive'] yes yes yes | |
['costco', 'red', 'malbec', 'yes', 'cheap'] yes yes no | |
['other', 'white', 'sauvignon blanc', 'no', 'expensive'] no yes yes | |
['costco', 'red', 'malbec', 'no', 'cheapest'] no no no | |
['other', 'red', 'malbec', 'yes', 'royalty'] yes yes no | |
['other', 'white', 'torrontés', 'no', 'cheap'] no no no | |
['other', 'red', 'pinot noir', 'no', 'cheapest'] no no no | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'pinot noir', 'yes', 'royalty'] yes yes no | |
['other', 'red', 'pinot noir', 'no', 'cheap'] no yes no | |
['other', 'red', 'carmenere', 'no', 'cheap'] no no no | |
['costco', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'red', 'blend', 'yes', 'royalty'] yes yes yes | |
['other', 'dessert', 'moscato', 'yes', 'cheapest'] yes no no | |
['other', 'white', 'blend', 'yes', 'cheap'] yes yes yes | |
['costco', 'red', 'malbec', 'no', 'cheap'] no yes no | |
['other', 'red', 'blend', 'no', 'expensive'] no yes yes | |
['other', 'red', 'beaujolais', 'no', 'cheap'] no no yes | |
['other', 'sparkling', 'red blend', 'no', 'cheap'] no yes yes | |
['other', 'white', 'chardonnay', 'no', 'cheap'] no no yes | |
['other', 'red', 'tempranillo', 'no', 'royalty'] no yes yes | |
['other', 'red', 'tempranillo', 'no', 'royalty'] no yes yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'riesling', 'no', 'cheap'] no yes yes | |
['other', 'sparkling', 'blend', 'yes', 'cheap'] yes no no | |
['other', 'red', 'sangiovese', 'yes', 'cheap'] yes no no | |
['other', 'red', "nero d'avola", 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'sangiovese', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'sangiovese', 'no', 'royalty'] no yes yes | |
['other', 'white', 'chardonnay', 'no', 'cheapest'] no no yes | |
['other', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'sauvignon blanc', 'yes', 'royalty'] yes yes yes | |
['other', 'red', 'malbec', 'no', 'expensive'] no yes no | |
["trader joe's", 'red', 'tempranillo', 'no', 'cheapest'] no no yes | |
['other', 'red', 'pinot noir', 'yes', 'royalty'] yes yes no | |
['costco', 'red', 'cabernet sauvignon', 'no', 'expensive'] no no yes | |
['other', 'white', 'chenin blanc', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'garganega', 'no', 'expensive'] no yes yes | |
['other', 'red', 'malbec', 'no', 'cheap'] no yes no | |
['other', 'red', 'syrah', 'yes', 'expensive'] yes yes no | |
['other', 'white', 'vignoles', 'no', 'cheap'] no yes yes | |
['other', 'red', 'sagrantino', 'no', 'royalty'] no no no | |
['other', 'white', 'sauvignon blanc', 'no', 'cheap'] no no no | |
['other', 'red', 'blend', 'yes', 'royalty'] yes yes yes | |
['other', 'rosé', 'cabernet sauvignon', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'cabernet sauvignon', 'yes', 'expensive'] yes yes yes | |
['other', 'red', 'lagrein', 'no', 'royalty'] no no no | |
['other', 'white', 'vermentino', 'yes', 'expensive'] yes yes yes | |
['other', 'rosé', 'garnacha', 'no', 'royalty'] no no no | |
['costco', 'red', 'blend', 'yes', 'expensive'] yes yes yes | |
['other', 'white', 'pinot gris', 'yes', 'expensive'] yes yes yes | |
["trader joe's", 'red', 'blend', 'no', 'cheapest'] no yes yes | |
['other', 'red', 'blend', 'no', 'cheap'] no yes yes | |
['other', 'sparkling', 'moscato', 'no', 'cheap'] no yes yes | |
['other', 'white', 'sauvignon blanc', 'no', 'cheap'] no no no |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment