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)