Created
March 16, 2021 06:16
-
-
Save tmathmeyer/acb8a5888076d1fee3e8554d59c052c0 to your computer and use it in GitHub Desktop.
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
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