swdata/request_success.py
2018-06-16 21:37:40 +08:00

127 lines
4.1 KiB
Python

import json
from matplotlib import pyplot as plt
from island.match import Match
from island.matches import Matches
from numpy import mean, std
import numpy as np
matches = Matches('wos-data-new-2')
max_round = 14
# c_req_succ = np.zeros(max_round-2)
# c_req = np.zeros(max_round-2)
# d_req_succ = np.zeros(max_round-2)
# d_req = np.zeros(max_round-2)
c_req_succ = np.zeros(max_round)
c_req = np.zeros(max_round)
d_req_succ = np.zeros(max_round)
d_req = np.zeros(max_round)
def is_cooperator(rows, pid):
m = 0
mall = 0
for r in rows:
if pid == r['a'] and r['act_a'] == 'C':
m += 1
mall += 1
elif pid == r['a'] and r['act_a'] == 'D':
mall += 1
elif pid == r['b'] and r['act_b'] == 'C':
m += 1
mall += 1
elif pid == r['b'] and r['act_b'] == 'D':
mall += 1
return m*2 >= mall
for i in range(max_round):
for j in range(len(matches.data)):
rows = matches.data[j].query('action', 'done').where(lambda x: x['rno'] == i+1).raw_data
calced = set()
for row in rows:
if row['a'] not in calced:
r = matches.data[j].query('action', 'request').where(lambda x: x['rno'] == i+2 and x['from'] == row['a']).raw_data
rs = matches.data[j].query('action', 'approve').where(lambda x: x['rno'] == i+2 and x['to'] == row['a']).raw_data
if is_cooperator(rows, row['a']):
c_req_succ[i] += len(rs)
c_req[i] += len(r)
else:
d_req_succ[i] += len(rs)
d_req[i] += len(r)
calced.add(row['a'])
if row['b'] not in calced:
r = matches.data[j].query('action', 'request').where(lambda x: x['rno'] == i+2 and x['from'] == row['b']).raw_data
rs = matches.data[j].query('action', 'approve').where(lambda x: x['rno'] == i+2 and x['to'] == row['b']).raw_data
if is_cooperator(rows, row['b']):
c_req_succ[i] += len(rs)
c_req[i] += len(r)
else:
d_req_succ[i] += len(rs)
d_req[i] += len(r)
calced.add(row['b'])
for i in range(len(c_req)):
if c_req[i] == 0:
c_req[i] = 0.1
if d_req[i] == 0:
d_req[i] = 0.1
c_req_succ_fr = c_req_succ / c_req
d_req_succ_fr = d_req_succ / d_req
print(c_req_succ)
print(c_req)
print(c_req_succ_fr)
print(d_req_succ)
print(d_req)
print(d_req_succ_fr)
req_succ_fr_mean = [mean(c_req_succ_fr), mean(d_req_succ_fr)]
req_succ_fr_sem = [std(c_req_succ_fr), std(d_req_succ_fr)]
req_succ = [c_req_succ_fr, d_req_succ_fr]
fig = plt.figure(figsize=(4, 3))
ax = fig.gca()
index = np.arange(2)
bar_width = 0.5
opacity = 1
error_config = {'ecolor': '0.3', 'capsize': 2, 'linewidth': 1}
# rects1 = ax.bar(index, req_succ_fr_mean, bar_width,
# alpha=opacity, color='#0984e3',
# yerr=req_succ_fr_sem, error_kw=error_config,
# label='C-Req-Success')
flier_marker = dict(markerfacecolor='w', marker='o', markersize=4, markeredgewidth=0.5)
mean_marker = dict(markerfacecolor='w', marker='s', markeredgecolor='#0984e3', markersize=5, markeredgewidth=1)
ax.boxplot(req_succ, showmeans=True, notch=True,
meanprops=mean_marker, flierprops=flier_marker,
whis=[0.35,99.65],
widths=0.4,
labels=['From Cooperator', 'From Defector'])
m1 = np.median(c_req_succ_fr)
m2 = np.median(d_req_succ_fr)
# i1 = np.subtract(*np.percentile(c_req_succ_fr, [75*0.98, 25*0.98]))
# i2 = np.subtract(*np.percentile(d_req_succ_fr, [75*0.98, 25*0.98]))
i1 = np.subtract(*np.percentile(c_req_succ_fr, [75, 25]))
i2 = np.subtract(*np.percentile(d_req_succ_fr, [75, 25]))
print('M=(%f, %f)' % (m1, m2))
print('IQR=(%f, %f)' % (i1, i2))
# ax.set_xlabel('Group')
ax.set_ylabel('Request Approval Rate')
# ax.set_title(' from ', fontsize='small', weight='semibold')
# ax.set_xticks(index)
# ax.set_ylim(0, 1)
# ax.set_xlim(-0.75, 1.75)
# ax.set_xticklabels(index+2)
# ax.legend()
fig.tight_layout()
plt.show()
# plt.savefig('graph/request_success.eps')