Skip to content

Instantly share code, notes, and snippets.

@erinaceous
Last active January 2, 2016 15:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save erinaceous/8326735 to your computer and use it in GitHub Desktop.
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)
#!/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
#!/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)
{
"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"
}
{
"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"
}
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