several changes
This commit is contained in:
@@ -1,198 +1,291 @@
|
||||
from re import sub
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import pandas as pd
|
||||
import scipy.stats as sp
|
||||
from IPython import embed
|
||||
|
||||
|
||||
def visit_times_to_float(fish_behavior, feeder_number):
|
||||
start_times = [] # ich baue Start- und Endzeiten in separate Listen um das nacher einfacher voneinander abziehen zu können
|
||||
end_times = []
|
||||
durations = []
|
||||
visit_times_column = 'feeder_%i_visit_times' % feeder_number
|
||||
times = fish_behavior[visit_times_column].values # Alle Zeiten für diesen einen feeder
|
||||
if len(times) > 0 and len(times[0].strip()) > 0:
|
||||
tuple_strings = times[0][1:-1].split('), ') # ich muss das Ganze splitten, weil mir die daten ganz komisch ausgegeben werden
|
||||
tuple_strings = list(map(lambda x: x[1:].strip(')'), tuple_strings))
|
||||
|
||||
for ts in tuple_strings:
|
||||
temp = ts.split(',') # tuple an der Kommastelle splitten
|
||||
if len(temp) == 0 or temp[0] == '': # wenn es keine Einträge gibt oder die Startzeit fehlt --> continue
|
||||
continue
|
||||
start_times.append(float(temp[0])) # Die Startzeiten an die Startliste anhängen
|
||||
if temp[1] == '': # Wenn die Endzeit fehlt: Null eintragen
|
||||
print("Endzeit fehlt!")
|
||||
end_times.append(start_times[-1] + 1/30) # nehmen wir mal an, der Fisch waere 1 Frame lang da gewesen
|
||||
else:
|
||||
end_times.append((float(temp[1]))) # Ansonsten an die Endliste anhängen
|
||||
durations.append(end_times[-1] - start_times[-1])
|
||||
return start_times, end_times, durations
|
||||
|
||||
|
||||
def get_visit_times(fish_behavior, day, subject, light_cond):
|
||||
subject_behavior_today = fish_behavior[(fish_behavior.day == day) & (fish_behavior.subject == subject)] # bastelt mir auch Kombis die es gar nicht gibt--> die müssten dann ja leer sein
|
||||
if len(subject_behavior_today) == 0:
|
||||
print("Problem für subject %s on Tag %s" % (subject, day))
|
||||
return None, None, None, None
|
||||
visit_times = np.zeros(8)
|
||||
feeder_in_darkness = np.zeros_like(visit_times, dtype=bool)
|
||||
all_light = [] # Visittimes die im Hellen stattgefunden haben
|
||||
all_dark = [] # Visittimes die im Dunkeln stattgefunden haben
|
||||
|
||||
for d in range(1, 9): # Holt den ganzen kladderadatsch aus der anderen csv Datei
|
||||
feeder_light_condition = "light" if (light_cond == "top" and d < 5) or (light_cond == "bottom" and d >= 5) else "dark"
|
||||
feeder_in_darkness[d - 1] = "dark" in feeder_light_condition
|
||||
_, _, durations = visit_times_to_float(subject_behavior_today, d)
|
||||
if len(durations) == 0: # Wenn die Durationliste für diesen Feeder leer sein sollte : setze nan ein
|
||||
visit_times[d - 1] = np.nan
|
||||
else:
|
||||
visit_times[d - 1] = np.median(durations) # Wenn die Liste länger als 0 ist --> mach mir nen Median
|
||||
|
||||
if feeder_light_condition == 'light':
|
||||
all_light.append(visit_times[d-1])
|
||||
else:
|
||||
all_dark.append(visit_times[d-1])
|
||||
return visit_times, np.nanmedian(all_light), np.nanmedian(all_dark), feeder_in_darkness
|
||||
|
||||
|
||||
def plot_trial_visit_times (fish_behavior, setup_config, days, subjects):
|
||||
x_val = [1, 2, 3, 4, 5, 6, 7, 8]
|
||||
|
||||
for day in days: # muss diese Schleife bauen, weil meine Funktion nur für einen Trial konzipiert ist
|
||||
fig = plt.figure(figsize=(7, 4))
|
||||
feeder_visists_axis = fig.add_subplot(1, 2, 1)
|
||||
boxplot_axis = fig.add_subplot(1,2,2)
|
||||
|
||||
light_duration = []
|
||||
dark_duration = []
|
||||
|
||||
for i, subject in enumerate(subjects):
|
||||
if subject not in setup_config.subject[setup_config['day'] == day].unique():
|
||||
print("subject %s was not recorded on day %s" % (subject, day))
|
||||
continue
|
||||
|
||||
light_cond = setup_config.dark[(setup_config['day'] == day) & (setup_config['subject'] == subject)].values[0]
|
||||
feeder_visit_times, med_light, med_dark, feeder_in_darkness = get_visit_times(fish_behavior, day, subject, light_cond)
|
||||
if feeder_visit_times is None:
|
||||
continue
|
||||
plot_visit_times = feeder_visit_times
|
||||
plot_visit_times[np.isnan(feeder_visit_times)] = 0.0
|
||||
feeder_visists_axis.scatter(x_val, plot_visit_times)
|
||||
|
||||
light_duration.append(med_light)
|
||||
dark_duration.append(med_dark)
|
||||
|
||||
light_duration = np.array(light_duration)
|
||||
dark_duration = np.array(dark_duration)
|
||||
title = '%s' % (day) # zwei Platzhalter für jeweils einen String
|
||||
feeder_visists_axis.set_xlabel('feeder_number')
|
||||
feeder_visists_axis.set_ylabel('median_visit_time')
|
||||
feeder_visists_axis.set_title(title)
|
||||
feeder_visists_axis.text(-0.1, 1.1, "A", transform=feeder_visists_axis.transAxes, fontsize=12, fontweight="bold")
|
||||
|
||||
boxplot_axis.boxplot([light_duration[~np.isnan(light_duration)],
|
||||
dark_duration[~np.isnan(dark_duration)]])
|
||||
boxplot_axis.text(-0.1, 1.1, "B", transform=boxplot_axis.transAxes, fontsize=12, fontweight="bold")
|
||||
plt.show()
|
||||
# return # damit ich im Moment nur eine Abbildung angezeigt bekomme... Löschen um alle nacheinander anzuzeigen oder zu speichern
|
||||
|
||||
|
||||
def all_feeder_visit_times(fish_behavior, setup_config, subject):
|
||||
subject_behavior = fish_behavior[fish_behavior.subject == subject]
|
||||
days = subject_behavior.day.unique()
|
||||
all_feeder_visits = np.zeros((8, len(days)))
|
||||
all_feeder_in_darkness = np.zeros_like(all_feeder_visits, dtype=bool)
|
||||
|
||||
for i, day in enumerate(days):
|
||||
light_cond = setup_config.dark[(setup_config['day'] == day) & (setup_config['subject'] == subject)].values[0]
|
||||
feeder_visit_times, _, _, feeder_in_darkness = get_visit_times(fish_behavior, day, subject, light_cond)
|
||||
if feeder_visit_times is None:
|
||||
print("Is NONE")
|
||||
continue
|
||||
all_feeder_visits[:, i] = feeder_visit_times
|
||||
all_feeder_in_darkness[:, i] = feeder_in_darkness
|
||||
|
||||
valid_visits = all_feeder_visits[~np.isnan(all_feeder_visits)]
|
||||
valid_feeder_in_darkness = all_feeder_in_darkness[~np.isnan(all_feeder_visits)]
|
||||
|
||||
return valid_visits, valid_feeder_in_darkness
|
||||
|
||||
|
||||
def plot_all_visit_times(fish_behavior, setup_config, subjects):
|
||||
fig = plt.figure(figsize=(5, 5))
|
||||
num_subplots = len(subjects) + 1
|
||||
cols = 2
|
||||
rows = num_subplots // 2 + num_subplots % 2
|
||||
|
||||
grand_total_light = []
|
||||
grand_total_dark = []
|
||||
for i, subject in enumerate(subjects):
|
||||
visit_times, feeder_in_darkness = all_feeder_visit_times(fish_behavior, setup_config, subject)
|
||||
grand_total_dark.extend(visit_times[feeder_in_darkness == True])
|
||||
grand_total_light.extend(visit_times[feeder_in_darkness == False])
|
||||
|
||||
axis = fig.add_subplot(rows, cols, i + 1)
|
||||
bp = axis.boxplot([visit_times[feeder_in_darkness == True], visit_times[feeder_in_darkness == False]], showfliers=False)
|
||||
axis.set_ylim([0, 10])
|
||||
axis.legend([bp["boxes"][0]], [subject], loc=1, frameon=False)
|
||||
axis.text(-0.1, 1.1, chr(65+i), transform=axis.transAxes, fontsize=12, fontweight="bold")
|
||||
|
||||
u, p = sp.mannwhitneyu(visit_times[feeder_in_darkness == True], visit_times[feeder_in_darkness == False])
|
||||
md = np.median(visit_times[feeder_in_darkness == True])
|
||||
sd = np.std(visit_times[feeder_in_darkness == True])
|
||||
ml = np.median(visit_times[feeder_in_darkness == False])
|
||||
sl = np.std(visit_times[feeder_in_darkness == False])
|
||||
print("%s, light: %.2f +- %.2f, dark: %.2f +- %.2f, u:%.3f, p: %.3f" % (subject, ml, sl, md, sd, u , p))
|
||||
|
||||
axis = fig.add_subplot(rows, cols, num_subplots)
|
||||
axis.boxplot([grand_total_dark, grand_total_light], showfliers=False)
|
||||
axis.set_ylim([0, 10])
|
||||
axis.text(-.01, 1.1, chr(65+num_subplots -1 ), transform=axis.transAxes, fontsize=12, fontweight="bold")
|
||||
u, p = sp.mannwhitneyu(grand_total_dark, grand_total_light)
|
||||
m = np.mean()
|
||||
print("%s, u:%.3f, p: %.3f" % ("grand total", u , p))
|
||||
plt.show()
|
||||
|
||||
|
||||
def feeder_visit_counts_per_day(fish_behavior, setup_config, subject):
|
||||
# filtern auf subjects
|
||||
subject_behavior = fish_behavior[fish_behavior.subject == subject]
|
||||
# fuer jeden Tag die bearbeiten
|
||||
days = subject_behavior.day.unique()
|
||||
feeder_visited = np.zeros((len(days), 8))
|
||||
for i, day in enumerate(days):
|
||||
subject_behavior_today = subject_behavior[subject_behavior.day == day]
|
||||
# fuer jeden Feeder die Besuche ermitteln
|
||||
for feeder_number in range(1,9):
|
||||
_, _, durations = visit_times_to_float(subject_behavior_today, feeder_number)
|
||||
feeder_visited[i, feeder_number - 1] = 1 if len(durations) > 0 else 0
|
||||
return feeder_visited
|
||||
|
||||
|
||||
def plot_feeder_visit_counts_per_day(fish_behavior, setup_config):
|
||||
subjects = fish_behavior.subject.unique()
|
||||
|
||||
fig = plt.figure()
|
||||
|
||||
for i, subject in enumerate(subjects):
|
||||
feeder_visited = feeder_visit_counts_per_day(fish_behavior, setup_config, subject)
|
||||
axis = fig.add_subplot(len(subjects), 1, i + 1)
|
||||
axis.plot(np.arange(feeder_visited.shape[0]), np.sum(feeder_visited, axis=1), marker="*", label=subject)
|
||||
axis.set_ylim([0, 8.5])
|
||||
axis.legend()
|
||||
# add pearson correlation
|
||||
plt.show()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
#df = pd.read_csv(r'C:\Users\marie\Documents\UNI\7.Semester\Betschler\Skriptschnickschnack\csv_dateien\feeder_visits.csv', index_col=0, sep=';')
|
||||
#df2 = pd.read_csv(r'C:\Users\marie\Documents\UNI\7.Semester\Betschler\Skriptschnickschnack\csv_dateien\setup_configurations.csv', index_col=0, sep=';')
|
||||
fish_behavior = pd.read_csv("../data/feeder_visits.csv", index_col=0, sep=';')
|
||||
setup_configuration = pd.read_csv('../data/setup_configurations.csv', index_col=0, sep=';')
|
||||
|
||||
days = fish_behavior.day.unique()
|
||||
subjects = fish_behavior.subject.unique()
|
||||
#plot_trial_visit_times(fish_behavior, setup_configuration, days, subjects)
|
||||
plot_all_visit_times(fish_behavior, setup_configuration, subjects)
|
||||
plot_feeder_visit_counts_per_day(fish_behavior, setup_configuration)
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import pandas as pd
|
||||
import scipy.stats as st
|
||||
from IPython import embed
|
||||
|
||||
|
||||
def visit_times_to_float(fish_behavior, feeder_number):
|
||||
start_times = [] # ich baue Start- und Endzeiten in separate Listen um das nacher einfacher voneinander abziehen zu können
|
||||
end_times = []
|
||||
durations = []
|
||||
visit_times_column = 'feeder_%i_visit_times' % feeder_number
|
||||
times = fish_behavior[visit_times_column].values # Alle Zeiten für diesen einen feeder
|
||||
if len(times) > 0 and len(times[0].strip()) > 0:
|
||||
tuple_strings = times[0][1:-1].split('), ') # ich muss das Ganze splitten, weil mir die daten ganz komisch ausgegeben werden
|
||||
tuple_strings = list(map(lambda x: x[1:].strip(')'), tuple_strings))
|
||||
|
||||
for ts in tuple_strings:
|
||||
temp = ts.split(',') # tuple an der Kommastelle splitten
|
||||
if len(temp) == 0 or temp[0] == '': # wenn es keine Einträge gibt oder die Startzeit fehlt --> continue
|
||||
continue
|
||||
start_times.append(float(temp[0])) # Die Startzeiten an die Startliste anhängen
|
||||
if temp[1] == '': # Wenn die Endzeit fehlt: Null eintragen
|
||||
print("Endzeit fehlt!")
|
||||
end_times.append(start_times[-1] + 1/30) # nehmen wir mal an, der Fisch waere 1 Frame lang da gewesen
|
||||
else:
|
||||
end_times.append((float(temp[1]))) # Ansonsten an die Endliste anhängen
|
||||
durations.append(end_times[-1] - start_times[-1])
|
||||
return start_times, end_times, durations
|
||||
|
||||
|
||||
def get_visit_times(fish_behavior, day, subject, light_cond):
|
||||
# print(day, subject)
|
||||
subject_behavior_today = fish_behavior[(fish_behavior.day == day) & (fish_behavior.subject == subject)] # bastelt mir auch Kombis die es gar nicht gibt--> die müssten dann ja leer sein
|
||||
visit_times = np.zeros(8)
|
||||
all_light = [] # Visittimes die im Hellen stattgefunden haben
|
||||
all_dark = [] # Visittimes die im Dunkeln stattgefunden haben
|
||||
|
||||
for d in range(1, 9): # Holt den ganzen kladderadatsch aus der anderen csv Datei
|
||||
feeder_light_condition = "light" if (light_cond == "top" and d < 5) or (light_cond == "bottom" and d >= 5) else "dark"
|
||||
_, _, durations = visit_times_to_float(subject_behavior_today, d)
|
||||
if len(durations) == 0: # Wenn die Durationliste für diesen Feeder leer sein sollte : setze nan ein
|
||||
visit_times[d - 1] = np.nan
|
||||
else:
|
||||
visit_times[d - 1] = np.median(durations) # Wenn die Liste länger als 0 ist --> mach mir nen Median
|
||||
|
||||
if feeder_light_condition == 'light':
|
||||
all_light.append(visit_times[d-1])
|
||||
else:
|
||||
all_dark.append(visit_times[d-1])
|
||||
return visit_times, np.nanmedian(all_light), np.nanmedian(all_dark)
|
||||
|
||||
|
||||
def plot_trial_visit_times (fish_behavior, setup_config, days, subjects):
|
||||
x_val = [1, 2, 3, 4, 5, 6, 7, 8]
|
||||
|
||||
for day in days: # muss diese Schleife bauen, weil meine Funktion nur für einen Trial konzipiert ist
|
||||
fig = plt.figure(figsize=(7, 4))
|
||||
feeder_visists_axis = fig.add_subplot(1, 2, 1)
|
||||
boxplot_axis = fig.add_subplot(1,2,2)
|
||||
|
||||
light_duration = []
|
||||
dark_duration = []
|
||||
|
||||
for i, subject in enumerate(subjects):
|
||||
if subject not in setup_config.subject[setup_config['day'] == day].unique():
|
||||
print("subject %s was not recorded on day %s" % (subject, day))
|
||||
continue
|
||||
|
||||
light_cond = setup_config.dark[(setup_config['day'] == day) & (setup_config['subject'] == subject)].values[0]
|
||||
feeder_visit_times, med_light, med_dark = get_visit_times(fish_behavior, day, subject, light_cond)
|
||||
plot_visit_times = feeder_visit_times
|
||||
plot_visit_times[np.isnan(feeder_visit_times)] = 0.0
|
||||
feeder_visists_axis.scatter(x_val, plot_visit_times)
|
||||
|
||||
light_duration.append(med_light)
|
||||
dark_duration.append(med_dark)
|
||||
|
||||
light_duration = np.array(light_duration)
|
||||
dark_duration = np.array(dark_duration)
|
||||
title = '%s' % (day) # zwei Platzhalter für jeweils einen String
|
||||
feeder_visists_axis.set_xlabel('feeder_number')
|
||||
feeder_visists_axis.set_ylabel('median_visit_time')
|
||||
feeder_visists_axis.set_title(title)
|
||||
boxplot_axis.boxplot([light_duration[~np.isnan(light_duration)],
|
||||
dark_duration[~np.isnan(dark_duration)]])
|
||||
#print(light_cond)
|
||||
plt.show()
|
||||
|
||||
def get_feeder_risks(data, feeder_count=8):
|
||||
risks = np.zeros(8)
|
||||
for f in range(1, 9):
|
||||
r_name = "feeder_%i_risk" % f
|
||||
risks[f-1] = data[r_name].values[0]
|
||||
return risks
|
||||
|
||||
|
||||
def analyze_feeder_risk(behavior_data, subjects, days, limit=400):
|
||||
all_results = []
|
||||
for subject in subjects:
|
||||
for day in days:
|
||||
boldness = {}
|
||||
data = behavior_data[(behavior_data.subject == subject) & (behavior_data.day == day)]
|
||||
if len(data) == 0:
|
||||
continue
|
||||
feeder_risks = get_feeder_risks(data)
|
||||
avg_risk = np.mean(feeder_risks)
|
||||
risks = []
|
||||
times = []
|
||||
for feeder in range(1, 9):
|
||||
st, _, _ = visit_times_to_float(data, feeder)
|
||||
risks.extend([feeder_risks[feeder-1]] * len(st))
|
||||
times.extend(st)
|
||||
risks = np.array(risks)
|
||||
times = np.array(times)
|
||||
risks = risks[times < limit]
|
||||
times = times[times < limit]
|
||||
sorted_risks = risks[np.argsort(times)]
|
||||
sorted_times = times[np.argsort(times)]
|
||||
|
||||
boldness["subject"] = subject
|
||||
boldness["day"] = day
|
||||
boldness["day_number"] = int(day.split("_")[-1])
|
||||
boldness["avg_risk"] = avg_risk
|
||||
boldness["avg_risk_dark"] = np.mean(feeder_risks[feeder_risks < 1.0])
|
||||
boldness["avg_risk_light"] = np.mean(feeder_risks[feeder_risks >= 1.0])
|
||||
boldness["feeder_risks"] = feeder_risks
|
||||
boldness["sorted_risks"] = sorted_risks
|
||||
boldness["sorted_times"] = sorted_times
|
||||
boldness["total_risk"] = np.sum(sorted_risks)
|
||||
all_results.append(boldness)
|
||||
|
||||
return pd.DataFrame(all_results)
|
||||
|
||||
|
||||
def plot_risk_per_day(data, subjects):
|
||||
for subject in subjects:
|
||||
fig = plt.figure(figsize=(5, 5))
|
||||
ax1 = fig.add_subplot(3,1,1)
|
||||
ax2 = fig.add_subplot(3,1,2)
|
||||
ax3 = fig.add_subplot(3,1,3)
|
||||
|
||||
subject_data = data[data.subject == subject]
|
||||
days = subject_data.day_number.values
|
||||
trs = subject_data.total_risk.values
|
||||
x = subject_data.sorted_risks.values
|
||||
num_visits = np.zeros(x.shape[0])
|
||||
for i in range(x.shape[0]):
|
||||
num_visits[i] = len(x[i])
|
||||
avg_feeder_risks = subject_data.avg_risk.values
|
||||
avg_feeder_risks_dark = subject_data.avg_risk_dark.values
|
||||
|
||||
trs = trs[np.argsort(days)]
|
||||
num_visits = num_visits[np.argsort(days)]
|
||||
avg_feeder_risks = avg_feeder_risks[np.argsort(days)]
|
||||
avg_feeder_risks_dark = avg_feeder_risks_dark[np.argsort(days)]
|
||||
days = days[np.argsort(days)]
|
||||
|
||||
m, n, r, p, _ = st.linregress(days, trs)
|
||||
ax1.plot(days, trs, marker=".", label=subject)
|
||||
ax1.plot(days, m * days + n, label="r: %.2f, p:%.3f" % (r, p))
|
||||
ax1.legend(fontsize=7)
|
||||
ax1.set_ylim([0, 1.2*max(trs)])
|
||||
ax1.set_ylabel("total risk", fontsize=9)
|
||||
|
||||
ax2.plot(days, trs/num_visits, marker=".", label=subject)
|
||||
m, n, r, p, _ = st.linregress(days, trs/num_visits)
|
||||
ax2.plot(days, m * days + n, label="r: %.2f, p:%.3f" % (r, p))
|
||||
ax2.set_ylim([0, 2])
|
||||
ax2.set_ylabel("avg. risk per visit", fontsize=9)
|
||||
ax2.plot(days, avg_feeder_risks, ls="dashed", lw=0.5, color="darkgreen", label="avg feeder risk")
|
||||
ax2.legend(fontsize=7)
|
||||
|
||||
ax3.plot(days, trs/num_visits/avg_feeder_risks, marker=".", label="")
|
||||
m, n, r, p, _ = st.linregress(days, trs/num_visits/avg_feeder_risks)
|
||||
t, p = st.ttest_1samp(trs/num_visits/avg_feeder_risks - avg_feeder_risks_dark/avg_feeder_risks, 0)
|
||||
ax3.plot(days, m * days + n, label="r: %.2f, p:%.3f" % (r, p))
|
||||
ax3.plot(days, avg_feeder_risks_dark/avg_feeder_risks, color="dodgerblue", ls="dashed", lw=0.5, label="avg. feeder risk dark")
|
||||
ax3.hlines(1.0, min(days), max(days), ls="dashed", color="darkgreen", lw=0.5, zorder=0, label="avg. feeder risk")
|
||||
ax3.set_ylim([0.0, 1.5])
|
||||
ax3.set_xlim([min(days), max(days)])
|
||||
ax3.legend(fontsize=7)
|
||||
ax3.set_xlabel("experimental days", fontsize=9)
|
||||
ax3.set_ylabel(r"$\frac{avg.\;risk\; per\;visit}{avg.\; feeder\; risk}$", fontsize=9)
|
||||
ax3.text(0.05, 0.05, "one sampled t-test, p: %.3f, t: %.3f" % (p, t), ha="left", fontsize=9, transform=ax3.transAxes)
|
||||
|
||||
fig.subplots_adjust(left=0.15, bottom=0.09, top=0.975, right=0.975, hspace=0.2)
|
||||
fig.savefig("risk_per_day_%s.pdf" % subject)
|
||||
plt.close()
|
||||
|
||||
|
||||
def compare_risks_per_subject(data, subjects):
|
||||
total_risks = []
|
||||
total_risks_rel = []
|
||||
for subject in subjects:
|
||||
subject_data = data[data.subject == subject]
|
||||
|
||||
days = subject_data.day_number.values
|
||||
trs = subject_data.total_risk.values
|
||||
x = subject_data.sorted_risks.values
|
||||
num_visits = np.zeros(x.shape[0])
|
||||
for i in range(x.shape[0]):
|
||||
num_visits[i] = len(x[i])
|
||||
trs = trs[np.argsort(days)]
|
||||
num_visits = num_visits[np.argsort(days)]
|
||||
days = days[np.argsort(days)]
|
||||
|
||||
total_risks.append(trs)
|
||||
total_risks_rel.append(trs/num_visits)
|
||||
|
||||
fig = plt.figure(figsize=(5, 5))
|
||||
ax1 = fig.add_subplot(2,1,1)
|
||||
ax2 = fig.add_subplot(2,1,2)
|
||||
|
||||
ax1.boxplot(total_risks, showfliers=False)
|
||||
ax1.set_xticklabels("")
|
||||
ax1.set_ylabel("total risk", fontsize=9)
|
||||
|
||||
ax2.boxplot(total_risks_rel, showfliers=False)
|
||||
ax2.set_xticklabels(subjects, fontsize=9, rotation=45)
|
||||
ax2.set_ylabel("risk per visit", fontsize=9)
|
||||
ax2.set_ylim([0, 1])
|
||||
|
||||
fig.subplots_adjust(left=0.1, right=0.975, top=0.975, bottom=0.15, hspace=0.2)
|
||||
fig.savefig("total_risk_comparison.pdf")
|
||||
plt.close()
|
||||
|
||||
|
||||
def plot_risk_over_time(data, subjects):
|
||||
all_slopes = []
|
||||
for subject in subjects:
|
||||
slopes = []
|
||||
subject_data = data[data.subject == subject]
|
||||
fig = plt.figure(figsize=(5, 5))
|
||||
ax1 = fig.add_subplot(2,1,1)
|
||||
ax2 = fig.add_subplot(2,1,2)
|
||||
|
||||
days = subject_data.day.values
|
||||
day_numbers = subject_data.day_number.values
|
||||
risks = subject_data.sorted_risks.values
|
||||
times = subject_data.sorted_times.values
|
||||
sort_indices = np.argsort(day_numbers)
|
||||
days = days[np.argsort(days)]
|
||||
for index in sort_indices:
|
||||
day = days[index]
|
||||
day_times = times[index]
|
||||
day_risks = risks[index]
|
||||
m, n, _, _, _ = st.linregress(day_times, np.cumsum(day_risks))
|
||||
slopes.append(m)
|
||||
l = ax1.plot(day_times, np.cumsum(day_risks), marker=".", lw=0.1, label=day)
|
||||
ax1.plot(day_times, m * day_times + n, lw=1, color=l[0].get_color())
|
||||
|
||||
ax1.set_xlabel("time [s]")
|
||||
ax1.set_ylabel("risk taken")
|
||||
ax1.text(0.0, 1.05, subject, transform=ax1.transAxes, fontsize=9, fontweight="bold")
|
||||
ax2.scatter(day_numbers, slopes, marker="o", label="slopes")
|
||||
m, n, r, p, _ = st.linregress(day_numbers, slopes)
|
||||
ax2.plot(day_numbers, m * day_numbers + n, label="r: %.2f, p: %.3f" % (r, p))
|
||||
ax2.set_xlabel("experimental day", fontsize=9)
|
||||
ax2.set_ylabel("slope [risk/s]", fontsize=9)
|
||||
ax2.set_ylim([0, 0.15])
|
||||
ax2.legend(fontsize=7)
|
||||
fig.subplots_adjust(left =0.15, top=0.95, right=0.975, bottom=0.09, hspace=0.25)
|
||||
fig.savefig("risk_over_time_%s.pdf" % subject)
|
||||
plt.close()
|
||||
|
||||
all_slopes.append(slopes)
|
||||
fig = plt.figure(figsize=(3.5, 3.5))
|
||||
ax = fig.add_subplot(111)
|
||||
ax.boxplot(all_slopes, showfliers=False)
|
||||
ax.set_ylabel("slope [risk/s]")
|
||||
ax.set_xticklabels(subjects, fontsize=9, rotation=45)
|
||||
fig.subplots_adjust(left=0.2, right=0.975, top=0.975, bottom=0.2)
|
||||
fig.savefig("eagerness.pdf")
|
||||
plt.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
#df = pd.read_csv(r'C:\Users\marie\Documents\UNI\7.Semester\Betschler\Skriptschnickschnack\csv_dateien\feeder_visits.csv', index_col=0, sep=';')
|
||||
#df2 = pd.read_csv(r'C:\Users\marie\Documents\UNI\7.Semester\Betschler\Skriptschnickschnack\csv_dateien\setup_configurations.csv', index_col=0, sep=';')
|
||||
df = pd.read_csv("../data/feeder_visits.csv", index_col=0, sep=';')
|
||||
df2 = pd.read_csv('../data/setup_configurations.csv', index_col=0, sep=';')
|
||||
|
||||
days = df.day.unique()
|
||||
subjects = df.subject.unique()
|
||||
# plot_trial_visit_times(df, df2, days, subjects)
|
||||
boldness = analyze_feeder_risk(df, subjects, days)
|
||||
plot_risk_per_day(boldness, subjects)
|
||||
compare_risks_per_subject(boldness, subjects)
|
||||
plot_risk_over_time(boldness, subjects)
|
||||
|
||||
87
boldness/code/merge_configs.py
Normal file
87
boldness/code/merge_configs.py
Normal file
@@ -0,0 +1,87 @@
|
||||
import pandas as pd
|
||||
from IPython import embed
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from mpl_toolkits.axes_grid1 import make_axes_locatable
|
||||
|
||||
def get_feeder_risk(feeder_position, separation_y, dark_center_y, light_risk=1):
|
||||
x_limits = np.array([0, 1.24])
|
||||
y_limits = np.array([0, 0.81])
|
||||
|
||||
min_wall_dist_x = min(np.abs(feeder_position[0] - x_limits))
|
||||
min_wall_dist_y = min(np.abs(feeder_position[1] - y_limits))
|
||||
|
||||
risk_x = 1/(max(x_limits)/2) * min_wall_dist_x
|
||||
risk_y = 1/(max(y_limits)/2) * min_wall_dist_y
|
||||
total_risk = min(risk_x, risk_y)
|
||||
|
||||
top_or_bottom = "top" if feeder_position[1] <= separation_y else "bottom"
|
||||
darkside = "top" if dark_center_y < separation_y else "bottom"
|
||||
is_position_on_the_bright_side = top_or_bottom != darkside
|
||||
|
||||
if is_position_on_the_bright_side:
|
||||
total_risk = total_risk + light_risk
|
||||
return np.round(total_risk, 3)
|
||||
|
||||
|
||||
def plot_risk_surface():
|
||||
x_range = np.arange(0.0, 1.24, .05)
|
||||
y_range = np.arange(0.0, .82, .05)
|
||||
risk_matrix = np.zeros((len(x_range), len(y_range)))
|
||||
|
||||
for i, x in enumerate(x_range):
|
||||
for j, y in enumerate(y_range):
|
||||
risk_matrix[i, j] = get_feeder_risk([x, y], 0.40, dark_center_y=0.17)
|
||||
im = plt.imshow(risk_matrix.T, origin='upper')
|
||||
plt.xticks(np.arange(0, len(x_range), 5), np.arange(0, len(x_range), 5)*0.05)
|
||||
plt.yticks(np.arange(0, len(y_range), 5), np.arange(0, len(y_range), 5)*0.05)
|
||||
plt.xlabel("width [m]")
|
||||
plt.ylabel("height [m]")
|
||||
|
||||
divider = make_axes_locatable(plt.gca())
|
||||
cax = divider.append_axes("right", size="5%", pad=0.1)
|
||||
cbar = plt.colorbar(im, cax=cax)
|
||||
cbar.set_label("risk")
|
||||
plt.gcf().set_size_inches(5, 3.)
|
||||
plt.gcf().subplots_adjust(right=0.875, top=0.975, bottom=0.10)
|
||||
plt.savefig("risk_surface.pdf")
|
||||
plt.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
# plot_risk_surface()
|
||||
setup_cfg_ext = pd.read_csv("../data/setup_configurations_ext.csv", sep=";", index_col=0)
|
||||
feeder_pos = pd.read_csv("../data/feeder_positions.csv", sep=",", index_col=0)
|
||||
|
||||
|
||||
configs = []
|
||||
final_config = {"video", "subject", "date", "day", "temperature", "conductivity", "separation_line", "dark_center", "dark", "feeder_1_pos", "feeder_1_risk", }
|
||||
|
||||
videos = setup_cfg_ext.video.values
|
||||
for v in videos:
|
||||
print(v)
|
||||
row = setup_cfg_ext[setup_cfg_ext.video == v]
|
||||
subject = row.subject.values[0]
|
||||
day = row.day.values[0]
|
||||
date = row.date.values[0]
|
||||
sep = row.seperation_line.values[0]
|
||||
sep = np.array(list(map(float, sep.strip()[1:-1].split(","))))
|
||||
dc = row.dark_center.values[0]
|
||||
dc = np.array(list(map(float, dc.strip()[1:-1].split(","))))
|
||||
dark = row.dark.values[0]
|
||||
|
||||
pos_row = feeder_pos[feeder_pos.day == day]
|
||||
temp = pos_row.temperature.values[0]
|
||||
cond = pos_row.conductivity.values[0]
|
||||
config = {"day": day, "video": v, "subject": subject, "date": date, "temperature": temp,
|
||||
"conductivity": cond, "separation_line": sep, "dark_center": dc, "dark":dark}
|
||||
for feeder_number in range(1, 9):
|
||||
pos = pos_row["feeder_pos_%i" % feeder_number].values[0]
|
||||
pos = np.array(list(map(float, pos[1:-1].split())))
|
||||
risk = get_feeder_risk(pos, sep[1], dark_center_y=dc[1])
|
||||
config["feeder_pos_%i" % (9 - feeder_number)] = pos
|
||||
config["feeder_risk_%i" % (9 - feeder_number)] = risk
|
||||
|
||||
configs.append(config)
|
||||
|
||||
embed()
|
||||
exit()
|
||||
@@ -130,7 +130,7 @@ def check_day(path):
|
||||
la = get_light_on_area(vid)
|
||||
fp = get_feeder_positions(vid)
|
||||
fr = get_feeder_risks(fp, la)
|
||||
|
||||
embed()
|
||||
day_config = {"date": date, "day": day, "temperature":"", "conductivity":"", "light_on_left": la["left"], "light_on_right":la["right"], "light_on_center": la["light_center"]}
|
||||
for pos in fp.keys():
|
||||
day_config["feeder_pos_%s" % pos] = fp[pos]
|
||||
|
||||
Reference in New Issue
Block a user