Skip to content

Instantly share code, notes, and snippets.

@tmathmeyer
Created March 16, 2021 06:16
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 tmathmeyer/acb8a5888076d1fee3e8554d59c052c0 to your computer and use it in GitHub Desktop.
Save tmathmeyer/acb8a5888076d1fee3e8554d59c052c0 to your computer and use it in GitHub Desktop.
class TypeTree(object):
def __init__(self, name, *children, append=False):
self._name = name
self._children = children or []
self._append = append
def GetAllTags(self):
result = set([self._name])
for child in self._children:
if not self._append:
result.update(child.GetAllTags())
else:
for c in child.GetAllTags():
result.add(f'{c}_{self._name}')
return result
def Iterate(self, tag_as=None) -> ('Tag', 'Parent'):
for child in self._children:
if not self._append:
yield (child._name, self._name)
yield from child.Iterate()
else:
child_name = f'{child._name}_{self._name}'
yield (child_name, self._name)
yield from child.Iterate(tag_as=child_name)
typetree = TypeTree('everything',
TypeTree('seafood',
TypeTree('shellfish',
TypeTree('processed'),
TypeTree('wild'),
TypeTree('frozen'),
TypeTree('fresh'),
TypeTree('farmed'),
TypeTree('valueAdded'), append=True),
TypeTree('halibut',
TypeTree('wild'),
TypeTree('frozen'),
TypeTree('fresh'),
TypeTree('valueAdded'), append=True),
TypeTree('whitefish',
TypeTree('processed'),
TypeTree('wild'),
TypeTree('frozen'),
TypeTree('fresh'),
TypeTree('farmed'),
TypeTree('valueAdded'), append=True),
TypeTree('finfish',
TypeTree('processed'),
TypeTree('wild'),
TypeTree('frozen'),
TypeTree('fresh'),
TypeTree('farmed'),
TypeTree('valueAdded'), append=True),
TypeTree('shrimp',
TypeTree('processed'),
TypeTree('wild'),
TypeTree('frozen'),
TypeTree('fresh'),
TypeTree('farmed'),
TypeTree('valueAdded'), append=True),
TypeTree('cephalopods',
TypeTree('processed'),
TypeTree('wild'),
TypeTree('frozen'),
TypeTree('valueAdded'), append=True),
TypeTree('salmon',
TypeTree('processed'),
TypeTree('wild'),
TypeTree('frozen'),
TypeTree('fresh'),
TypeTree('farmed'),
TypeTree('king'),
TypeTree('valueAdded'), append=True)),
TypeTree('beef',
TypeTree('processed'),
TypeTree('responsible'),
TypeTree('valueAdded'), append=True),
TypeTree('pork',
TypeTree('processed'),
TypeTree('responsible'),
TypeTree('valueAdded'), append=True),
TypeTree('lamb',
TypeTree('processed'),
TypeTree('responsible'),
TypeTree('valueAdded'), append=True),
TypeTree('mixed',
TypeTree('processed'),
TypeTree('responsible'),
TypeTree('valueAdded'), append=True),
TypeTree('poultry',
TypeTree('processed'),
TypeTree('responsible'),
TypeTree('valueAdded'), append=True),
TypeTree('not_meat'),
TypeTree('Garbage'))
def mfloat(s):
if s == 'inf':
return 0.0
if s == 'nan':
return 0.0
return float(s)
def CreateRows(file):
date_entry = {}
with open(file) as f:
for line in f.readlines():
date, upc, _, A, B, C, tags = line.strip().split(',')
if date not in date_entry:
date_entry[date] = {}
for tag in tags.split('|'):
if tag not in date_entry[date]:
date_entry[date][tag] = [
round(mfloat(A or '0'), 2),
round(mfloat(B or '0'), 2),
round(mfloat(C or '0'), 2),
0, 0, 0]
else:
date_entry[date][tag][0] = round(date_entry[date][tag][0] + mfloat(A or '0'), 2)
date_entry[date][tag][1] = round(date_entry[date][tag][1] + mfloat(B or '0'), 2)
date_entry[date][tag][2] = round(date_entry[date][tag][2] + mfloat(C or '0'), 2)
for date, data in date_entry.items():
for tag, values in data.items():
values[1] = values[0] / values[2] if values[2] else 0
tagmap = {tag:parent for tag,parent in typetree.Iterate()}
for date, data in date_entry.items():
for tag, values in data.items():
if tag not in tagmap:
continue
parent_values = data[tagmap[tag]]
for i in range(3):
if parent_values[i] != 0:
values[i+3] = round((values[i] / parent_values[i]) * 100.0, 2)
return date_entry
if __name__ == '__main__':
tagmap = {tag:parent for tag,parent in typetree.Iterate()}
csvorder = list(x for x,_ in typetree.Iterate() if x not in ('Garbage', 'not_meat'))
with open('output.csv', 'w') as f:
f.write(',everything,,')
for tag in csvorder:
f.write(f',{tag},(parent={tagmap[tag]}),,,,')
f.write('\n')
f.write('Date,Revenue Total,PPP Total,PoundageTotal')
for tag in csvorder:
f.write(',RevenueTotal,PPP Total,Poundage Total,Revenue %Parent,PPP %Parent,Poundage %Parent')
f.write('\n')
for date, v in CreateRows('pivot_table_partially_processed.csv').items():
f.write(date.split(' ')[0])
f.write(',')
f.write(','.join(str(v['everything'][i]) for i in range(3)))
for tag in csvorder:
try:
sep = ','.join(str(v[tag][i]) for i in range(6))
f.write(f',{sep}')
except:
f.write(',,,,,,')
f.write('\n')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment