Commit 448978df authored by Jana Germies's avatar Jana Germies
Browse files

minor clean up

parent 10b3a3f0
"""
Here, methods to read, format and evaluate answers to the personality questionnaire are provided.
Scores per user and effects across the whole sample are calculated.
"""
import pandas as pd
from visualization.visualizations import boxplot_trait_scores, scatterplot_interaction
from inspect_chats import read_chat_data, filter_chats, get_summary, get_n_count, summarize_chats
## basic processing of questionnaire ##
def read_personality_data(path):
"""
Initial minor formatting is done here:
A header with column names is added and the table pivotted.
"""
# set column names
columns = ["user_id", "question", "answer"]
# load csv
data_df = pd.read_csv(path, header=None, names=columns)
# pivot table
pivot_df = data_df.pivot_table(index="user_id", columns="question", values="answer")
return pivot_df
def remove_fake_profiles(df_traits):
"""
For testing the chat app, fake accounts were created and all questions answered with 1.
These test accounts and other possible fake accounts are removed here.
"""
# locate rows where all values are equal and create mask
equals_mask = df_traits.eq(df_traits.iloc[:, 0], axis=0).all(axis=1)
# invert mask
inverted_mask = equals_mask != True
# apply mask
clean_df = df_traits[inverted_mask]
return clean_df
def recode_answers(df_traits):
"""
The BFI-S questionnaire contains positively and negatively poled questions.
For evaluation, answers to negatively poled questions are re-coded.
"""
poled_questions = [3, 6, 8, 15]
for column in poled_questions:
new_values = df_traits[column].replace([1, 2, 3, 4, 5, 6, 7], [7, 6 , 5, 4, 3, 2, 1])
df_traits[column].update(new_values)
return df_traits
def calculate_scores_per_user(df_traits):
"""Calculate personality scores for each trait and user."""
# dimensions and their respective questions (column indices)
extra = [2, 6, 9]
agree = [3, 7, 13]
conscient = [1, 8, 12]
open = [4, 10, 14]
neurotic = [5, 11, 15]
#create empty data frame
personality_df = pd.DataFrame()
# add columns with mean score values
personality_df['openness'] = df_traits[open].mean(axis=1)
personality_df['conscientiousness'] = df_traits[conscient].mean(axis=1)
personality_df['extraversion'] = df_traits[extra].mean(axis=1)
personality_df['agreeableness'] = df_traits[agree].mean(axis=1)
personality_df['neuroticism'] = df_traits[neurotic].mean(axis=1)
return personality_df
## collate questionnaire and chat data ##
def remove_superfluous_users(unique_users, df_traits):
"""
Remove users who filled out the personality questionnaire
but did not participate in any chats from the personality data.
"""
# compare user ids
irregular_names = [n for n in df_traits['user_id'] if n not in unique_users]
print('users who did not participate in any of the chats:', irregular_names)
# create boolean mask
mask = df_traits['user_id'].isin(unique_users)
# apply mask and remove users
clean_df = df_traits[mask]
clean_df = clean_df.reset_index(drop=True)
return clean_df
def map_extraversion_poles(df_traits):
"""
Map scores to the traits' polar expressions.
In the case of extraversion, scores equal to or above 3.5 are mapped to 'extrovert'.
Scores below 3.5 are mapped to 'introvert'.
"""
# select trait
extraversion_scores = df_traits['extraversion']
# create boolean mask based on half-way point of scale (3.5)
mask = extraversion_scores >= 3.5
# replace values
expressions = mask.replace([True, False], ['extrovert', 'introvert'])
# add to data frame
df_traits['poles'] = expressions
expression_df = df_traits.drop(['openness', 'conscientiousness', 'extraversion', 'agreeableness', 'neuroticism'], axis=1)
# create dict from data frame
expression_dict = pd.Series(expression_df.poles.values, index=expression_df.user_id).to_dict()
print("Users and their respective extraversion poles:", expression_dict)
return expression_dict
def get_interaction_message_lengths_scores(df_chats, df_traits, message_lens):
"""
Map extraversion scores to message lenths and assess possible factor interaction.
"""
# map extraversion scores to users and create dict
scores = df_traits.drop(['openness', 'conscientiousness', 'agreeableness', 'neuroticism'], axis=1)
score_dict = pd.Series(scores.extraversion.values, index=scores.user_id).to_dict()
# map scores and message lenghts to users in chat data frame
df_chats['extraversion_scores'] = df_chats['user_id'].map(score_dict)
interaction_df = pd.concat([df_chats['user_id'], message_lens, df_chats['extraversion_scores']], axis=1)
# for AVERAGE msg lengths grouped per user:
#small_df = pd.concat([df_chats['user_id'], lens, df_chats['extraversion_scores']], axis=1)
#grouped = small_df.groupby('user_id')
#interaction_df = grouped.mean()
scatterplot_interaction(interaction_df)
return interaction_df
if __name__ == '__main__':
# paths
personality_path_in = '/Users/Jana1/Desktop/MA/ttas/ttas-user-answers.csv'
personality_path_out = '/Users/Jana1/Desktop/MA/ttas-py/filtered_personality_scores.csv'
chat_path_in = '/Users/Jana1/Desktop/MA/ttas/ttas-complete-chats.csv'
chat_path_out = '/Users/Jana1/Desktop/MA/ttas/ttas-filtered-chats.csv'
# read
trait_data = read_personality_data(personality_path_in)
chat_data = read_chat_data(chat_path_in)
# filter chats
filtered_chats = filter_chats(chat_data)
# process trait scores
clean_trait_df = remove_fake_profiles(trait_data)
recoded_trait_df = recode_answers(clean_trait_df)
score_df = calculate_scores_per_user(recoded_trait_df)
# compare with chat data
unique_users, unique_chats, n_users, n_chats = get_n_count(filtered_chats)
filtered_scores = remove_superfluous_users(unique_users, score_df)
# calculate stats
mean_scores = get_summary(filtered_scores.drop('user_id', axis=1))
# save results
#filtered_scores.to_csv(personality_path_out)
# visualize results
boxplot_trait_scores(filtered_scores)
# interaction between message lengths and extraversion trait scores
message_lens, summary_chats, summary_messages = summarize_chats(filtered_chats)
interaction_df = get_interaction_message_lengths_scores(filtered_chats, filtered_scores, message_lens)
# add extraversion pole expressions to chat data
extraversion_poles_dict = map_extraversion_poles(filtered_scores)
# TODO: move into map function?
filtered_chats['extraversion_pole'] = filtered_chats['user_id'].map(extraversion_poles_dict)
filtered_chats = filtered_chats.drop('index', axis=1)
# save results
#filtered_chats.to_csv(chat_path_out)
"""Apply methods to clean data"""
import pandas as pd
from inspect_chats import read_chat_data, filter_chats
from compare_dfs import get_n_count, remove_superfluous_users
from personality_scores import get_summary, map_extraversion_poles
from visualizations import visualize_traits
from inspect_chats import read_chat_data, filter_chats, get_n_count, get_summary
from calculate_personality_scores import map_extraversion_poles, remove_superfluous_users
from visualization.visualizations import boxplot_trait_scores
if __name__ == '__main__':
chats_input_path = '/Users/Jana1/Desktop/MA/ttas/ttas-complete-chats.csv'
traits_input_path = '/Users/Jana1/Desktop/MA/ttas-py/trait_scores.csv'
chat_output_path = ''
chat_output_path = '/Users/Jana1/Desktop/MA/ttas/ttas-filtered-chats.csv'
traits_out_path = '/Users/Jana1/Desktop/MA/ttas-py/filtered_personality_scores.csv'
# read chat data and filter out chats with turns > 4
chat_data = read_chat_data(chats_input_path)
# filter data
......@@ -19,14 +21,17 @@ if __name__ == '__main__':
# compare data frames and remove superfluous users from personality data
filtered_scores = remove_superfluous_users(unique_users, trait_scores)
mean_scores = get_summary(filtered_scores.drop('user_id', axis=1))
print(filtered_scores)
# map extraversion scores to pole expression markers
extraversion_df, extraversion_dict = map_extraversion_poles(filtered_scores)
print(extraversion_dict)
#print(extraversion_dict)
# add extraversion pole to respective users
filtered_chats['extraversion_pole'] = filtered_chats['user_id'].map(extraversion_dict)
filtered_chats = filtered_chats.drop('index', axis=1)
print(filtered_chats)
# save results
#trait_df.to_csv(name+save_path)
filtered_scores.to_csv(traits_out_path)
filtered_chats.to_csv(chat_output_path)
# visualize
#visualize_traits(filtered_scores)
\ No newline at end of file
#boxplot_trait_scores(filtered_scores)
\ No newline at end of file
"""Here, methods to filter out futile data points and create a statistical overview of the chat data set are provided."""
import pandas as pd
import numpy as np
from personality_scores import get_summary
from visualizations import histplot_messages
from pandas.core.algorithms import unique
from calculate_personality_scores import get_summary, get_interaction_message_lengths_scores
from visualization.visualizations import histplot_messages, scatterplot_interaction
# read data
def read_chat_data(path):
"""Read in the data and add respective column names."""
columns = ["chat_id", "user_id", "message", "timestamp"]
chat_data = pd.read_csv(path, header=None, names=columns)
print(chat_data.head())
return chat_data
def filter_chats(df):
"""
Filter data to only contain chats with appropriate number of turns
"""
"""Filter data to only contain chats with appropriate number of turns."""
# set threshold
threshold = 3
# group messages
grouped = df.groupby('chat_id')
# filter for message count
filtered = grouped.filter(lambda x: x['message'].count() > threshold)
filtered = filtered.reset_index()
return filtered
def get_summary(df):
"""Calculate the overall average, min and max values across sample."""
#mean_scores= df.mean(axis=0)
summary = df.agg(['min', 'mean', 'max'], axis=0)
print('statistic summary of data:', summary)
return summary
def summarize_chats(df):
"""
Get statistical summaries of messages per chat and message lengths
"""
"""Get statistical summaries of messages per chat and message lengths."""
# group
grouped = df.groupby('chat_id')
# n messages per chat
......@@ -38,7 +48,24 @@ def summarize_chats(df):
message_lens = messages.str.split().str.len()
# get min, max and average
summary_messages = get_summary(message_lens)
return summarize_chats, summary_messages
return message_lens, summary_chats, summary_messages
def get_n_count(df):
"""
Get count of unique users and chats.
Note: There was one test case left in the chat data.
"""
# get unique ids
unique_users = df.user_id.unique()
unique_chats = df.chat_id.unique()
# get n unique ids
n_users = df.user_id.nunique()
n_chats = df.chat_id.nunique()
#n_chats = len(unique_chats)
print('number of unique users: %i and number of unique chats: %i' %(n_users, n_chats))
return unique_users, unique_chats, n_users, n_chats
......@@ -48,24 +75,14 @@ if __name__ == '__main__':
# filter data
filtered = filter_chats(chat_data)
print(filtered.shape)
# get n unique users and chats
unique_users, unique_chats, n_users, n_chats = get_n_count(filtered)
# get n messages per chats, message lengths
summary_chats, summary_messages = summarize_chats(filtered)
# #print(chat_data)
# unique_users, unique_chats, n_users, n_chats = get_n_count(chat_data)
# # group by chat
# grouped = chat_data.groupby('chat_id')
# # get n messages per chat
# messages_per_chat = grouped['message'].count()
# # filter for message count
# filtered = grouped.filter(lambda x: x['message'].count() > 3)
# # get length of individual messages
# messages = filtered['message']
# message_lens = messages.str.split().str.len()
# summ = get_summary(message_lens)
# histplot_messages(message_lens)
# #TODO: combine stat summaries with personality trait results
# #TODO: --> calculate average scores per person
\ No newline at end of file
message_lens, summary_chats, summary_messages = summarize_chats(filtered)
# visualize
#histplot_messages(message_lens)
# personality data
trait_scores = pd.read_csv('/Users/Jana1/Desktop/MA/ttas-py/filtered_personality_scores.csv')
# interaction
interaction_df = get_interaction_message_lengths_scores(filtered, trait_scores, message_lens)
\ No newline at end of file
,user_id,openness,conscientiousness,extraversion,agreeableness,neuroticism,poles
0,Apfel1,3.6666666666666665,3.6666666666666665,4.666666666666667,6.333333333333332,5.333333333333333,extrovert
1,Aragorn,4.666666666666667,5.0,4.333333333333333,6.666666666666668,5.0,extrovert
2,ChatterBot,4.333333333333333,6.666666666666668,3.6666666666666665,4.0,5.666666666666668,extrovert
3,EM2022,2.333333333333333,3.6666666666666665,2.6666666666666665,2.6666666666666665,4.666666666666667,introvert
4,Gandalf,5.333333333333333,4.666666666666667,4.333333333333333,6.333333333333332,4.666666666666667,extrovert
5,Hermelin,6.333333333333332,4.333333333333333,4.0,3.333333333333333,3.333333333333333,extrovert
6,Kaesetoast,5.666666666666668,6.0,4.666666666666667,5.333333333333333,6.333333333333332,extrovert
7,Leroy,4.666666666666667,5.0,5.333333333333333,4.666666666666667,2.333333333333333,extrovert
8,MamaMiaPizzeria,6.0,3.0,4.333333333333333,4.666666666666667,4.0,extrovert
9,MonkyMonk,5.666666666666668,4.0,4.333333333333333,6.666666666666668,4.666666666666667,extrovert
10,Sloth,5.333333333333333,5.333333333333333,4.0,6.0,4.0,extrovert
11,SugarDaddy1977,2.333333333333333,3.333333333333333,6.666666666666668,4.0,1.0,extrovert
12,TommyHilfiger,1.6666666666666667,2.0,3.0,3.0,4.333333333333333,introvert
13,Turing,6.0,4.333333333333333,6.0,6.0,4.333333333333333,extrovert
14,a_stranger,4.666666666666667,3.0,2.6666666666666665,4.666666666666667,4.333333333333333,introvert
15,albola,6.666666666666668,5.0,6.333333333333332,4.666666666666667,6.333333333333332,extrovert
16,dude123,4.666666666666667,6.0,6.333333333333332,5.0,3.333333333333333,extrovert
17,grassroot,5.666666666666668,5.666666666666668,4.333333333333333,7.0,5.333333333333333,extrovert
18,hallihallo,5.666666666666668,2.6666666666666665,5.333333333333333,3.6666666666666665,2.333333333333333,extrovert
19,huibuh,5.333333333333333,5.0,3.6666666666666665,4.0,6.0,extrovert
20,isso,5.666666666666668,5.666666666666668,4.0,6.0,1.6666666666666667,extrovert
21,jonathan,5.0,4.666666666666667,3.333333333333333,5.333333333333333,6.333333333333332,introvert
22,maja,3.6666666666666665,4.0,4.333333333333333,4.0,3.6666666666666665,extrovert
23,milkyway,3.333333333333333,3.0,5.333333333333333,3.0,4.333333333333333,extrovert
24,owolf,4.333333333333333,5.333333333333333,5.333333333333333,4.333333333333333,2.6666666666666665,extrovert
25,phranz,6.666666666666668,5.333333333333333,4.333333333333333,6.0,4.333333333333333,extrovert
26,tmplxz,2.0,2.6666666666666665,2.0,1.3333333333333333,3.6666666666666665,introvert
27,turtle,4.0,2.6666666666666665,4.666666666666667,5.0,4.333333333333333,extrovert
28,turtleneck,3.0,5.0,3.6666666666666665,4.666666666666667,5.666666666666668,extrovert
user_id,openness,conscientiousness,extraversion,agreeableness,neuroticism
Apfel1,3.6666666666666665,3.6666666666666665,4.666666666666667,6.333333333333333,5.333333333333333
Aragorn,4.666666666666667,5.0,4.333333333333333,6.666666666666667,5.0
BestimmtKeinBot,4.333333333333333,3.3333333333333335,4.0,4.0,5.666666666666667
CaptainMagma,5.0,4.0,3.0,4.666666666666667,3.6666666666666665
Chatbot,6.0,5.333333333333333,3.3333333333333335,5.666666666666667,6.666666666666667
ChatterBot,4.333333333333333,6.666666666666667,3.6666666666666665,4.0,5.666666666666667
EM2021,2.6666666666666665,2.6666666666666665,3.6666666666666665,2.6666666666666665,4.0
EM2022,2.3333333333333335,3.6666666666666665,2.6666666666666665,2.6666666666666665,4.666666666666667
Felix64,4.666666666666667,5.333333333333333,4.666666666666667,6.333333333333333,4.0
Gandalf,5.333333333333333,4.666666666666667,4.333333333333333,6.333333333333333,4.666666666666667
Grottenolm,6.0,4.333333333333333,1.6666666666666667,4.666666666666667,5.666666666666667
Hermelin,6.333333333333333,4.333333333333333,4.0,3.3333333333333335,3.3333333333333335
Hurz369,6.333333333333333,3.6666666666666665,6.666666666666667,5.666666666666667,5.0
Kaesetoast,5.666666666666667,6.0,4.666666666666667,5.333333333333333,6.333333333333333
Leroy,4.666666666666667,5.0,5.333333333333333,4.666666666666667,2.3333333333333335
MamaMiaPizzeria,6.0,3.0,4.333333333333333,4.666666666666667,4.0
MonkyMonk,5.666666666666667,4.0,4.333333333333333,6.666666666666667,4.666666666666667
Patti,6.333333333333333,6.333333333333333,5.333333333333333,6.0,4.0
Ragecrezz,6.0,5.666666666666667,6.0,6.0,3.3333333333333335
Sloth,5.333333333333333,5.333333333333333,4.0,6.0,4.0
SugarDaddy1977,2.3333333333333335,3.3333333333333335,6.666666666666667,4.0,1.0
TommyHilfiger,1.6666666666666667,2.0,3.0,3.0,4.333333333333333
Turing,6.0,4.333333333333333,6.0,6.0,4.333333333333333
VeganeWust,5.666666666666667,5.666666666666667,4.333333333333333,5.0,4.0
a_stranger,4.666666666666667,3.0,2.6666666666666665,4.666666666666667,4.333333333333333
albola,6.666666666666667,5.0,6.333333333333333,4.666666666666667,6.333333333333333
anolisechse,4.0,4.0,4.333333333333333,4.666666666666667,4.666666666666667
dude123,4.666666666666667,6.0,6.333333333333333,5.0,3.3333333333333335
grassroot,5.666666666666667,5.666666666666667,4.333333333333333,7.0,5.333333333333333
hallihallo,5.666666666666667,2.6666666666666665,5.333333333333333,3.6666666666666665,2.3333333333333335
huibuh,5.333333333333333,5.0,3.6666666666666665,4.0,6.0
isso,5.666666666666667,5.666666666666667,4.0,6.0,1.6666666666666667
jonathan,5.0,4.666666666666667,3.3333333333333335,5.333333333333333,6.333333333333333
maja,3.6666666666666665,4.0,4.333333333333333,4.0,3.6666666666666665
marinoo,5.333333333333333,6.666666666666667,5.666666666666667,5.666666666666667,3.6666666666666665
milkyway,3.3333333333333335,3.0,5.333333333333333,3.0,4.333333333333333
owolf,4.333333333333333,5.333333333333333,5.333333333333333,4.333333333333333,2.6666666666666665
phranz,6.666666666666667,5.333333333333333,4.333333333333333,6.0,4.333333333333333
testerman,5.333333333333333,6.333333333333333,5.666666666666667,6.666666666666667,1.3333333333333333
tmplxz,2.0,2.6666666666666665,2.0,1.3333333333333333,3.6666666666666665
turtle,4.0,2.6666666666666665,4.666666666666667,5.0,4.333333333333333
turtleneck,3.0,5.0,3.6666666666666665,4.666666666666667,5.666666666666667
This source diff could not be displayed because it is too large. You can view the blob instead.
"""Statistical Analysis Script ttas data"""
import pandas as pd
import numpy as np
from pandas.core.algorithms import unique
from personality_scores import map_extraversion_poles, get_summary
from visualizations import visualize_traits
# read data
def read_chat_data(path):
columns = ["chat_id", "user_id", "message", "timestamp"]
chat_data = pd.read_csv(path, header=None, names=columns)
print(chat_data.head())
return chat_data
def get_n_count(df):
"""
Note: there was one test user left in the chats
"""
# get unique ids
unique_users = df.user_id.unique()
unique_chats = df.chat_id.unique()
# get n unique ids
n_users = df.user_id.nunique()
n_chats = df.chat_id.nunique()
#n_chats = len(unique_chats)
print('number of unique users: %i and number of unique chats: %i' %(n_users, n_chats))
return unique_users, unique_chats, n_users, n_chats
def remove_superfluous_users(unique_users, trait_df):
"""
Removes users who filled out the personality questionnaire
but did not participate in any chats from the personality data.
"""
# compare user ids
irregular_names = [n for n in trait_df['user_id'] if n not in unique_users]
print('users who did not participate in any of the chats:', irregular_names)
# create boolean mask
mask = trait_df['user_id'].isin(unique_users)
# apply mask and remove users
clean_df = trait_df[mask]
clean_df = clean_df.reset_index(drop=True)
print(clean_df)
return clean_df
if __name__ == '__main__':
# read data
path = "/Users/Jana1/Desktop/MA/ttas/ttas-complete-chats.csv"
chat_data = read_chat_data(path)
trait_scores = pd.read_csv('/Users/Jana1/Desktop/MA/ttas-py/trait_scores.csv')
print(trait_scores.head())
# count unique users and chats
unique_users, unique_chats, n_users, n_chats = get_n_count(chat_data)
# compare data frames
clean_trait_df = remove_superfluous_users(unique_users, trait_scores)
# get refactored summary
print(len(clean_trait_df))
mean_scores = get_summary(clean_trait_df.drop('user_id', axis=1))
#visualize_traits(clean_trait_df)
# map extraversion scores to pole expression markers
#extraversion_poles = map_extraversion_poles(clean_trait_df)
# save results
#trait_df.to_csv(name+save_path)
"""
The methods in this script are used to read, format and evaluate answers to the personality questionnaire.
Average scores per user, as well as across the whole sample group are calculated.
"""
from numpy.core.fromnumeric import mean
import pandas as pd
from visualizations import visualize_traits
# read data
def read_personality_data(path):
"""
Reads in the data from the csv file.
Minor formatting is also done here.
A header with column names is added.
The table is pivotted to facilitate further processing.
"""
# set column names
columns = ["user_id", "question", "answer"]
# load csv
data_df = pd.read_csv(path, header=None, names=columns)
# pivot table
pivot_df = data_df.pivot_table(index="user_id", columns="question", values="answer")
return pivot_df
def remove_false_profiles(df):
"""
For testing, fake accounts were created and all questions answered with 1.
These test accounts and other possible fake accounts are removed here.
"""
# locate rows where all values are equal and create mask
equals_mask = df.eq(df.iloc[:, 0], axis=0).all(axis=1)
print(equals_mask)
# invert mask
inverted_mask = equals_mask != True
print(inverted_mask)
# apply mask
clean_df = df[inverted_mask]
print(clean_df)
return clean_df
def recode_q_answers(df):
"""
The BFI-S questionnaire contains positively and negatively poled questions.
For evaluation, answers to negatively poled questions are recoded here.
"""
poled_questions = [3, 6, 8, 15]
for column in poled_questions:
new_values = df[column].replace([1, 2, 3, 4, 5, 6, 7], [7, 6 , 5, 4, 3, 2, 1])
df[column].update(new_values)
return df
def calculate_scores_per_user(df):
"""
Calculate personality scores for each trait and user.
"""
# dimensions and their respective questions (columns)
extra = [2, 6, 9]
agree = [3, 7, 13]
conscient = [1, 8, 12]
open = [4, 10, 14]
neurotic = [5, 11, 15]
#create empty data frame
personality_df = pd.DataFrame()
# add columns with mean score values
personality_df['openness'] = df[open].mean(axis=1)
personality_df['conscientiousness'] = df[conscient].mean(axis=1)
personality_df['extraversion'] = df[extra].mean(axis=1)
personality_df['agreeableness'] = df[agree].mean(axis=1)
personality_df['neuroticism'] = df[neurotic].mean(axis=1)
return personality_df
def get_summary(df):
"""
Calculate the overall average, min and max values for each trait across the sample.
"""
#mean_scores= df.mean(axis=0)
summary = df.agg(['min', 'mean', 'max'], axis=0)
print('statistic summary of data:', summary)
return summary
def map_extraversion_poles(df):
"""
Map scores to the traits' polar expressions.
In the case of extraversion, scores equal to or above 3.5 are mapped to 'extrovert'.
Scores below 3.5 are mapped to 'introvert'.
"""
# select trait
extraversion_scores = df['extraversion']
# create boolean mask based on half-way point of scale (3.5)
mask = extraversion_scores >= 3.5
# replace values
expressions = mask.replace([True, False], ['extrovert', 'introvert'])
# add to data frame
df['poles'] = expressions
expression_df = df.drop(['openness', 'conscientiousness', 'extraversion', 'agreeableness', 'neuroticism'], axis=1)
# create dict from data frame
expression_dict = pd.Series(expression_df.poles.values, index=expression_df.user_id).to_dict()
return expression_df, expression_dict
if __name__ == '__main__':
# read
data_path = "/Users/Jana1/Desktop/MA/ttas/ttas-user-answers.csv"
save_path = ""
name = ""
df = read_personality_data(data_path)
# process
df = remove_false_profiles(df)
print(df.shape)
mod_df = recode_q_answers(df)
trait_df = calculate_scores_per_user(mod_df)
# summarize
mean_scores = get_summary(trait_df)
print(mean_scores)
extraversion_scores = map_extraversion_poles(trait_df)
print(extraversion_scores)
# visualize and save results
#trait_df.to_csv(name+save_path)
#visualize_traits(trait_df)
"""Methods to visualize results and create knowledgable graphs"""
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
#visualize traits in boxplot
def visualize_traits(df):
sns.set_theme(style='whitegrid')
def boxplot_trait_scores(df):
"""
Plot boxplot diagramm of each trait in one comprehensive graph.
"""
sns.set_theme(style='darkgrid')