In [69]:
import networkx as nx
import matplotlib.pyplot as plt
from pandas import *
import csv
import os, os.path

os.chdir('/home/will/Dropbox/CircusInstruction/')

In [70]:
obj = ExcelFile('TrickNetwork.xls')
trick_data = obj.parse('Trick Names', index_col = 0)
trick_links = obj.parse('Trick Links')

In [71]:
G = nx.DiGraph()
G.add_nodes_from(trick_data.index)

In [72]:
edge_color_types = {
'Drop':'R',
'Roll':'C',
'Wrap':'B',
'Unwrap':'B',
'Twist':'C',
'Invert':'M',
'Side Lift':'Y',
'Climb Over':'G',
'Swing':'k'
}

edge_colors = {}


for num, row in trick_links.iterrows():
    if (row['Source'] not in trick_data.index) or (row['Destination'] not in trick_data.index):
        print 'Wrong in line', num+1, row
    else:
        G.add_edge(row['Source'], row['Destination'])
        edge_colors[(row['Source'], row['Destination'])] = edge_color_types.get(row['Transition'], 'k')
        if row['Reversible']:
            G.add_edge(row['Destination'], row['Source'])


Wrong in line 190 Source           Sitting
Destination    Back Roll
Transition           NaN
Reversible          True
Name: 189
Wrong in line 191 Source         Back Roll
Destination     Standing
Transition           NaN
Reversible          True
Name: 190

In [73]:
typ_colors = {
'Drop':'R',
'Climb':'G',
'Wrap':'B',
'Pose':'Y',
'Transition':'C'
}
node_colors = {}
for name, typ in zip(trick_data.index, trick_data['Type'].values):
    node_colors[name] = typ_colors[typ]
    
node_sizes = nx.degree(G)


#plt.savefig('TrickNetwork.png')

In [74]:
plt.figure(figsize = (40,40))
nx.draw_graphviz(G, alpha = 0.2, 
        node_color = [node_colors[n] for n in G.nodes()],
        node_size = [500*node_sizes[n] for n in G.nodes()],
        edge_color = [edge_colors.get(e, 'k') for e in G.edges()],
        scale = 500, iterations = 5000)

plt.savefig('TrickNetwork-tmp.png')
plt.close()

In [82]:
trap_network = G.subgraph(trick_data[trick_data['Trapeze']==1].index)
node_sizes = nx.degree(trap_network)
plt.figure(figsize = (40,40))
nx.draw_graphviz(trap_network, alpha = 0.2, 
        node_color = [node_colors[n] for n in trap_network.nodes()],
        node_size = [500*node_sizes[n] for n in trap_network.nodes()],
        edge_color = [edge_colors.get(e, 'k') for e in trap_network.edges()],
        scale = 500, iterations = 5000)

plt.savefig('Trap-TrickNetwork.png')
plt.close()

In [67]:
sum(1/x for x in dists.values() if x)/len(dists)


Out[67]:
3.748589078490378

In [68]:
dists


Out[68]:
{u'360 Drop': 0.2505175983436853,
 u'Aerial Dance Foot Locks': 0.2357812690293509,
 u'Aerial Dance Wraps': 0.2995512919696735,
 u'Airplane': 0.24977422268094443,
 u'Arrow Whip': 0.0,
 u'Back Balance': 0.2638680659670165,
 u'Backflip Drop': 0.22446376811594204,
 u'Beatbox Climb': 0.3313933584388908,
 u'Beehive Drop': 0.2232729788951678,
 u'Bellet': 0.2853352984524687,
 u'Bellet Drop': 0.2203505577054405,
 u'Bent Knee Drop': 0.21694307485432543,
 u'Bicycle Climb': 0.2689262397555216,
 u'Big Russian Climb': 0.3313933584388908,
 u'Butterfly Climb': 0.261409667836889,
 u'Candy Cane Climb': 0.2768878718535469,
 u'Catchers': 0.33804784354810546,
 u'Catchers to Sit': 0.21043478260869566,
 u'Clock Work Straddle Climb': 0.26060034997980885,
 u'Cookie Cutter': 0.2209289056259272,
 u'Crossback Straddle': 0.23381642512077294,
 u'Crucifix': 0.3038769423952284,
 u'Danger Wrap': 0.2630434782608696,
 u'Double Ankle Drop': 0.23845301145461265,
 u'Double Ankle Hang': 0.2872829796705743,
 u'Double Ankle Wrap': 0.2404968944099379,
 u'Double Crochet': 0.2863058266784975,
 u'Double Foot Lock': 0.2963870177587263,
 u'Double Knee Pinch': 0.2932888956218755,
 u'Double Star Drop': 0.2109621880788929,
 u'Emily Sit': 0.1887307467342562,
 u'Extreme Butterfly': 0.2058041883703625,
 u'Fake Hip Key': 0.2672187715665977,
 u'Fake Hip Key Climb': 0.24257611828091719,
 u'Flyer': 0.25979602791196993,
 u'French Climb': 0.31525810128643544,
 u'Front Balance': 0.3581868640148011,
 u'Front Dive': 0.2232729788951678,
 u'Full Monty': 0.1849976110845676,
 u'Georga Twist': 0.2293567112901315,
 u'HOCs Drop': 0.2963870177587263,
 u'HOCs Hang': 0.2520177037229888,
 u'Half Hip Key': 0.2630434782608696,
 u'Half Lock': 0.2922705314009662,
 u'Half Monty': 0.2287334593572779,
 u'Half Roll': 0.23316873419246056,
 u'Hand Drop': 0.27418212717745366,
 u'Hip Key': 0.35516419005687033,
 u'Hip Key Thread-through Climb': 0.30639795760482746,
 u'Invert': 0.336695652173913,
 u'Julia Split': 0.2268838626508848,
 u'Karate Climb': 0.35971757710888147,
 u'Lotus Drop': 0.1710851891127607,
 u'Lotus Sit': 0.20783682232957595,
 u'Meat Hook': 0.28151810382434206,
 u'Mini Bomb': 0.227497062279671,
 u'Moses Drop': 0.2853352984524687,
 u'No Lock Front Dive': 0.26060034997980885,
 u'Opposite Side Leg Descent': 0.2768878718535469,
 u'Paper Clip': 0.24187906046976515,
 u'Pike Beats': 0.3129141748828188,
 u'Reverse Russian Climb': 0.2834138486312399,
 u'Roll Around': 0.24187906046976515,
 u'Russian Climb': 0.23777941537705724,
 u'S-Wrap': 0.2902548725637181,
 u'Same Side Leg Descent': 0.35666912306558585,
 u'Shoe Fly Drop': 0.2211569276786668,
 u'Shooting Star Drop': 0.2211569276786668,
 u'Side Beats': 0.3129141748828188,
 u'Simple Climb': 0.2834138486312399,
 u'Simple-Simple Climb': 0.24977422268094443,
 u'Single Foot Lock': 0.32250541395968685,
 u'Sitting Loop': 0.28437132784958874,
 u'Slack Drop': 0.2902548725637181,
 u'Space Invaders Drop': 0.0,
 u'Spider Hang': 0.2984890533456676,
 u'Spider Wrap': 0.24469160768452985,
 u'Splits Roll Around': 0.23061346039309114,
 u'Squirrel Drop': 0.0,
 u'Standing': 0.4008281573498965,
 u'Star Drop': 0.2217016491754123,
 u'Sticky Crotch Climb': 0.32250541395968685,
 u'Straddle Climb': 0.2902548725637181,
 u'Superman': 0.19946424891819492,
 u'Switchback Climb': 0.24977422268094443,
 u'Swivel Hips': 0.35516419005687033,
 u'Thigh Drop': 0.21043478260869566,
 u'Toe Climb': 0.2932888956218755,
 u'Turn around Toe Climb': 0.22506393861892585,
 u'Twist to Knees': 0.2834138486312399,
 u'Two Foot Ankle Hang': 0.2268838626508848,
 u'Verakia': 0.25126541207008435,
 u'Wheel Downs': 0.2232729788951678}

In [ ]: