personality/boldness/code/feeder_visit_time.py
2021-06-01 10:39:26 +02:00

198 lines
9.9 KiB
Python

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)