198 lines
9.9 KiB
Python
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) |