Seeing as you are new to python I have made a solution which doesn't incorporate third party utilities, such that you can learn python. This involves first grouping table entries into a list of dictionary of items of string and number types. I will leave the file reading to you
An empty entry from the main file would look like.
entries = [ {"Date":"", "ItemType":"", "Sales":int(), "Partner":""}, ... ]
I have made three functions to do exactly what you need.
filter_entries(entries, filter_key)
, returns a dictionary of
key:entry-list items based on entries where the entry-list[filter_key] values are all the same
expand_entries(entries, expand_key)
, returns an entry-list with the
entry-list[expand_key] is removed and replaced with all unique key:value pairs based on the
expand_key
merge_entries(entries, merge_key)
, returns an entry-list based on entries where all items with the same entries[merge_key] value are combined
:
def filter_entries(entries, filter_key):
unique_values = set( [e[expand_key] for e in entries])
filtered_entries = {}
for filter_value in unique_values:
filtered_entries [filter_value] = [e for e in in entries if e[filter_key] == filter_value]
return filtered_entries
def expand_entries(entries, expand_key):
unique_values = set( [e[expand_key] for e in entries])
new_entries = []
for entry in entries:
new_entries.append({key:value for key,value in entries.items() if not key == expand_key})
for new_key in unique_values:
new_entries[-1][new_key] = 1 if entry[expand_key] == new_key else 0
return new_entries
To merge entries, I would assert that string keys-values must be the same string. otherwise it is an error. ie merging proper values look like:
2014/01/01 A 100
2014/01/01 A 60
---------------------------------
2014/01/01 A 160
and a bad case looks like:
2014/01/01 A 100
2014/01/01 B 60
---------------------------------
Value error A , B
:
def merge_entries(entries, merge_key):
unique_keys = set( [e[merge_key] for e in entries])
new_entries = []
for key in unique_keys:
new_entry = None
for entry in [e for e in entries if e[merge_key] == key]:
# copy the style of the first entry with that key
if new_entry is None:
new_entry = {key:value for key,value in entry.items()}
for key,value in new_entry.items():
if not type(value) == str:
new_entry[key] = 0.0
for key,value in entry.items():
if type(value) == str:
if not new_entry[key] == value:
raise Exception("Cannot merge different string for Key {}: {}, {}".format(key,value, new_entry[key] ))
else:
new_entry[key] += value
new_entries.append(new_entry)
return new_entries
Finally with a little list comprehension the top level code is simple:
>>> entries = [ {"Date":"aaaa", "ItemType":"A", "Sales":10, "Partner":"P1"},
{"Date":"aaaa", "ItemType":"A", "Sales":15, "Partner":"P2"},
{"Date":"cccc", "ItemType":"A", "Sales":15, "Partner":"P2"},
{"Date":"bbbb", "ItemType":"A", "Sales":15, "Partner":"P2"},
{"Date":"bbbb", "ItemType":"B", "Sales":10, "Partner":"P3"},
{"Date":"bbbb", "ItemType":"B", "Sales":15, "Partner":"P2"},
{"Date":"cccc", "ItemType":"B", "Sales":10, "Partner":"P3"}]
>>> f_entries = filter_entries(entries, "ItemType")
>>> e_entries = {key:expand_entries(entries, "Partner") for key, entries in f_entries.items()}
>>> m_entries = {key:merge_entries(entries, "Date") for key, entries in e_entries.items()}
>>> for key in m_entries.keys():
print key
for entry in m_entries[key]:
print entry
A
{'Date': 'aaaa', 'P2': 1.0, 'P1': 1.0, 'ItemType': 'A', 'Sales': 25.0}
{'Date': 'cccc', 'P2': 1.0, 'P1': 0.0, 'ItemType': 'A', 'Sales': 15.0}
{'Date': 'bbbb', 'P2': 1.0, 'P1': 0.0, 'ItemType': 'A', 'Sales': 15.0}
B
{'Date': 'cccc', 'P2': 0.0, 'Sales': 10.0, 'ItemType': 'B', 'P3': 1.0}
{'Date': 'bbbb', 'P2': 1.0, 'Sales': 25.0, 'ItemType': 'B', 'P3': 1.0}
I'm sure with this form it wont be hard to write a table to a file!