diff --git a/explorer.py b/explorer.py
index 0e4318b..509dfd4 100644
--- a/explorer.py
+++ b/explorer.py
@@ -324,7 +324,7 @@ def print_total(number):
st.write(f"**{number}** respondents answered the question with the current filter")
-def print_answered_by(group):
+def answered_by(group):
if group == "cso":
text = "CSO professionals"
else:
@@ -472,6 +472,10 @@ def callback():
color: #000;
}
+ code {
+ color: #ff1c1f;
+ }
+
a {
color: #ff1c1f !important;
}
@@ -569,7 +573,7 @@ def callback():
)
country_counts = df[filter]["country"].value_counts()
- st.write("### Country")
+ st.write("### Country `[country]`")
print_total(country_counts.sum())
st.plotly_chart(
gen_px_pie(
@@ -587,7 +591,7 @@ def callback():
config=chart_config,
)
- st.write("### Field")
+ st.write("### Field [`field`]")
field_counts = df[filter]["field"].value_counts()
print_total(field_counts.sum())
st.plotly_chart(
@@ -600,7 +604,7 @@ def callback():
config=chart_config,
)
- st.write("### Gender")
+ st.write("### Gender `[gender]`")
gender_counts = df[filter]["gender"].value_counts()
print_total(gender_counts.sum())
st.plotly_chart(
@@ -632,7 +636,7 @@ def callback():
st.write("## Human Resources")
- st.write("### What is your employment status?")
+ st.write("### What is your employment status? `[hr1]`")
hr1_counts = df[filter]["hr1"].value_counts()
print_total(hr1_counts.sum())
st.plotly_chart(
@@ -654,7 +658,7 @@ def callback():
)
st.write(
- "### How many days per month do you work on surveillance by intelligence agencies?"
+ "### How many days per month do you work on surveillance by intelligence agencies? `[hr2]`"
)
hr2_counts = df[filter]["hr2"].value_counts()
print_total(hr2_counts.sum())
@@ -710,10 +714,85 @@ def callback():
config=chart_config,
)
+ st.write("### Which type of medium do you work for? `[hr3ms]`")
+ hr3ms_df = pd.DataFrame(columns=("option", "count", "country"))
+ answered_by("media")
+ hr3ms_options = [
+ "daily_newspaper",
+ "weekly_newspaper",
+ "magazine",
+ "tv",
+ "radio",
+ "news_agency",
+ "online_stand_alone",
+ "online_of_offline",
+ ]
+ hr3ms_options_clean = [
+ "Daily newspaper",
+ "Weekly newspaper",
+ "Magazine",
+ "TV",
+ "Radio",
+ "News agency",
+ "Online outlet
(standalone)",
+ "Online outlet
(of an offline publication)",
+ ]
+ for option, option_clean in zip(hr3ms_options, hr3ms_options_clean):
+ hr3ms_data = df[filter]["country"][df[f"hr3ms[{option}]"] == 1].tolist()
+ for i in hr3ms_data:
+ hr3ms_df = hr3ms_df.append(
+ {"option": option_clean, "count": hr3ms_data.count(i), "country": i},
+ ignore_index=True,
+ )
+ hr3ms_df = hr3ms_df.drop_duplicates()
+
+ if filters["field"] == "CSO Professionals":
+ print_total(0)
+ else:
+ # If one respondent chose at least one medium it counts towards the total
+ hr3ms_col_list = [col for col in df[filter].columns if col.startswith("hr3ms")]
+ hr3ms_df_total = df[filter][hr3ms_col_list]
+ hr3ms_df_total["answered"] = [
+ "Y" if x > 0 else "N" for x in np.sum(hr3ms_df_total.values == True, 1)
+ ]
+ print_total(hr3ms_df_total["answered"].value_counts().sort_index()[1])
+
+ st.plotly_chart(
+ gen_px_histogram(
+ hr3ms_df,
+ x="option",
+ y="count",
+ nbins=None,
+ color="country",
+ color_discrete_map={
+ "Germany": colors[0],
+ "United Kingdom": colors[2],
+ "France": colors[4],
+ },
+ labels={"count": "people who work
for this medium"},
+ ),
+ use_container_width=True,
+ config=chart_config,
+ )
+
+ st.write(
+ "### Within the past year, did you have enough time to cover surveillance by intelligence agencies? `[hr4ms]`"
+ )
+ answered_by("media")
+ hr4ms_counts = df[filter]["hr4ms"].value_counts().sort_index()
+ st.plotly_chart(
+ gen_go_pie(
+ labels=hr4ms_counts.sort_index().index,
+ values=hr4ms_counts.sort_index().values,
+ ),
+ use_container_width=True,
+ config=chart_config,
+ )
+
st.write("## Expertise")
st.write(
- "### How many years have you spent working on surveillance by intelligence agencies?"
+ "### How many years have you spent working on surveillance by intelligence agencies? `[expertise1]`"
)
expertise1_counts = df[filter]["expertise1"].value_counts()
print_total(expertise1_counts.sum())
@@ -754,7 +833,7 @@ def callback():
)
st.write(
- "### How do you assess your level of expertise concerning the **legal** aspects of surveillance by intelligence agencies?"
+ "### How do you assess your level of expertise concerning the **legal** aspects of surveillance by intelligence agencies? `[expertise2]`"
)
expertise2_counts = df[filter]["expertise2"].value_counts().sort_index()
print_total(expertise2_counts.sum())
@@ -768,7 +847,7 @@ def callback():
)
st.write(
- "### How do you assess your level of expertise concerning the **political** aspects of surveillance by intelligence agencies?"
+ "### How do you assess your level of expertise concerning the **political** aspects of surveillance by intelligence agencies `[expertise3]`?"
)
expertise3_counts = df[filter]["expertise3"].value_counts().sort_index()
print_total(expertise3_counts.sum())
@@ -782,7 +861,7 @@ def callback():
)
st.write(
- "### How do you assess your level of expertise concerning the **technical** aspects of surveillance by intelligence agencies?"
+ "### How do you assess your level of expertise concerning the **technical** aspects of surveillance by intelligence agencies? `[expertise4]`"
)
expertise4_counts = df[filter]["expertise4"].value_counts().sort_index()
print_total(expertise4_counts.sum())
@@ -798,7 +877,7 @@ def callback():
st.write("## Financial Resources")
st.write(
- "### How do you assess the financial resources that have been available for your work on intelligence over the past 5 years?"
+ "### How do you assess the financial resources that have been available for your work on intelligence over the past 5 years? `[finance1]`"
)
finance1_counts = df[filter]["finance1"].value_counts().sort_index()
print_total(finance1_counts.sum())
@@ -812,11 +891,11 @@ def callback():
)
st.write(
- "### If you wanted to conduct investigative research into surveillance by intelligence agencies, could you access extra funding for this research? (For example, a special budget or a stipend)"
+ "### If you wanted to conduct investigative research into surveillance by intelligence agencies, could you access extra funding for this research? (For example, a special budget or a stipend) `[finance2ms]`"
)
finance2ms_counts = df[filter]["finance2ms"].value_counts()
+ answered_by("media")
print_total(finance2ms_counts.sum())
- st.caption("This question was only answered by media professionals")
st.plotly_chart(
gen_px_pie(
finance2ms_counts,
@@ -835,7 +914,7 @@ def callback():
)
st.write(
- "### How important are the following funding categories for your organisation's work on intelligence-related issues?"
+ "### How important are the following funding categories for your organisation's work on intelligence-related issues? `[finance2cs]`"
)
finance2cs_options = [
"private_foundations",
@@ -867,9 +946,9 @@ def callback():
"Not important at all",
"I prefer not to say",
]:
- for label in finance2cs_options:
+ for option in finance2cs_options:
try:
- count = df[filter][f"finance2cs[{label}]"].value_counts()[importance]
+ count = df[filter][f"finance2cs[{option}]"].value_counts()[importance]
except KeyError:
count = 0
if importance == "Very important":
@@ -890,8 +969,8 @@ def callback():
df[filter][f"finance2cs[{option}]"].value_counts().sum()
for option in finance2cs_options
]
+ answered_by("cso")
print_total(max(totals))
- print_answered_by("cso")
st.plotly_chart(
gen_go_bar_stack(
data=[
@@ -1028,7 +1107,7 @@ def callback():
)
foi5_df = pd.DataFrame(columns=("option", "count", "country"))
# TODO Map proper labels
- for label in [
+ for option in [
"not_aware",
"not_covered",
"too_expensive",
@@ -1039,10 +1118,10 @@ def callback():
"dont_know",
"prefer_not_to_say",
]:
- foi5_data = df[filter]["country"][df[f"foi5[{label}]"] == 1].tolist()
+ foi5_data = df[filter]["country"][df[f"foi5[{option}]"] == 1].tolist()
for i in foi5_data:
foi5_df = foi5_df.append(
- {"option": label, "count": foi5_data.count(i), "country": i},
+ {"option": option, "count": foi5_data.count(i), "country": i},
ignore_index=True,
)
foi5_df = foi5_df.drop_duplicates()
@@ -1105,9 +1184,9 @@ def callback():
"I don't know",
"I prefer not to say",
]:
- for label in ["sectraining", "e2e"]:
+ for option in ["sectraining", "e2e"]:
try:
- count = df[filter][f"protectops1[{label}]"].value_counts()[answer]
+ count = df[filter][f"protectops1[{option}]"].value_counts()[answer]
except KeyError:
count = 0
if answer == "Yes":
@@ -1204,7 +1283,7 @@ def callback():
"Slightly important",
"Not important at all",
]:
- for label in [
+ for option in [
"encrypted_email",
"vpn",
"tor",
@@ -1214,7 +1293,7 @@ def callback():
"other",
]:
try:
- count = df[filter][f"protectops3[{label}]"].value_counts()[importance]
+ count = df[filter][f"protectops3[{option}]"].value_counts()[importance]
except KeyError:
count = 0
if importance == "Very important":
@@ -1349,9 +1428,9 @@ def callback():
protectleg3_dont_know = []
protectleg3_prefer_not_to_say = []
for answer in ["Yes", "No", "I don't know", "I prefer not to say"]:
- for label in ["free_counsel", "cost_insurance", "other"]:
+ for option in ["free_counsel", "cost_insurance", "other"]:
try:
- count = df[filter][f"protectleg3[{label}]"].value_counts()[answer]
+ count = df[filter][f"protectleg3[{option}]"].value_counts()[answer]
except KeyError:
count = 0
if answer == "Yes":
@@ -1569,9 +1648,9 @@ def callback():
constraintinter5_dont_know = []
constraintinter5_prefer_not_to_say = []
for answer in ["Yes", "No", "I don't know", "I prefer not to say"]:
- for label in constraintinter5_options:
+ for option in constraintinter5_options:
try:
- count = df[filter][f"constraintinter5[{label}]"].value_counts()[answer]
+ count = df[filter][f"constraintinter5[{option}]"].value_counts()[answer]
except KeyError:
count = 0
if answer == "Yes":
@@ -1647,9 +1726,9 @@ def callback():
constraintinter6_dont_know = []
constraintinter6_prefer_not_to_say = []
for answer in ["Yes", "No", "I don't know", "I prefer not to say"]:
- for label in constraintinter6_options:
+ for option in constraintinter6_options:
try:
- count = df[filter][f"constraintinter6[{label}]"].value_counts()[answer]
+ count = df[filter][f"constraintinter6[{option}]"].value_counts()[answer]
except KeyError:
count = 0
if answer == "Yes":
@@ -1768,11 +1847,11 @@ def callback():
"prefer_not_to_say",
]
attitude3_df = pd.DataFrame(columns=("option", "count", "country"))
- for label in attitude3_options:
- attitude3_data = df[filter]["country"][df[f"attitude3[{label}]"] == 1].tolist()
+ for option in attitude3_options:
+ attitude3_data = df[filter]["country"][df[f"attitude3[{option}]"] == 1].tolist()
for i in attitude3_data:
attitude3_df = attitude3_df.append(
- {"option": label, "count": attitude3_data.count(i), "country": i},
+ {"option": option, "count": attitude3_data.count(i), "country": i},
ignore_index=True,
)
attitude3_df = attitude3_df.drop_duplicates()