Color Bands


1. Number of Color Bands

This analysis follows the conventional idea of color bands where a band is a series of cord of a given Ascher color, regardless of which cord group they belong to. The most commonly investigated color bands are pendant cord color bands of 4 or more equivalently colored bands.

2. Search Criteria:

For now, to keep things simple, and interesting, we limit ourselves to bands of 4 or more cords.

Minimum number of Cords in Color Band Number of Significant Khipu
2 344
3 242
4 191
5 161
6 138

3. Significance Criteria:

Significance is at least two color bands with at least four cords in the color band. It might be useful, at a later point to insist color bands be contiguous.

4. Summary Results:

Measure Result
Number of Khipus That Match 427 (66%)
Number of Significant Khipus 258 (40%)
Five most Interesting Khipu UR231, UR1032, AS069, UR190, UR087
Image Quilt Click here

5. Summary Charts:

Code
# Initialize plotly
import plotly
plotly.offline.init_notebook_mode(connected = False);

# Read in the Fieldmark and its associated dataframe and match dictionary
from fieldmark_color_bands import FieldmarkColorBands
aFieldmark = FieldmarkColorBands()
fieldmark_dataframe = aFieldmark.dataframes[0].dataframe
raw_match_dict = aFieldmark.raw_match_dict()
fieldmark_dataframe
Unnamed: 0 kfg_name num_color_bands average_color_band_size num_colors total_groups
0 0 AS001 1 14 1 4
1 1 AS002 0 0 0 2
2 2 AS003 1 7 1 2
3 3 AS004 2 8 2 7
4 4 AS005 5 4 2 11
... ... ... ... ... ... ...
649 649 UR1167 1 8 1 1
650 650 UR1175 0 0 0 45
651 651 UR1176 25 8 3 26
652 652 UR1179 1 4 1 10
653 653 UR1180 2 13 2 3

654 rows × 6 columns

Code
# Plot Matching khipu
import pandas as pd
import plotly.express as px
matching_khipus = aFieldmark.matching_khipus() 
matching_values = [raw_match_dict[aKhipuName] for aKhipuName in matching_khipus]
matching_df =  pd.DataFrame(list(zip(matching_khipus, matching_values)), columns =['KhipuName', 'Value'])
fig = px.bar(matching_df, x='KhipuName', y='Value', labels={"KhipuName": "Khipu Name", "Value": "Number of Color Bands", }, 
             title=f"Matching Khipu ({len(matching_khipus)}) for Number of Color Bands",  width=944, height=500).update_layout(showlegend=True).show()
Code
# Plot Significant khipu
import utils_khipu as ukhipu
significant_khipus = aFieldmark.significant_khipus()
significant_values = [raw_match_dict[aKhipuName] for aKhipuName in significant_khipus]
significant_df =  pd.DataFrame(list(zip(significant_khipus, significant_values)), columns =['KhipuName', 'Value'])
fig = px.bar(significant_df, x='KhipuName', y='Value', labels={"KhipuName": "Khipu Name", "Value": "Number of Color Bands", },
             title=f"Significant Khipu {ukhipu.pct_kfg_khipus(len(significant_khipus))} for Number of Color Bands", width=944, height=500).update_layout(showlegend=True).show()
Code
fig = (px.scatter(fieldmark_dataframe, 
                  x="num_color_bands", y="average_color_band_size", 
                  size=list(fieldmark_dataframe.num_color_bands.values),
                  color="total_groups",
                  labels={"size":"Number of Colors", 
                          "average_color_band_size":"Mean Number of Cords Per Band",
                          "num_color_bands":"Number of Color Bands"},
                  hover_data=['kfg_name'], 
                  title="<b>Color Bands</b>  Size is number of Color Bands",
                  width=944, height=950)
            .add_hline(y=6)
            .update_layout(showlegend=True).show()
      )

6. Exploratory Data Analysis

The most well-understood Color Bands that I know of, are the famous six-cord bands of the Santa River Valley khipus, decoded in part, by Manuel Medrano in 2018.

Let’s look at these six khipu - UR087, UR088, UR089, UR090, UR091, and UR092. In the above scatterplot, there is a horizontal line through the “six-corded” color bands, which are a key fieldmark of the Santa River Valley khipus.

Manuel Medrano proposes the following combination of six-cord color bands and ayllu/pachaca combinations. Note that a tributary is a person who pays tribute (generally in the form of labor)

Pachaca Tributaries Pachaca Tributaries
Cuyuchin 9 Cusca 7
Namus 18 Corongo 23
Ucore 32 Guauyan 41
Total Tributaries 59 Total Tributaries 71
Recto Cords 63 Verso Cords 70
Code
# Khipu Imports
import qollqa_chuspa as qc
import utils_loom as uloom

class SixBandColorGrouper():
    def __init__(self, aKhipu, min_band_size=6):
        self.khipu = aKhipu
        self.cord_list = aKhipu.pendant_cords()
        self.color_list = [aCord.main_color() for aCord in self.cord_list]
        self.band_colors = set(self.color_list)
        self.min_band_size = min_band_size
        
        color_split_function = lambda tuple_item: (tuple_item[0].main_color() != tuple_item[1].main_color())
        self.cord_bands = uloom.split_list(self.cord_list, split_function=color_split_function)
        
    def impute_is_recto_band(self, aBand):
        is_recto = False
        if aBand[0].is_recto_attachment(): is_recto = True
        elif aBand[0].is_verso_attachment(): is_recto = False
        elif aBand[0].attachment_type in {'?', 'Unknown'}:
            attachments = [aCord.attachment_type for aCord in aBand if aCord.attachment_type =='R']
            if len(attachments)>=2: is_recto = True
        else: is_recto = False
        return is_recto
            
    def impute_is_verso_band(self, aBand):
        is_verso = False
        if aBand[0].is_verso_attachment(): is_verso = True
        elif aBand[0].is_recto_attachment(): is_verso = False
        elif aBand[0].attachment_type in {'?', 'Unknown'}:
            if (len(aBand) == 6) and aBand[1].is_verso_attachment(): is_verso = True
            attachments = [aCord.attachment_type for aCord in aBand if aCord.attachment_type =='V']
            if len(attachments)>=2: is_verso = True
        else: is_verso = False
        return is_verso
    
    def recto_bands(self):
        return [aBand for aBand in self.cord_bands if len(aBand) >= self.min_band_size and aBand[0].is_recto_attachment()]

    def verso_bands(self):
        return [aBand for aBand in self.cord_bands if len(aBand) >= self.min_band_size and aBand[0].is_verso_attachment()] 
Code
# Load Santa River Valley khipus
from collections import Counter
santa_river_khipu_names = ['UR087', 'UR088', 'UR089', 'UR090', 'UR091', 'UR092']
khipu_dict, all_khipus = qc.fetch_khipus()
santa_khipus = [aKhipu for aKhipu in all_khipus if aKhipu.kfg_name() in santa_river_khipu_names]

all_recto_colors = []
all_verso_colors = []
for aKhipu in santa_khipus:
    band_grouper = SixBandColorGrouper(aKhipu, min_band_size=6)
    recto_bands = band_grouper.recto_bands() 
    verso_bands = band_grouper.verso_bands()
    recto_colors = [band[0].main_color() for band in recto_bands]
    all_recto_colors.append(recto_colors)
    verso_colors = [band[0].main_color() for band in verso_bands]
    all_verso_colors.append(verso_colors)
    recto_colors_counter = Counter(recto_colors)
    verso_colors_counter = Counter(verso_colors)
    six_band_colors = set(recto_colors + verso_colors)

    print(f"Khipu: {aKhipu.name()}: ({len(recto_bands)} Recto + {len(verso_bands)} Verso) = {len(recto_bands)+len(verso_bands)} Color Bands")
    print(f"\t{len(six_band_colors)} colors ({len(recto_colors_counter)}R/{len(verso_colors_counter)}V) - R: {recto_colors_counter.most_common()} | V: {verso_colors_counter.most_common()}")

all_recto_counter = Counter(uloom.flatten_list(all_recto_colors))
print(f"\n{len(all_recto_colors)} Most common recto colors): {all_recto_counter.most_common()}")
all_verso_counter = Counter(uloom.flatten_list(all_verso_colors))
print(f"{len(all_verso_counter)} Most common verso colors): {all_verso_counter.most_common()}")
Khipu: UR087: (42 Recto + 0 Verso) = 42 Color Bands
    5 colors (5R/0V) - R: [('YB', 14), ('AB', 10), ('RB', 10), ('W', 7), ('MB', 1)] | V: []
Khipu: UR088: (0 Recto + 6 Verso) = 6 Color Bands
    5 colors (0R/5V) - R: [] | V: [('AB:GG', 2), ('LG:AB', 1), ('W:GG', 1), ('AB', 1), ('BG:MB', 1)]
Khipu: UR089: (0 Recto + 31 Verso) = 31 Color Bands
    18 colors (0R/18V) - R: [] | V: [('W', 3), ('W:MB', 3), ('W:AB', 3), ('RB', 3), ('LG:AB', 3), ('AB', 3), ('AB:GG', 2), ('AB:G0', 1), ('W:KB', 1), ('MB', 1), ('BG:KB', 1), ('W:GA', 1), ('AB:BG', 1), ('AB:GL', 1), ('W:LG', 1), ('BL:RL', 1), ('W:MG', 1), ('RL', 1)]
Khipu: UR090: (3 Recto + 11 Verso) = 14 Color Bands
    9 colors (3R/8V) - R: [('YB', 1), ('W:AB:MG', 1), ('LG:AB', 1)] | V: [('W', 3), ('B', 2), ('RL', 1), ('YB', 1), ('W-RL', 1), ('W-KB', 1), ('RB', 1), ('LG:AB', 1)]
Khipu: UR091: (0 Recto + 15 Verso) = 15 Color Bands
    8 colors (0R/8V) - R: [] | V: [('W', 3), ('AB', 3), ('AB:LK', 2), ('W:RB', 2), ('YB', 2), ('RB', 1), ('W:MB', 1), ('RL', 1)]
Khipu: UR092: (9 Recto + 0 Verso) = 9 Color Bands
    5 colors (5R/0V) - R: [('W-LG', 2), ('AB', 2), ('W', 2), ('RB', 2), ('RL', 1)] | V: []

6 Most common recto colors): [('YB', 15), ('AB', 12), ('RB', 12), ('W', 9), ('W-LG', 2), ('MB', 1), ('W:AB:MG', 1), ('LG:AB', 1), ('RL', 1)]
26 Most common verso colors): [('W', 9), ('AB', 7), ('LG:AB', 5), ('RB', 5), ('AB:GG', 4), ('W:MB', 4), ('W:AB', 3), ('RL', 3), ('YB', 3), ('B', 2), ('AB:LK', 2), ('W:RB', 2), ('W:GG', 1), ('BG:MB', 1), ('AB:G0', 1), ('W:KB', 1), ('MB', 1), ('BG:KB', 1), ('W:GA', 1), ('AB:BG', 1), ('AB:GL', 1), ('W:LG', 1), ('BL:RL', 1), ('W:MG', 1), ('W-RL', 1), ('W-KB', 1)]

Manuel’s numbers differ from the computed values (the non-sequential ordering is from his paper): Why? As an example, in UR092, where Manuel counts 10, we only get nine because the 2nd banded color group’s first pendant attachment is unknown, and therefore does not qualify for computation. Note to self!

Khipu Recto (From Paper) Recto from Computation Verso from Paper Verso from Computation
UR087 48 42 0 0
UR092 10 9 0 0
UR088 0 0 9 6
UR089 0 0 34 31
UR091 0 0 15 15
UR090 5 3 12 11

7. Conclusion

In Manuel Medrano’s paper, the colors embodied in the khipu seem likely to refer to the first names of the tributaries (the taxpayers) of the those listed in these six census khipu. The bars each belong to a “tributary” - why six? You’ll have to read the paper :-) Nonetheless, between Manuel’s discovery that colors likely map to first names, the phonetic discoveries of the Mangas khipu by Sabine Hyland, and the Zipfian nature of color distribution, it seems quite likely that color can be a potential sign for a phonetic element - We have now have a verified example of where color-banding becomes a grouping mechanism for “names” of people.

There may be other khipus where color-banding becomes, possibly, the “names” of things? The obvious strategy would be to find out how many things there are in a category set S, giving us the category size n(S) and then find khipus with color bands of that category size n(S).