This commit is contained in:
2021-06-01 10:39:26 +02:00
commit 75da6e7eb9
5 changed files with 880 additions and 0 deletions

View File

@@ -0,0 +1,198 @@
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)