Skip to content

Instantly share code, notes, and snippets.

@kms70847
Last active June 8, 2021 00:10
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 kms70847/dc47b4c14bd2546387416e64a2c77540 to your computer and use it in GitHub Desktop.
Save kms70847/dc47b4c14bd2546387416e64a2c77540 to your computer and use it in GitHub Desktop.
import numpy as np
def to_transition_table(data):
keys = list(data)
table = [[0.0 for _ in keys] for _ in keys]
for i, row_label in enumerate(keys):
if data[row_label]:
neighbors = data[row_label]
else:
#nodes with no neighbors behave as if they are neighbors with all nodes. Including themselves, I guess?
neighbors = set(keys)
f = 1 / len(neighbors)
for j, col_label in enumerate(keys):
if col_label in neighbors:
table[j][i] = f
return keys, table
def largest_real_eig(m):
values, vectors = np.linalg.eig(m)
#thanks Andras
real_indices = np.isclose(values.imag, 0)
real_values = values[real_indices]
real_vectors = vectors[:, real_indices]
largest_real_index = real_values.argmax()
value = real_values[largest_real_index] # should be np.isclose(. , 1)
vector = real_vectors[:, largest_real_index]
return vector.real
def page_rank(data):
keys, table = to_transition_table(data)
table = np.array(table)
return dict(zip(keys, largest_real_eig(table)))
def add_missing_keys(data):
keys = set(item for value in data.values() for item in value)
for key in keys:
if key not in data:
data[key] = set()
return data
if __name__ == "__main__":
data = {"A": ["B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV"], "C": ["AX", "AY", "AZ", "D", "A", "F", "BA", "G", "H", "BB", "BC", "BD", "K", "L", "N", "BE", "BF", "O", "BG", "BH", "Q", "BI", "S", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "T", "BS", "X", "Z", "BT", "BU", "BV", "BX", "AB", "BY", "AH", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "AK", "BO"], "F": ["CL", "CM", "CN", "CO", "O", "CP", "CQ", "CR", "CS", "CT", "AI", "J", "BU", "N", "CU", "CV", "CX", "CY"], "O": ["CC", "AP", "CZ", "BN", "L", "DA", "DB", "C", "DC", "H", "DD", "DE", "DF", "DG", "DH", "DI", "AK", "DJ", "DK", "BU", "N", "J", "CB", "DL", "DM", "CX", "CY"], "N": ["DN", "C", "F", "G", "J", "L", "DD", "O", "CN", "BU", "DO", "AB", "DP", "DQ", "CA", "CM", "DR", "DS", "AV", "DT", "DU", "DV", "CY"], "L": ["DN", "DX", "BB", "DY", "DZ", "N", "EA", "BH", "BM", "X", "EB"], "BU": ["EC", "ED", "CN", "C", "EE", "J", "EF", "CU", "EG", "CV", "CY"], "G": ["EH", "DN", "J", "N", "O", "CN", "EI", "BT", "EG"], "J": ["EH", "G", "CN", "BY"], "CN": ["F", "G", "J", "N", "O", "AK"], "AK": ["F", "G", "J", "L", "N", "O", "CN", "EI", "Y", "AI", "EJ", "EK", "AT", "EL"], "H": ["EM", "EN", "EO", "EP", "EN", "BV", "EQ", "ER", "ES", "ET", "EU", "EV", "EX", "CY"], "X": ["BC", "EY", "E", "B", "DN", "C", "A", "F", "G", "BB", "EZ", "DY", "K", "L", "N", "DD", "BE", "FA", "FB", "Y", "Z", "BT", "AB", "FC", "FD", "Q"], "BT": ["L", "AY", "C", "DN", "FE", "F", "G", "H", "FF", "BB", "J", "N", "DD", "O", "DI", "X", "FG", "AB", "CR", "FH", "CC", "EG", "CF", "FI", "FJ"], "BB": ["L", "C", "DN", "DX", "FK", "FL", "ER", "BE", "BH", "BO", "FM", "BT", "CR", "FN", "CD", "FO", "FP", "AJ", "FQ", "AP", "FJ", "FR", "FS", "FT", "FU", "FV", "FX", "FY", "FZ", "GA", "GB"], "DD": ["G", "J", "K", "N", "O", "CF"], "EG": ["J", "GC", "GD", "CY"], "Q": [], "Z": [], "Y": ["B", "A", "K", "V", "X", "AA", "AM", "AO", "GE", "AQ", "GF"], "B": ["L", "A", "G", "K", "GG", "BE", "V", "X", "Y", "Z", "AH", "CG", "AQ"], "BE": ["GH", "GI", "GJ", "GK", "EZ", "CC", "GL", "GM", "GN", "GO", "Z", "GP", "GQ", "GR", "BH", "GS", "CF", "GT", "GU", "DZ", "GV", "EY", "GX", "BR", "FL", "FB", "GY", "L", "BN", "CI", "BA", "GZ", "BL", "FN", "HA", "I", "O", "HB", "HC", "HD", "HE", "HF", "CA", "DY", "HG", "HH", "R", "HI", "BP", "CR", "AE", "BZ", "C", "HJ", "HK", "AG", "P", "T", "HL", "HM", "HN", "FH", "E", "HO", "BX", "HP", "FP", "BY", "HQ", "HR", "BO", "BS", "HS", "HT", "HU", "HV", "HX", "B", "HY", "CE", "HZ", "AD", "X", "AY", "IA", "IB", "IC", "V", "BM", "AC", "ID", "IE", "IF", "BV", "IG", "H", "DD", "Q", "IH", "II", "AJ", "A", "IJ", "IK", "IL", "AX", "IM", "BT", "BC", "IN", "IO", "M", "Y", "IP", "IQ", "FA", "IR", "ER", "BB", "IS", "AZ", "BF", "EA", "S", "IT", "BI", "IU", "IV", "IX", "IY", "D", "U", "IZ", "JA", "JB", "JC", "F", "DI", "DQ", "K", "JD", "JE", "JF", "JG", "JH", "JI", "FF", "JJ", "JK", "J", "DJ", "JL", "FG", "CD", "BU", "JM", "N", "CG", "JN", "FC", "DX", "GG", "JO", "G", "EG", "JP", "CB", "JQ", "JR", "JS", "EI", "JT", "JU", "JV", "JX", "JY", "BJ", "JZ", "CX", "KA", "AA", "KB", "BK", "KC", "KD", "KE", "KF", "KG", "KH", "KI", "KJ", "KK", "KL", "KM", "KN", "KO", "KP", "KQ", "KR", "KS"], "V": ["L", "B", "A", "JP", "K", "BE", "BM", "IM", "AA", "HO", "AM"], "CC": ["L", "AZ", "DN", "F", "G", "EZ", "J", "N", "DD", "ER", "O", "CN", "HP", "EI", "BT", "FG", "KT", "CR", "JO", "FH", "AI", "EG", "FI", "KU", "ID", "AK", "DL", "CM", "EH", "KV"], "CR": ["L", "C", "DN", "D", "F", "G", "FF", "EZ", "HG", "J", "N", "DD", "GS", "O", "CN", "KX", "HP", "EI", "BT", "KY", "BU", "KZ", "LA", "CB", "CC", "IZ", "FJ"], "EI": ["DN", "G", "HG", "HP", "IM", "BU", "CR", "CC", "AI", "AK", "LB", "FJ", "CM", "LC", "LD", "LE", "LF", "LG", "AV", "LH", "LI"], "D": ["IY", "IV", "C", "F", "BA", "G", "N", "O", "CN", "BN", "JF", "LJ"], "BH": ["LK", "DN", "C", "GM", "DZ", "LL", "HC"], "BN": ["H", "IY", "IV", "C", "D", "F", "BA", "G", "DD", "O", "DI", "IX", "KX", "DJ", "JZ", "BT", "AB", "LM", "CB"], "CB": ["FL", "C", "F", "BA", "J", "N", "O", "CN", "BN", "HR", "GR", "CX", "CG", "LN", "DL"], "CX": ["F", "G", "N", "CN", "CB", "EH", "LO"], "BA": ["IV", "C", "D", "F", "G", "J", "O", "S", "CN", "LP", "CB", "LQ"], "EH": [], "HP": ["A", "LR", "IY", "JR", "LS", "LT", "LU", "LF", "LG", "LV", "CC", "N", "FZ", "AI", "CU", "CY"], "S": ["IY", "L", "FL", "EY", "AZ", "B", "C", "DN", "FE", "A", "F", "BA", "G", "FF", "BB", "EZ", "BD", "J", "DZ", "N", "DD", "BF", "O", "FA", "DI", "IX", "LX", "BL", "GK", "KX", "HP", "EI", "GI", "DJ", "BS", "LY", "BT", "FG", "LZ", "BU", "AB", "KZ", "BY", "AD", "CR", "MA", "HD", "MB", "BZ", "LA", "GR", "MC", "IP", "CB", "IZ", "CF", "MD"], "CF": ["L", "AY", "AZ", "DN", "C", "G", "N", "DD", "BE", "BT", "BU", "AH"], "AZ": ["L", "DN", "C", "D", "FE", "G", "EZ", "ME", "DZ", "N", "DD", "GS", "O", "S", "EI", "HR", "BT", "BU", "KT", "GV", "CF", "KU", "JR", "MF"], "EZ": ["MG", "DN", "F", "G", "J", "N", "O", "EI", "BU", "CR", "MH", "CX", "CC", "ID", "AP", "DL", "FJ", "LF"], "DI": [], "FJ": ["DY", "H", "L", "AX", "DN", "A", "F", "G", "DX", "BB", "EZ", "HG", "HQ", "K", "MI", "N", "ER", "BF", "R", "JK", "JX", "BL", "LS", "HP", "HL", "FM", "EI", "X", "BT", "AA", "GO", "GN", "AB", "GY", "AC", "AD", "DQ", "AF", "CR", "CC", "FN", "CD", "MJ", "CH", "CK", "FP", "HO", "AK", "MK", "ML", "GE", "AP", "AQ", "MM", "MN", "MO", "FJ", "MP", "MQ", "EK", "LC", "MR", "MS", "MT", "EH", "MU", "MV", "MX"], "AP": ["G", "O", "AK", "EJ", "EE", "J"], "IY": ["D", "F", "BA", "G", "MY", "J", "N", "BE", "O", "HP", "BN", "CR"], "ER": [], "DZ": ["L", "DN", "BB", "J", "N", "GS", "BH", "HC", "KA", "MZ", "FC", "NA"], "AQ": ["F", "L", "B", "A", "K", "BE", "V", "X", "Y", "AA", "AF", "CK", "AO", "NB", "GE", "AR", "GF"], "AY": ["E", "EY", "FF", "BC", "AZ", "D", "DN", "C", "F", "NC", "IY", "L", "AX", "B", "A", "G", "BB", "EZ", "GM", "ND", "DZ", "M", "N", "DD", "BE", "BF", "O", "BI", "BL", "BM", "IC", "EI", "T", "BS", "U", "X", "Y", "NE", "KY", "BU", "GN", "AB", "BY", "AC", "CR", "CA", "GR", "AI", "CD", "CE", "EG", "CF", "CG", "CH", "JR", "NF", "MF", "NG", "IE", "EH", "NH", "NH", "NI", "NJ"], "BF": [], "BL": ["NC", "AX", "HF", "JP", "R", "JK", "AC", "CH", "HM", "NK", "NL"], "BO": ["CM", "NM", "NN", "NO", "EE", "J", "EF", "AB", "GD", "NP", "NQ", "CY"], "BY": ["NR", "NS", "NT", "NU", "NV", "CN", "CO", "NX", "NY", "NZ", "OA", "OB", "KX", "OC", "OD", "OE", "OF", "OG", "IK", "OH", "IN", "GB", "OI", "OJ", "OK", "OL", "OM", "ON", "J", "OO", "OP", "OQ", "OR", "OS", "N", "AF", "CY"], "CG": ["AY", "C", "B", "K", "BE", "X", "Y", "EB", "Z", "IM", "AA", "JF", "AH", "CB"], "CM": [], "DJ": ["LX", "FF", "DN", "F", "L", "FE", "G", "J", "N", "O", "S", "OT", "CN", "EI", "NE"], "DL": [], "DY": ["GQ", "JT", "KK", "OU", "OV", "F", "GG", "L", "AX", "I", "FK", "GU", "K", "M", "OX", "OY", "BI", "FB", "BL", "BS", "OZ", "PA", "X", "IM", "DO", "GY", "DQ", "MB", "CA", "PB", "HI", "GX", "PC", "PD", "PE", "IL", "AN", "PF", "MM", "PG", "PH"], "FF": ["DN", "AY", "DH", "GD", "CY"], "FG": [], "GS": [], "HG": [], "IV": ["LL", "D", "DN", "F", "IY", "H", "PI", "BA", "G", "GM", "PJ", "N", "HE", "BH", "DI", "HC", "PK", "PL", "LX", "BN", "GI", "JZ", "FG", "KT", "PM", "LJ", "CC"], "BS": ["HD", "PN", "S", "J", "DJ", "CY"], "CA": ["PO", "EY", "BC", "AY", "GQ", "C", "JD", "F", "DY", "I", "JP", "GU", "PP", "M", "N", "PQ", "BI", "FB", "BL", "JH", "IC", "EI", "X", "IM", "BU", "AB", "HA", "AC", "DP", "AE", "DQ", "PR", "CB", "PS", "FN", "HU", "GX", "CJ", "IN", "PT", "PU", "HO", "PE", "AJ", "AK", "LB", "PV", "IE", "PX", "PY", "MM", "AR", "FJ", "PZ", "MQ", "QA", "QB", "MT", "QC", "QD", "LE", "QE", "LO", "FZ", "QF", "QG", "QH", "QI", "QJ", "QK", "QL", "ON", "QM", "QN", "QO", "QP", "QQ", "QR", "QS"], "BC": [], "BI": ["QT", "QC", "QU", "QV", "QX", "QY", "QZ", "GQ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "DY", "RH", "QY", "RI", "RJ", "PF", "RK", "FU", "RL", "AC", "RM", "RN", "OF", "RO", "RP", "RQ", "RR", "OK", "RS", "RT", "RU", "RV", "RX", "RY", "RZ", "SA", "SB", "SC", "SD", "SE", "SF", "CY"], "DQ": ["F", "IK", "DY", "L", "JY", "I", "SG", "N", "JU", "BK", "FB", "JH", "IC", "Y", "IO", "IM", "SH", "GY", "SI", "BY", "DP", "AF", "CA", "PS", "HI", "SJ", "CH", "GX", "SK", "IN", "HO", "PE", "KH", "AN", "PF", "MO", "FJ", "CM", "SL", "PZ", "SM", "SN", "PG", "QC", "FU", "QE", "SO", "SP", "SQ", "SR", "SB", "LF", "SS", "ST", "SU", "SV", "QK", "CS", "SX", "QN", "RA", "SY", "SZ", "RD", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TI", "TJ", "TK", "TL", "TM", "TN", "TO", "TP", "TQ", "TR"], "EY": ["BE", "X", "AC", "CA"], "HO": ["TS", "TT", "CA", "TU", "TV", "TX", "NP", "TY", "TZ"]}
data = add_missing_keys(data)
ranks = page_rank(data)
for k, v in sorted(ranks.items(), key=lambda t: (-t[1], t[0])):
print(f"{k}: {100*v:.2f}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment