diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..7cc1213
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,15 @@
+.ipynb_checkpoints
+profiles/
+publication/
+scripts/
+*.xlsx
+data/corr_sig
+data/limesurvey
+README.org
+guardint.png
+guardint_favicon.png
+guardint_logo.png
+poetry.lock
+pyproject.toml
+pyrightconfig.json
+roboto_mono.woff2
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 47645f7..7ab7beb 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -1,5 +1,5 @@
---
-name: deploy streamlit app
+name: Publish docker container
on:
push:
@@ -7,54 +7,42 @@ on:
- master
env:
- IMAGE_NAME: streamlit-ioi-base
+ REGISTRY: ghcr.io
jobs:
- deploy:
- name: Deploy to server
+ build-and-publish-container:
runs-on: ubuntu-latest
permissions:
- packages: write
contents: read
+ packages: write
steps:
- - name: Check out the repo
+ - name: Checkout repository
uses: actions/checkout@v2
+ with:
+ ref: "master"
- - name: Build image
- run: docker build . --file Dockerfile --tag $IMAGE_NAME --label "runnumber=${GITHUB_RUN_ID}"
-
- - name: Log in to registry
- # This is where you will update the PAT to GITHUB_TOKEN
- run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
-
- - name: Push image
- run: |
- IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME
-
- # Change all uppercase to lowercase
- IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
- # Strip git ref prefix from version
- VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
- # Strip "v" prefix from tag name
- [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
- # Use Docker `latest` tag convention
- [ "$VERSION" == "master" ] && VERSION=latest
- echo IMAGE_ID=$IMAGE_ID
- echo VERSION=$VERSION
- docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
- docker push $IMAGE_ID:$VERSION
+ - name: Log in to the Container registry
+ uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
- - name: Deploy Docker image to server using SSH
- uses: appleboy/ssh-action@master
- # TODO Set correct browser.serverAddress and server.baseUrlPath
+ - name: Extract metadata (tags, labels) for Docker
+ id: meta
+ uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
+ with:
+ images: ${{ env.REGISTRY }}/snv-berlin/streamlit-guardint
+ tags: |
+ type=sha
+ type=ref,event=branch
+ type=schedule,pattern={{date 'YYYYMMDD'}}
+
+ - name: Build and push Docker image for front
+ uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
- host: ioi.sehn.dev
- username: root
- key: ${{ secrets.KEY }}
- script: |
- docker pull ghcr.io/snv-berlin/streamlit-ioi-base:latest
- docker stop $(docker ps -a -q)
- docker run -d -p 8501:8501 ghcr.io/snv-berlin/streamlit-ioi-base:latest streamlit run --server.port 8501 explorer/merged.py
- docker run -d -p 8502:8502 ghcr.io/snv-berlin/streamlit-ioi-base:latest streamlit run --server.port 8502 explorer/media.py
- docker run -d -p 8503:8503 ghcr.io/snv-berlin/streamlit-ioi-base:latest streamlit run --server.port 8503 explorer/civsoc.py
+ context: .
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
diff --git a/Dockerfile b/Dockerfile
index 2f44bb8..da55829 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,23 +1,25 @@
-FROM bitnami/python:3.9 as base
+FROM bitnami/python:3.9-prod
WORKDIR /app
# Install some build dependencies
-RUN install_packages build-essential make gcc dpkg-dev libjpeg-dev sudo dbus-tests
-
-# Set path and install poetry in it
-ENV PATH /root/.local/bin:$PATH
-RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
-
-# We don't need poetry to create virtual environments; global site is just fine
-RUN poetry config virtualenvs.create false
+RUN install_packages \
+ build-essential \
+ libjpeg-dev
# Install project dependencies
-COPY pyproject.toml poetry.lock /app/
-RUN poetry install
+COPY requirements.txt .
+RUN pip install -r requirements.txt
+
+# Switch to non-root user
+RUN adduser \
+ --shell "/sbin/nologin" \
+ --no-create-home \
+ --gecos "nonroot" \
+ --disabled-password nonroot
+USER nonroot
# Copy files
-COPY . .
+COPY --chown=nonroot:nonroot . .
-# Expoe ports and provide entrypoint
-EXPOSE 8501-8503
-ENTRYPOINT [ "poetry", "run" ]
+# Expose ports and provide entrypoint
+EXPOSE 8501
diff --git a/explorer/merged.py b/explorer.py
similarity index 76%
rename from explorer/merged.py
rename to explorer.py
index a452269..0e4318b 100644
--- a/explorer/merged.py
+++ b/explorer.py
@@ -4,14 +4,10 @@
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
-from pathlib import Path
-from lib.figures import (
- generate_ranking_plot,
-)
# ===========================================================================
-# Define GUARDINT color scheme
+# GUARDINT color scheme
# ===========================================================================
@@ -126,8 +122,8 @@ def gen_go_pie(labels, values, marker_colors=colors, **kwargs):
yref="paper",
x=1.00,
y=0.00,
- sizex=0.15,
- sizey=0.15,
+ sizex=kwargs.get("image_sizex", 0.15),
+ sizey=kwargs.get("image_sizey", 0.15),
xanchor="right",
yanchor="bottom",
)
@@ -251,33 +247,68 @@ def gen_go_bar_stack(data, **kwargs):
@st.cache
-def render_ranking_plot(input_col):
- return generate_ranking_plot(df[filter], input_col, bodies, scoring)
-
-
-@st.cache
-def read_markdown_file(file):
- return Path(file).read_text()
-
-
-@st.cache
-def get_corr_matrix(df):
- df = pd.read_pickle("./data/merged_corr.pkl")
- fig = px.imshow(df, zmin=0, zmax=1, color_continuous_scale="viridis", height=1300)
- return fig
-
-
-@st.cache
-def get_significance_matrix(df):
- df = pd.read_pickle("./data/merged_sig.pkl")
- fig = px.imshow(df, zmin=-5, zmax=5, color_continuous_scale="viridis", height=1300)
+def gen_rank_plt(input_col, options, **kwargs):
+ input_col_score = pd.Series(index=options)
+ for i in range(1, 7):
+ input_col_counts = df[f"{input_col}[{i}]"].value_counts()
+ scores = input_col_counts.multiply(scoring[i])
+ input_col_score = input_col_score.add(scores, fill_value=0)
+ input_col_score = input_col_score.sort_values(ascending=False)
+ if i == 1:
+ ranked_first = df[f"{input_col}[1]"].value_counts()
+ ranked_first_clean = pd.DataFrame(
+ {
+ "institution": ranked_first.index,
+ "No of times
ranked first": ranked_first.values,
+ }
+ )
+ input_col_df = pd.DataFrame(
+ {
+ "institution": input_col_score.index,
+ "score": input_col_score.values,
+ }
+ )
+ input_col_df = input_col_df.merge(
+ ranked_first_clean, on="institution", how="left"
+ ).fillna(0)
+ input_col_df = input_col_df.sort_values(["score", "No of times
ranked first"])
+ fig = px.bar(
+ input_col_df.sort_values(by="score"),
+ y="institution",
+ x="score",
+ color="No of times
ranked first",
+ color_continuous_scale=[colors[5], colors[2]],
+ orientation="h",
+ )
+ # Update layout
+ fig.update_layout(
+ autosize=False,
+ width=700,
+ height=450,
+ margin=dict(l=0, r=0, b=100, t=30),
+ font={"size": 13, "family": "Roboto Mono, monospace"},
+ legend={
+ "font": {"size": kwargs.get("legend_font_size", 10)},
+ },
+ modebar={"orientation": "h"},
+ )
+ # Add logo
+ fig.add_layout_image(
+ dict(
+ source="https://raw.githubusercontent.com/snv-berlin/ioi/master/guardint_logo.png",
+ xref="paper",
+ yref="paper",
+ x=1.0,
+ y=0.0,
+ sizex=0.25,
+ sizey=0.25,
+ xanchor="right",
+ yanchor="bottom",
+ )
+ )
return fig
-def print_total(number):
- st.write(f"**{number}** respondents answered the question with the current filter")
-
-
chart_config = {
"displaylogo": False,
"modeBarButtonsToRemove": ["hoverClosestPie"],
@@ -287,6 +318,20 @@ def print_total(number):
"scale": (210 / 25.4) / (700 / 300),
},
}
+
+
+def print_total(number):
+ st.write(f"**{number}** respondents answered the question with the current filter")
+
+
+def print_answered_by(group):
+ if group == "cso":
+ text = "CSO professionals"
+ else:
+ text = "media professionals"
+ st.caption(f"This question was only answered by {text}")
+
+
# ===========================================================================
# Import data from stored pickle
# ===========================================================================
@@ -337,18 +382,16 @@ def callback():
)
st.caption(
- "__"
- + selected_section
- + "__ | Civil Society Organisation and Media representatives"
+ "__" + selected_section + "__ | Civil Society Organisation and Media professionals"
)
filters = {
- "surveytype": st.sidebar.selectbox(
- "Survey type", ["All", "Civil Society Scrutiny", "Media Scrutiny"]
- ),
"country": st.sidebar.selectbox(
"Country", ["All", "United Kingdom", "Germany", "France"]
),
+ "field": st.sidebar.selectbox(
+ "Field", ["All", "CSO Professionals", "Media Professionals"]
+ ),
}
filter = np.full(len(df.index), True)
@@ -410,6 +453,7 @@ def callback():
h3 {line-height: 1.3}
footer {visibility: hidden;}
+ .e8zbici2 {visibility: hidden;}
.custom-footer {
display: block;
@@ -425,7 +469,7 @@ def callback():
strong {
font-style: bold;
font-weight: 700;
- color: #600b0c;
+ color: #000;
}
a {
@@ -492,12 +536,12 @@ def callback():
col1, col2 = st.columns(2)
col1.metric(
- "Media representatives",
- len(df[filter & (df.surveytype == "Media Scrutiny")].index),
+ "Media professionals",
+ len(df[filter & (df.field == "Media Professionals")].index),
)
col2.metric(
- "Civil Society representatives",
- len(df[filter & (df.surveytype == "Civil Society Scrutiny")].index),
+ "Civil Society Organisation professionals",
+ len(df[filter & (df.field == "CSO Professionals")].index),
)
st.caption(
@@ -523,12 +567,6 @@ def callback():
data=file,
file_name="GUARDINT_survey_data_merged.csv",
)
- with open("profiles/merged.html", "rb") as file:
- st.download_button(
- label="Download data profile",
- data=file,
- file_name="GUARDINT_survey_data_merged_profile.html",
- )
country_counts = df[filter]["country"].value_counts()
st.write("### Country")
@@ -550,13 +588,13 @@ def callback():
)
st.write("### Field")
- surveytype_counts = df[filter]["surveytype"].value_counts()
- print_total(surveytype_counts.sum())
+ field_counts = df[filter]["field"].value_counts()
+ print_total(field_counts.sum())
st.plotly_chart(
gen_px_pie(
df[filter],
- values=surveytype_counts,
- names=surveytype_counts.index,
+ values=field_counts,
+ names=field_counts.index,
),
use_container_width=True,
config=chart_config,
@@ -720,7 +758,6 @@ def callback():
)
expertise2_counts = df[filter]["expertise2"].value_counts().sort_index()
print_total(expertise2_counts.sum())
- print(expertise2_counts.sort_index().index)
st.plotly_chart(
gen_go_pie(
labels=expertise2_counts.sort_index().index,
@@ -774,6 +811,130 @@ def callback():
config=chart_config,
)
+ 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)"
+ )
+ finance2ms_counts = df[filter]["finance2ms"].value_counts()
+ print_total(finance2ms_counts.sum())
+ st.caption("This question was only answered by media professionals")
+ st.plotly_chart(
+ gen_px_pie(
+ finance2ms_counts,
+ values=finance2ms_counts,
+ names=finance2ms_counts.index,
+ color=finance2ms_counts.index,
+ color_discrete_map={
+ "No": colors[0],
+ "Yes": colors[2],
+ "I don't know": colors[4],
+ "I prefer not to say": colors[5],
+ },
+ ),
+ use_container_width=True,
+ config=chart_config,
+ )
+
+ st.write(
+ "### How important are the following funding categories for your organisation's work on intelligence-related issues?"
+ )
+ finance2cs_options = [
+ "private_foundations",
+ "donations",
+ "national_public_funds",
+ "corporate_sponsorship",
+ "international_public_funds",
+ "other",
+ ]
+ finance2cs_options_clean = [
+ "Private foundations",
+ "Donations",
+ "National public funds",
+ "Corporate sponsorships",
+ "International public funds",
+ "Other",
+ ]
+ finance2cs_very_important = []
+ finance2cs_somewhat_important = []
+ finance2cs_important = []
+ finance2cs_slightly_important = []
+ finance2cs_not_important = []
+ finance2cs_prefer_not_to_say = []
+ for importance in [
+ "Very important",
+ "Somewhat important",
+ "Important",
+ "Slightly important",
+ "Not important at all",
+ "I prefer not to say",
+ ]:
+ for label in finance2cs_options:
+ try:
+ count = df[filter][f"finance2cs[{label}]"].value_counts()[importance]
+ except KeyError:
+ count = 0
+ if importance == "Very important":
+ finance2cs_very_important.append(count)
+ elif importance == "Somewhat important":
+ finance2cs_somewhat_important.append(count)
+ elif importance == "Important":
+ finance2cs_important.append(count)
+ elif importance == "Slightly important":
+ finance2cs_slightly_important.append(count)
+ elif importance == "Not important at all":
+ finance2cs_not_important.append(count)
+ elif importance == "I prefer not to say":
+ finance2cs_prefer_not_to_say.append(count)
+ else:
+ continue
+ totals = [
+ df[filter][f"finance2cs[{option}]"].value_counts().sum()
+ for option in finance2cs_options
+ ]
+ print_total(max(totals))
+ print_answered_by("cso")
+ st.plotly_chart(
+ gen_go_bar_stack(
+ data=[
+ go.Bar(
+ name="Very important",
+ x=finance2cs_options_clean,
+ y=finance2cs_very_important,
+ marker_color=colors[0],
+ ),
+ go.Bar(
+ name="Somewhat important",
+ x=finance2cs_options_clean,
+ y=finance2cs_somewhat_important,
+ marker_color=colors[1],
+ ),
+ go.Bar(
+ name="Important",
+ x=finance2cs_options_clean,
+ y=finance2cs_important,
+ marker_color=colors[2],
+ ),
+ go.Bar(
+ name="Slightly important",
+ x=finance2cs_options_clean,
+ y=finance2cs_slightly_important,
+ marker_color=colors[3],
+ ),
+ go.Bar(
+ name="Not important at all",
+ x=finance2cs_options_clean,
+ y=finance2cs_not_important,
+ marker_color=colors[4],
+ ),
+ go.Bar(
+ name="I prefer not to say",
+ x=finance2cs_options_clean,
+ y=finance2cs_prefer_not_to_say,
+ marker_color=colors[5],
+ ),
+ ],
+ ),
+ use_container_width=True,
+ )
st.write("## Freedom of Information")
st.write(
@@ -1141,8 +1302,8 @@ def callback():
st.write(
"""### When working on intelligence-related issues, do you feel you have reason to be concerned about...
-- surveillance of your activities (CSO representatives)
-- regarding the protection of your sources (media representatives)"""
+- surveillance of your activities (CSO professionals)
+- regarding the protection of your sources (media professionals)"""
)
protectleg1_counts = df[filter]["protectleg1"].value_counts()
@@ -1251,6 +1412,7 @@ def callback():
)
constraintinter1_counts = df[filter]["constraintinter1"].value_counts()
+ print_total(constraintinter1_counts.sum())
st.plotly_chart(
gen_px_pie(
df[filter],
@@ -1258,33 +1420,42 @@ def callback():
names=constraintinter1_counts.index,
color=constraintinter1_counts.index,
color_discrete_map={
- "No": colors[8],
- "Yes, I have evidence": colors[1],
- "Yes, I suspect": colors[2],
- "I don't know": colors[10],
- "I prefer not to say": colors[10],
+ "No": colors[0],
+ "Yes, I have evidence": colors[2],
+ "Yes, I suspect": colors[3],
+ "I don't know": colors[4],
+ "I prefer not to say": colors[5],
},
+ legend_orientation="v",
),
use_container_width=True,
)
st.write(
- "### In the past 5 years, have you been threatened with prosecution or have you actually been prosecuted for your work on intelligence-related issues? `[constraintinter2]`"
+ "### In the past 5 years, have you been threatened with prosecution or have you actually been prosecuted for your work on intelligence-related issues?"
)
- constraintinter2_counts = df[filter]["constraintinter2"].value_counts()
- constraintinter2_fig = px.pie(
- df[filter],
- values=constraintinter2_counts,
- names=constraintinter2_counts.index,
- color_discrete_sequence=colors,
+ constraintinter2_counts = df[filter]["constraintinter2"].value_counts().sort_index()
+ print_total(constraintinter2_counts.sum())
+ st.plotly_chart(
+ gen_px_pie(
+ df[filter],
+ values=constraintinter2_counts,
+ names=constraintinter2_counts.index,
+ color=constraintinter2_counts.index,
+ color_discrete_map={
+ "No": colors[0],
+ "Yes": colors[2],
+ },
+ ),
+ use_container_width=True,
+ config=chart_config,
)
- st.plotly_chart(constraintinter2_fig)
-
- st.write("### What was the outcome? `[constraintinter3]`")
+ st.write("### What was the outcome?")
constraintinter3_counts = df[filter]["constraintinter3"].value_counts()
+ print_total(constraintinter3_counts.sum())
st.plotly_chart(
gen_px_pie(
df[filter],
@@ -1296,17 +1467,42 @@ def callback():
)
st.write(
- "### In the past 5 years, have you experienced any of the following interferences by public authorities in relation to your work on intelligence related topics? `[constraintinter4]`"
+ "### In the past 5 years, have you experienced any of the following interferences by public authorities in relation to your work on intelligence related topics?"
)
- # TODO Map proper labels
constraintinter4_yes = []
constraintinter4_no = []
constraintinter4_dont_know = []
constraintinter4_prefer_not_to_say = []
+ constraintinter4_options = [
+ "police_search",
+ "seizure",
+ "extortion",
+ "violent_threat",
+ "inspection_during_travel",
+ "detention",
+ "surveillance_signalling",
+ "online_harassment",
+ "entry_on_deny_lists",
+ "exclusion_from_events",
+ "public_defamation",
+ ]
+ constraintinter4_options_clean = [
+ "Police searches",
+ "Seizure of material",
+ "Extortion",
+ "Violent threats",
+ "Special inspections during travels",
+ "Detention",
+ "Surveillance signalling",
+ "Online harassment",
+ "Entry on deny lists",
+ "Exclusion from events",
+ "Public defamation",
+ ]
for answer in ["Yes", "No", "I don't know", "I prefer not to say"]:
- for label in constraintinter4_options:
+ for option in constraintinter4_options:
try:
- count = df[filter][f"constraintinter4[{label}]"].value_counts()[answer]
+ count = df[filter][f"constraintinter4[{option}]"].value_counts()[answer]
except KeyError:
count = 0
if answer == "Yes":
@@ -1319,46 +1515,53 @@ def callback():
constraintinter4_prefer_not_to_say.append(count)
else:
continue
+ totals = [
+ df[filter][f"constraintinter4[{option}]"].value_counts().sum()
+ for option in constraintinter4_options
+ ]
+ print_total(max(totals))
st.plotly_chart(
gen_go_bar_stack(
data=[
go.Bar(
name="Yes",
- x=constraintinter4_options,
+ x=constraintinter4_options_clean,
y=constraintinter4_yes,
marker_color=colors[2],
),
go.Bar(
name="No",
- x=constraintinter4_options,
+ x=constraintinter4_options_clean,
y=constraintinter4_no,
- marker_color=colors[8],
+ marker_color=colors[0],
),
go.Bar(
name="I don't know",
- x=constraintinter4_options,
+ x=constraintinter4_options_clean,
y=constraintinter4_dont_know,
- marker_color="#7f7f7f",
+ marker_color=colors[4],
opacity=0.8,
),
go.Bar(
name="I prefer not to say",
- x=constraintinter4_options,
+ x=constraintinter4_options_clean,
y=constraintinter4_prefer_not_to_say,
- marker_color="#525252",
+ marker_color=colors[5],
opacity=0.8,
),
],
),
use_container_width=True,
+ config=chart_config,
)
st.write(
- "### In the past 5 years, have you been approached by intelligence officials and received... `[constraintinter5]`"
+ "### In the past 5 years, have you been approached by intelligence officials and received..."
)
- constraintinter5_options = [
+ constraintinter5_options = ["unsolicited_information", "invitations", "other"]
+ constraintinter5_options_clean = [
"Unsolicited information",
- "Invitations to off-the-record events or meetings",
+ "Invitations to off-the-record
events or meetings",
"Other",
]
constraintinter5_yes = []
@@ -1366,7 +1569,7 @@ 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 ["unsolicited_information", "invitations", "other"]:
+ for label in constraintinter5_options:
try:
count = df[filter][f"constraintinter5[{label}]"].value_counts()[answer]
except KeyError:
@@ -1381,33 +1584,38 @@ def callback():
constraintinter5_prefer_not_to_say.append(count)
else:
continue
+ totals = [
+ df[filter][f"constraintinter5[{option}]"].value_counts().sum()
+ for option in constraintinter5_options
+ ]
+ print_total(max(totals))
st.plotly_chart(
gen_go_bar_stack(
data=[
go.Bar(
name="Yes",
- x=constraintinter5_options,
+ x=constraintinter5_options_clean,
y=constraintinter5_yes,
marker_color=colors[2],
),
go.Bar(
name="No",
- x=constraintinter5_options,
+ x=constraintinter5_options_clean,
y=constraintinter5_no,
- marker_color=colors[8],
+ marker_color=colors[0],
),
go.Bar(
name="I don't know",
- x=constraintinter5_options,
+ x=constraintinter5_options_clean,
y=constraintinter5_dont_know,
- marker_color="#7f7f7f",
+ marker_color=colors[4],
opacity=0.8,
),
go.Bar(
name="I prefer not to say",
- x=constraintinter5_options,
+ x=constraintinter5_options_clean,
y=constraintinter5_prefer_not_to_say,
- marker_color="#525252",
+ marker_color=colors[5],
opacity=0.8,
),
],
@@ -1415,15 +1623,18 @@ def callback():
use_container_width=True,
)
- st.write("### If you selected ‘other’, please specify `[constraintinter5other]`")
- for i in df[filter]["constraintinter5other"].to_list():
- if type(i) != float:
- st.write("- " + i)
-
st.write(
- "### When working on intelligence-related issues have you ever experienced harassment by security agencies or politicians due to your... `[constraintinter6]`"
+ "### When working on intelligence-related issues have you ever experienced harassment by security agencies or politicians due to your..."
)
constraintinter6_options = [
+ "gender",
+ "ethnicity",
+ "political",
+ "sexual",
+ "religious",
+ "other",
+ ]
+ constraintinter6_options_clean = [
"Gender",
"Ethnicity",
"Political orientation",
@@ -1436,14 +1647,7 @@ 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 [
- "gender",
- "ethnicity",
- "political",
- "sexual",
- "religious",
- "other",
- ]:
+ for label in constraintinter6_options:
try:
count = df[filter][f"constraintinter6[{label}]"].value_counts()[answer]
except KeyError:
@@ -1458,83 +1662,102 @@ def callback():
constraintinter6_prefer_not_to_say.append(count)
else:
continue
+ totals = [
+ df[filter][f"constraintinter6[{option}]"].value_counts().sum()
+ for option in constraintinter6_options
+ ]
+ print_total(max(totals))
st.plotly_chart(
gen_go_bar_stack(
data=[
go.Bar(
name="Yes",
- x=constraintinter6_options,
+ x=constraintinter6_options_clean,
y=constraintinter6_yes,
marker_color=colors[2],
),
go.Bar(
name="No",
- x=constraintinter6_options,
+ x=constraintinter6_options_clean,
y=constraintinter6_no,
- marker_color=colors[8],
+ marker_color=colors[0],
),
go.Bar(
name="I don't know",
- x=constraintinter6_options,
+ x=constraintinter6_options_clean,
y=constraintinter6_dont_know,
- marker_color="#7f7f7f",
+ marker_color=colors[4],
opacity=0.8,
),
go.Bar(
name="I prefer not to say",
- x=constraintinter6_options,
+ x=constraintinter6_options_clean,
y=constraintinter6_prefer_not_to_say,
- marker_color="#525252",
+ marker_color=colors[5],
opacity=0.8,
),
],
),
use_container_width=True,
+ config=chart_config,
)
- st.write("### If you selected ‘other’, please specify `[constraintinter6other]`")
- for i in df[filter]["constraintinter6other"].to_list():
- if type(i) != float:
- st.write("- " + i)
+# ===========================================================================
+# Attitudes
+# ===========================================================================
if selected_section == "Attitudes":
st.write("# Attitudes")
st.write(
- "### The following four statements are about **intelligence agencies**. Please select the statement you most agree with, based on your national context. `[attitude1]`"
+ "### The following four statements are about **intelligence agencies**. Please select the statement you most agree with, based on your national context."
)
- attitude1_counts = df[filter]["attitude1"].value_counts()
+ attitude1_counts = df[filter]["attitude1"].value_counts().sort_index()
+ print_total(attitude1_counts.sum())
st.plotly_chart(
- gen_px_pie(
- df[filter],
- values=attitude1_counts,
- names=attitude1_counts.index,
- color_discrete_sequence=colors,
+ gen_go_pie(
+ labels=attitude1_counts.sort_index().index,
+ values=attitude1_counts.sort_index().values,
+ height=600,
+ font_size=13,
+ legend_font_size=11,
+ legend_x=-0.75,
+ legend_y=1.5,
+ image_sizex=0.25,
+ image_sizey=0.25,
),
use_container_width=True,
+ config=chart_config,
)
st.write(
- "### The following four statements are about **intelligence oversight**. Please select the statement you most agree with, based on your national context. `[attitude2]`"
+ "### The following four statements are about **intelligence oversight**. Please select the statement you most agree with, based on your national context."
)
-
- attitude2_counts = df[filter]["attitude2"].value_counts()
+ attitude2_counts = df[filter]["attitude2"].value_counts().sort_index()
+ attitude2_counts[
+ "A1: Intelligence oversight generally succeeds
in uncovering past misconduct and preventing
future misconduct"
+ ] = 0
+ print(attitude2_counts)
st.plotly_chart(
- gen_px_pie(
- df[filter],
- values=attitude2_counts,
- names=attitude2_counts.index,
- color_discrete_sequence=colors,
+ gen_go_pie(
+ labels=attitude2_counts.sort_index().index,
+ values=attitude2_counts.sort_index().values,
+ height=600,
+ font_size=13,
+ legend_font_size=11,
+ legend_x=-0.75,
+ legend_y=1.5,
+ image_sizex=0.25,
+ image_sizey=0.25,
),
use_container_width=True,
+ config=chart_config,
)
st.write(
"### In your personal view, what are the goals of intelligence oversight? Please select the three goals of oversight you subscribe to the most. `[attitude3]`"
)
-
- # TODO Map proper labels
attitude3_options = [
"rule_of_law",
"civil_liberties",
@@ -1544,7 +1767,6 @@ def callback():
"critique_of_intel",
"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()
@@ -1554,7 +1776,17 @@ def callback():
ignore_index=True,
)
attitude3_df = attitude3_df.drop_duplicates()
-
+ attitude3_df = attitude3_df.replace(
+ {
+ "rule_of_law": "Rule of law",
+ "civil_liberties": "Civil liberties",
+ "effectiveness_of_intel": "Effectiveness of intelligence agencies",
+ "legitimacy_of_intel": "Legitimacy of intelligence agencies",
+ "trust_in_intel": "Trust in intelligence agencies",
+ "critique_of_intel": "Critique of intelligence agencies",
+ "prefer_not_to_say": "I prefer not to say",
+ }
+ )
st.plotly_chart(
gen_px_histogram(
df=attitude3_df,
@@ -1564,12 +1796,13 @@ def callback():
color="country",
color_discrete_map={
"Germany": colors[0],
- "France": colors[2],
- "United Kingdom": colors[5],
+ "United Kingdom": colors[2],
+ "France": colors[5],
},
labels={"count": "people who answered 'Yes'"},
),
use_container_width=True,
+ config=chart_config,
)
scoring = {1: 6, 2: 5, 3: 4, 4: 3, 5: 2, 6: 1}
@@ -1585,17 +1818,23 @@ def callback():
st.write(
"### Which of the following actors do you trust the most to **enable public debate** on surveillance by intelligence agencies? `[attitude4]`"
)
- st.plotly_chart(render_ranking_plot("attitude4"), use_container_width=True)
+ st.plotly_chart(
+ gen_rank_plt("attitude4", bodies), use_container_width=True, config=chart_config
+ )
st.write(
- "### Which of the following actors do you trust the most to **contest surveillance** by intelligence agencies? `[attitude5]`"
+ "### Which of the following actors do you trust the most to **contest surveillance** by intelligence agencies?"
+ )
+ st.plotly_chart(
+ gen_rank_plt("attitude5", bodies), use_container_width=True, config=chart_config
)
- st.plotly_chart(render_ranking_plot("attitude5"), use_container_width=True)
st.write(
- "### Which of the following actors do you trust the most to **enforce compliance** regarding surveillance by intelligence agencies? `[attitude6]`"
+ "### Which of the following actors do you trust the most to **enforce compliance** regarding surveillance by intelligence agencies?"
+ )
+ st.plotly_chart(
+ gen_rank_plt("attitude6", bodies), use_container_width=True, config=chart_config
)
- st.plotly_chart(render_ranking_plot("attitude6"), use_container_width=True)
# ===========================================================================
# Footer
diff --git a/poetry.lock b/poetry.lock
index 2e0e939..0ad4c0f 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -19,7 +19,7 @@ dev = ["black", "docutils", "ipython", "flake8", "pytest", "sphinx", "m2r", "veg
[[package]]
name = "anyio"
-version = "3.3.4"
+version = "3.4.0"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
category = "dev"
optional = false
@@ -31,7 +31,7 @@ sniffio = ">=1.1"
[package.extras]
doc = ["sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"]
-test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"]
+test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"]
trio = ["trio (>=0.16)"]
[[package]]
@@ -112,7 +112,7 @@ tests = ["mypy", "PyHamcrest (>=2.0.2)", "pytest (>=4.6)", "pytest-benchmark", "
[[package]]
name = "black"
-version = "21.10b0"
+version = "21.11b1"
description = "The uncompromising code formatter."
category = "dev"
optional = false
@@ -123,7 +123,7 @@ click = ">=7.1.2"
mypy-extensions = ">=0.4.3"
pathspec = ">=0.9.0,<1"
platformdirs = ">=2"
-regex = ">=2020.1.8"
+regex = ">=2021.4.4"
tomli = ">=0.2.6,<2.0.0"
typing-extensions = [
{version = ">=3.10.0.0", markers = "python_version < \"3.10\""},
@@ -187,7 +187,7 @@ pycparser = "*"
[[package]]
name = "charset-normalizer"
-version = "2.0.7"
+version = "2.0.8"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
category = "main"
optional = false
@@ -216,7 +216,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
name = "cycler"
version = "0.11.0"
description = "Composable style cycles"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.6"
@@ -256,15 +256,15 @@ python-versions = ">=2.7"
name = "et-xmlfile"
version = "1.1.0"
description = "An implementation of lxml.xmlfile for the standard library"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.6"
[[package]]
name = "fonttools"
-version = "4.28.1"
+version = "4.28.2"
description = "Tools to manipulate font files"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.7"
@@ -314,7 +314,7 @@ python-versions = ">=3.5"
[[package]]
name = "ipykernel"
-version = "6.5.0"
+version = "6.5.1"
description = "IPython Kernel for Jupyter"
category = "main"
optional = false
@@ -323,7 +323,7 @@ python-versions = ">=3.7"
[package.dependencies]
appnope = {version = "*", markers = "platform_system == \"Darwin\""}
debugpy = ">=1.0.0,<2.0"
-ipython = ">=7.23.1,<8.0"
+ipython = ">=7.23.1"
jupyter-client = "<8.0"
matplotlib-inline = ">=0.1.0,<0.2.0"
tornado = ">=4.2,<7.0"
@@ -334,7 +334,7 @@ test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "ipyparallel"]
[[package]]
name = "ipython"
-version = "7.29.0"
+version = "7.30.0"
description = "IPython: Productive Interactive Computing"
category = "main"
optional = false
@@ -408,7 +408,7 @@ plugins = ["setuptools"]
[[package]]
name = "jedi"
-version = "0.18.0"
+version = "0.18.1"
description = "An autocompletion tool for Python that can be used for text editors."
category = "main"
optional = false
@@ -419,7 +419,7 @@ parso = ">=0.8.0,<0.9.0"
[package.extras]
qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
-testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"]
+testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"]
[[package]]
name = "jinja2"
@@ -439,7 +439,7 @@ i18n = ["Babel (>=2.7)"]
name = "joblib"
version = "1.1.0"
description = "Lightweight pipelining with Python functions"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.6"
@@ -472,7 +472,7 @@ format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-
[[package]]
name = "jupyter-client"
-version = "7.0.6"
+version = "7.1.0"
description = "Jupyter protocol implementation and client libraries"
category = "main"
optional = false
@@ -505,7 +505,7 @@ traitlets = "*"
[[package]]
name = "jupyter-server"
-version = "1.11.2"
+version = "1.12.1"
description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications."
category = "dev"
optional = false
@@ -533,7 +533,7 @@ test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-mock", "requests", "
[[package]]
name = "jupyterlab"
-version = "3.2.3"
+version = "3.2.4"
description = "JupyterLab computational environment"
category = "dev"
optional = false
@@ -608,7 +608,7 @@ python-versions = ">=3.6"
name = "kiwisolver"
version = "1.3.2"
description = "A fast implementation of the Cassowary constraint solver"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.7"
@@ -624,7 +624,7 @@ python-versions = ">=3.6"
name = "matplotlib"
version = "3.5.0"
description = "Python plotting package"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.7"
@@ -683,7 +683,7 @@ test = ["pytest", "pytest-tornasync", "pytest-console-scripts"]
[[package]]
name = "nbclient"
-version = "0.5.8"
+version = "0.5.9"
description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor."
category = "main"
optional = false
@@ -758,7 +758,7 @@ python-versions = ">=3.5"
[[package]]
name = "notebook"
-version = "6.4.5"
+version = "6.4.6"
description = "A web-based notebook environment for interactive computing"
category = "main"
optional = false
@@ -773,9 +773,10 @@ jupyter-client = ">=5.3.4"
jupyter-core = ">=4.6.1"
nbconvert = "*"
nbformat = "*"
+nest-asyncio = ">=1.5"
prometheus-client = "*"
pyzmq = ">=17"
-Send2Trash = ">=1.5.0"
+Send2Trash = ">=1.8.0"
terminado = ">=0.8.3"
tornado = ">=6.1"
traitlets = ">=4.2.1"
@@ -797,7 +798,7 @@ python-versions = ">=3.7"
name = "openpyxl"
version = "3.0.9"
description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.6"
@@ -806,14 +807,14 @@ et-xmlfile = "*"
[[package]]
name = "packaging"
-version = "21.2"
+version = "21.3"
description = "Core utilities for Python packages"
category = "main"
optional = false
python-versions = ">=3.6"
[package.dependencies]
-pyparsing = ">=2.0.2,<3"
+pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
[[package]]
name = "pandas"
@@ -838,7 +839,7 @@ test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"]
[[package]]
name = "pandas-stubs"
-version = "1.2.0.38"
+version = "1.2.0.39"
description = "Type annotations for Pandas"
category = "dev"
optional = false
@@ -887,7 +888,7 @@ ptyprocess = ">=0.5"
name = "phik"
version = "0.12.0"
description = "Phi_K correlation analyzer library"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.6"
@@ -954,7 +955,7 @@ twisted = ["twisted"]
[[package]]
name = "prompt-toolkit"
-version = "3.0.22"
+version = "3.0.23"
description = "Library for building powerful interactive command lines in Python"
category = "main"
optional = false
@@ -989,7 +990,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
name = "pyarrow"
-version = "6.0.0"
+version = "6.0.1"
description = "Python library for Apache Arrow"
category = "main"
optional = false
@@ -1042,11 +1043,14 @@ python-versions = "*"
[[package]]
name = "pyparsing"
-version = "2.4.7"
+version = "3.0.6"
description = "Python parsing module"
category = "main"
optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+python-versions = ">=3.6"
+
+[package.extras]
+diagrams = ["jinja2", "railroad-diagrams"]
[[package]]
name = "pyrsistent"
@@ -1144,7 +1148,7 @@ use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
name = "scipy"
version = "1.6.1"
description = "SciPy: Scientific Library for Python"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.7"
@@ -1168,7 +1172,7 @@ win32 = ["pywin32"]
name = "setuptools-scm"
version = "6.3.2"
description = "the blessed package to manage your versions by scm tags"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.6"
@@ -1286,7 +1290,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
name = "tomli"
version = "1.2.2"
description = "A lil' TOML parser"
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.6"
@@ -1431,14 +1435,14 @@ notebook = ">=4.4.1"
name = "xlsxwriter"
version = "3.0.2"
description = "A Python module for creating Excel XLSX files."
-category = "main"
+category = "dev"
optional = false
python-versions = ">=3.4"
[metadata]
lock-version = "1.1"
python-versions = "^3.9"
-content-hash = "a2e303511f16ffa387a5aec77d233eeed7e09618d2fac2c32b54d5aa4abb2c92"
+content-hash = "5183c7eb68985e0a8b545d304f93a2c023474f7b76cd0f37136b929660737c99"
[metadata.files]
altair = [
@@ -1446,8 +1450,8 @@ altair = [
{file = "altair-4.1.0.tar.gz", hash = "sha256:3edd30d4f4bb0a37278b72578e7e60bc72045a8e6704179e2f4738e35bc12931"},
]
anyio = [
- {file = "anyio-3.3.4-py3-none-any.whl", hash = "sha256:4fd09a25ab7fa01d34512b7249e366cd10358cdafc95022c7ff8c8f8a5026d66"},
- {file = "anyio-3.3.4.tar.gz", hash = "sha256:67da67b5b21f96b9d3d65daa6ea99f5d5282cb09f50eb4456f8fb51dffefc3ff"},
+ {file = "anyio-3.4.0-py3-none-any.whl", hash = "sha256:2855a9423524abcdd652d942f8932fda1735210f77a6b392eafd9ff34d3fe020"},
+ {file = "anyio-3.4.0.tar.gz", hash = "sha256:24adc69309fb5779bc1e06158e143e0b6d2c56b302a3ac3de3083c705a6ed39d"},
]
appnope = [
{file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"},
@@ -1487,8 +1491,8 @@ base58 = [
{file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"},
]
black = [
- {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"},
- {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"},
+ {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"},
+ {file = "black-21.11b1.tar.gz", hash = "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2"},
]
bleach = [
{file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"},
@@ -1558,8 +1562,8 @@ cffi = [
{file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"},
]
charset-normalizer = [
- {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"},
- {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"},
+ {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"},
+ {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"},
]
click = [
{file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
@@ -1613,8 +1617,8 @@ et-xmlfile = [
{file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
]
fonttools = [
- {file = "fonttools-4.28.1-py3-none-any.whl", hash = "sha256:68071406009e7ef6a5fdcd85d95975cd6963867bb226f2b786bfffe15d1959ef"},
- {file = "fonttools-4.28.1.zip", hash = "sha256:8c8f84131bf04f3b1dcf99b9763cec35c347164ab6ad006e18d2f99fcab05529"},
+ {file = "fonttools-4.28.2-py3-none-any.whl", hash = "sha256:eff1da7ea274c54cb8842853005a139f711646cbf6f1bcfb6c9b86a627f35ff0"},
+ {file = "fonttools-4.28.2.zip", hash = "sha256:dca694331af74c8ad47acc5171e57f6b78fac5692bf050f2ab572964577ac0dd"},
]
gitdb = [
{file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
@@ -1629,12 +1633,12 @@ idna = [
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
]
ipykernel = [
- {file = "ipykernel-6.5.0-py3-none-any.whl", hash = "sha256:f43de132feea90f86d68c51013afe9694f9415f440053ec9909dd656c75b04b5"},
- {file = "ipykernel-6.5.0.tar.gz", hash = "sha256:299795cca2c4aed7e233e3ad5360e1c73627fd0dcec11a9e75d5b2df43629353"},
+ {file = "ipykernel-6.5.1-py3-none-any.whl", hash = "sha256:ff0cb4a67326d2f903b7d7a2e63719d082434b46f00536410bd4e3ad2b98f3b7"},
+ {file = "ipykernel-6.5.1.tar.gz", hash = "sha256:dd27172bccbbcfef952991e49372e4c6fd1c14eed0df05ebd5b4335cb27a81a2"},
]
ipython = [
- {file = "ipython-7.29.0-py3-none-any.whl", hash = "sha256:a658beaf856ce46bc453366d5dc6b2ddc6c481efd3540cb28aa3943819caac9f"},
- {file = "ipython-7.29.0.tar.gz", hash = "sha256:4f69d7423a5a1972f6347ff233e38bbf4df6a150ef20fbb00c635442ac3060aa"},
+ {file = "ipython-7.30.0-py3-none-any.whl", hash = "sha256:c8f3e07aefb9cf9e067f39686f035ce09b27a1ee602116a3030b91b6fc138ee4"},
+ {file = "ipython-7.30.0.tar.gz", hash = "sha256:d41f8e80b99690122400f9b2069b12f670246a1b4cc5d332bd6c4e2500e6d6fb"},
]
ipython-genutils = [
{file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"},
@@ -1649,8 +1653,8 @@ isort = [
{file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"},
]
jedi = [
- {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"},
- {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"},
+ {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"},
+ {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"},
]
jinja2 = [
{file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"},
@@ -1669,20 +1673,20 @@ jsonschema = [
{file = "jsonschema-4.2.1.tar.gz", hash = "sha256:390713469ae64b8a58698bb3cbc3859abe6925b565a973f87323ef21b09a27a8"},
]
jupyter-client = [
- {file = "jupyter_client-7.0.6-py3-none-any.whl", hash = "sha256:074bdeb1ffaef4a3095468ee16313938cfdc48fc65ca95cc18980b956c2e5d79"},
- {file = "jupyter_client-7.0.6.tar.gz", hash = "sha256:8b6e06000eb9399775e0a55c52df6c1be4766666209c22f90c2691ded0e338dc"},
+ {file = "jupyter_client-7.1.0-py3-none-any.whl", hash = "sha256:64d93752d8cbfba0c1030c3335c3f0d9797cd1efac012652a14aac1653db11a3"},
+ {file = "jupyter_client-7.1.0.tar.gz", hash = "sha256:a5f995a73cffb314ed262713ae6dfce53c6b8216cea9f332071b8ff44a6e1654"},
]
jupyter-core = [
{file = "jupyter_core-4.9.1-py3-none-any.whl", hash = "sha256:1c091f3bbefd6f2a8782f2c1db662ca8478ac240e962ae2c66f0b87c818154ea"},
{file = "jupyter_core-4.9.1.tar.gz", hash = "sha256:dce8a7499da5a53ae3afd5a9f4b02e5df1d57250cf48f3ad79da23b4778cd6fa"},
]
jupyter-server = [
- {file = "jupyter_server-1.11.2-py3-none-any.whl", hash = "sha256:eb247b555f5bdfb4a219d78e86bc8769456a1a712d8e30a4dbe06e3fe7e8a278"},
- {file = "jupyter_server-1.11.2.tar.gz", hash = "sha256:c1f32e0c1807ab2de37bf70af97a36b4436db0bc8af3124632b1f4441038bf95"},
+ {file = "jupyter_server-1.12.1-py3-none-any.whl", hash = "sha256:93a84d06c35613ecf3bc5de8ff2d92a410a3a5f57a3a23444ca75e4b2b390209"},
+ {file = "jupyter_server-1.12.1.tar.gz", hash = "sha256:f71e10ebaa6704a1e0fe76ec70a16a0804ab5a9d268f0c512e8c69086a8e86d1"},
]
jupyterlab = [
- {file = "jupyterlab-3.2.3-py3-none-any.whl", hash = "sha256:7d7f0280654a8472c47a9d7b5164b74a961a8095ad4ce7fb26ef539ea1d7efd1"},
- {file = "jupyterlab-3.2.3.tar.gz", hash = "sha256:7d74593e52d4dbfacbb98e14cac4bc765ea2cffb1b980675f44930d622871705"},
+ {file = "jupyterlab-3.2.4-py3-none-any.whl", hash = "sha256:b2375626001ab48af85e5da542a56a163ac8b490828642757e4e0e5e8c5af59d"},
+ {file = "jupyterlab-3.2.4.tar.gz", hash = "sha256:f692e0d95338d60f72dde660f16f3955a087775c59ec541ddb25952e3f97e9b1"},
]
jupyterlab-code-formatter = [
{file = "jupyterlab_code_formatter-1.4.10-py3-none-any.whl", hash = "sha256:10a7f2ab44a4539a44ec6bf3fc3b27e7ed22c7ab975e6503823e21d7e60abae7"},
@@ -1752,6 +1756,9 @@ markupsafe = [
{file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
{file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
{file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"},
{file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
{file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
{file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
@@ -1763,6 +1770,9 @@ markupsafe = [
{file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
{file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
{file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"},
{file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
{file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
{file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
@@ -1774,6 +1784,9 @@ markupsafe = [
{file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
{file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
{file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"},
{file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
{file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
{file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
@@ -1786,6 +1799,9 @@ markupsafe = [
{file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
{file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
{file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"},
{file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
{file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
{file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
@@ -1798,6 +1814,9 @@ markupsafe = [
{file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
{file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
{file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"},
{file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
{file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
{file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
@@ -1856,8 +1875,8 @@ nbclassic = [
{file = "nbclassic-0.3.4.tar.gz", hash = "sha256:f00b07ef4908fc38fd332d2676ccd3ceea5076528feaf21bd27e809ef20f5578"},
]
nbclient = [
- {file = "nbclient-0.5.8-py3-none-any.whl", hash = "sha256:e85d4d6280d0a0237c1a6ec7a5e0757cf40a1fcb8c47253516b3a1f87f4ceae8"},
- {file = "nbclient-0.5.8.tar.gz", hash = "sha256:34f52cc9cb831a5d8ccd7031537e354c75dc61a24487f998712d1289de320a25"},
+ {file = "nbclient-0.5.9-py3-none-any.whl", hash = "sha256:8a307be4129cce5f70eb83a57c3edbe45656623c31de54e38bb6fdfbadc428b3"},
+ {file = "nbclient-0.5.9.tar.gz", hash = "sha256:99e46ddafacd0b861293bf246fed8540a184adfa3aa7d641f89031ec070701e0"},
]
nbconvert = [
{file = "nbconvert-6.3.0-py3-none-any.whl", hash = "sha256:8f23fbeabda4a500685d788ee091bf22cf34119304314304fb39f16e2fc32f37"},
@@ -1872,8 +1891,8 @@ nest-asyncio = [
{file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"},
]
notebook = [
- {file = "notebook-6.4.5-py3-none-any.whl", hash = "sha256:f7b4362698fed34f44038de0517b2e5136c1e7c379797198c1736121d3d597bd"},
- {file = "notebook-6.4.5.tar.gz", hash = "sha256:872e20da9ae518bbcac3e4e0092d5bd35454e847dedb8cb9739e9f3b68406be0"},
+ {file = "notebook-6.4.6-py3-none-any.whl", hash = "sha256:5cad068fa82cd4fb98d341c052100ed50cd69fbfb4118cb9b8ab5a346ef27551"},
+ {file = "notebook-6.4.6.tar.gz", hash = "sha256:7bcdf79bd1cda534735bd9830d2cbedab4ee34d8fe1df6e7b946b3aab0902ba3"},
]
numpy = [
{file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"},
@@ -1910,8 +1929,8 @@ openpyxl = [
{file = "openpyxl-3.0.9.tar.gz", hash = "sha256:40f568b9829bf9e446acfffce30250ac1fa39035124d55fc024025c41481c90f"},
]
packaging = [
- {file = "packaging-21.2-py3-none-any.whl", hash = "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0"},
- {file = "packaging-21.2.tar.gz", hash = "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966"},
+ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
+ {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
]
pandas = [
{file = "pandas-1.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:372d72a3d8a5f2dbaf566a5fa5fa7f230842ac80f29a931fb4b071502cf86b9a"},
@@ -1937,8 +1956,8 @@ pandas = [
{file = "pandas-1.3.4.tar.gz", hash = "sha256:a2aa18d3f0b7d538e21932f637fbfe8518d085238b429e4790a35e1e44a96ffc"},
]
pandas-stubs = [
- {file = "pandas-stubs-1.2.0.38.tar.gz", hash = "sha256:9f16206e48ce7aaf499703a07e9196e40a62e3364149105fbe1f9a2f82efecf3"},
- {file = "pandas_stubs-1.2.0.38-py3-none-any.whl", hash = "sha256:e8b6eb5e4985c81d12c8446e9384dba04720f50957cc6d0c5d82b958da320fe2"},
+ {file = "pandas-stubs-1.2.0.39.tar.gz", hash = "sha256:a9b8d95e41a58657918e9b0b665808925e86fbc508bc59e50e99e384b28f6498"},
+ {file = "pandas_stubs-1.2.0.39-py3-none-any.whl", hash = "sha256:d6cb03bc2c4681c678450c35b66d735937763e5c74cdeb8388fc706eb8d52d7d"},
]
pandocfilters = [
{file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"},
@@ -2039,8 +2058,8 @@ prometheus-client = [
{file = "prometheus_client-0.12.0.tar.gz", hash = "sha256:1b12ba48cee33b9b0b9de64a1047cbd3c5f2d0ab6ebcead7ddda613a750ec3c5"},
]
prompt-toolkit = [
- {file = "prompt_toolkit-3.0.22-py3-none-any.whl", hash = "sha256:48d85cdca8b6c4f16480c7ce03fd193666b62b0a21667ca56b4bb5ad679d1170"},
- {file = "prompt_toolkit-3.0.22.tar.gz", hash = "sha256:449f333dd120bd01f5d296a8ce1452114ba3a71fae7288d2f0ae2c918764fa72"},
+ {file = "prompt_toolkit-3.0.23-py3-none-any.whl", hash = "sha256:5f29d62cb7a0ecacfa3d8ceea05a63cd22500543472d64298fc06ddda906b25d"},
+ {file = "prompt_toolkit-3.0.23.tar.gz", hash = "sha256:7053aba00895473cb357819358ef33f11aa97e4ac83d38efb123e5649ceeecaf"},
]
protobuf = [
{file = "protobuf-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8"},
@@ -2077,42 +2096,42 @@ py = [
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
]
pyarrow = [
- {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:c7a6e7e0bf8779e9c3428ced85507541f3da9a0675e2f4781d4eb2c7042cbf81"},
- {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:7a683f71b848eb6310b4ec48c0def55dac839e9994c1ac874c9b2d3d5625def1"},
- {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5144bd9db2920c7cb566c96462d62443cc239104f94771d110f74393f2fb42a2"},
- {file = "pyarrow-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed0be080cf595ea15ff1c9ff4097bbf1fcc4b50847d98c0a3c0412fbc6ede7e9"},
- {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:072c1a0fca4509eefd7d018b78542fb7e5c63aaf5698f1c0a6e45628ae17ba44"},
- {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5bed4f948c032c40597302e9bdfa65f62295240306976ecbe43a54924c6f94f"},
- {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465f87fa0be0b2928b2beeba22b5813a0203fb05d90fd8563eea48e08ecc030e"},
- {file = "pyarrow-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ddf2e6e3b321adaaf716f2d5af8e92d205a9671e0cb7c0779710a567fd1dd580"},
- {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:0204e80777ab8f4e9abd3a765a8ec07ed1e3c4630bacda50d2ce212ef0f3826f"},
- {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:82fe80309e01acf29e3943a1f6d3c98ec109fe1d356bc1ac37d639bcaadcf684"},
- {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:281ce5fa03621d786a9beb514abb09846db7f0221b50eabf543caa24037eaacd"},
- {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5408fa8d623e66a0445f3fb0e4027fd219bf99bfb57422d543d7b7876e2c5b55"},
- {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a19e58dfb04e451cd8b7bdec3ac8848373b95dfc53492c9a69789aa9074a3c1b"},
- {file = "pyarrow-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b86d175262db1eb46afdceb36d459409eb6f8e532d3dec162f8bf572c7f57623"},
- {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2d2c681659396c745e4f1988d5dd41dcc3ad557bb8d4a8c2e44030edafc08a91"},
- {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c666bc6a1cebf01206e2dc1ab05f25f39f35d3a499e0ef5cd635225e07306ca"},
- {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d41dfb09ba9236cca6245f33088eb42f3c54023da281139241e0f9f3b4b754e"},
- {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c746ef42c039348a288584800e299456c80c5691401bb9b19aa9c02a427b7"},
- {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c38263ea438a1666b13372e7565450cfeec32dbcd1c2595749476a58465eaec"},
- {file = "pyarrow-6.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e81508239a71943759cee272ce625ae208092dd36ef2c6713fccee30bbcf52bb"},
- {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:a50d2f77b86af38ceabf45617208b9105d20e7a5eebc584e7c8c0acededd82ce"},
- {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbda7595f24a639bcef3419ecfac17216efacb09f7b0f1b4c4c97f900d65ca0e"},
- {file = "pyarrow-6.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf3400780c4d3c9cb43b1e8a1aaf2e1b7199a0572d0a645529d2784e4d0d8497"},
- {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:15dc0d673d3f865ca63c877bd7a2eced70b0a08969fb733a28247134b8a1f18b"},
- {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1d9a2f4ee812ed0bd4182cabef99ea914ac297274f0de086f2488093d284ef"},
- {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d046dc78a9337baa6415be915c5a16222505233e238a1017f368243c89817eea"},
- {file = "pyarrow-6.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ea64a48a85c631eb2a0ea13ccdec5143c85b5897836b16331ee4289d27a57247"},
- {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:cc1d4a70efd583befe92d4ea6f74ed2e0aa31ccdde767cd5cae8e77c65a1c2d4"},
- {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:004185e0babc6f3c3fba6ba4f106e406a0113d0f82bb9ad9a8571a1978c45d04"},
- {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c23f8cdecd3d9e49f9b0f9a651ae5549d1d32fd4901fb1bdc2d327edfba844f"},
- {file = "pyarrow-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb701ec4a94b92102606d4e88f0b8eba34f09a5ad8e014eaa4af76f42b7f62ae"},
- {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da7860688c33ca88ac05f1a487d32d96d9caa091412496c35f3d1d832145675a"},
- {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac941a147d14993987cc8b605b721735a34b3e54d167302501fb4db1ad7382c7"},
- {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6163d82cca7541774b00503c295fe86a1722820eddb958b57f091bb6f5b0a6db"},
- {file = "pyarrow-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:376c4b5f248ae63df21fe15c194e9013753164be2d38f4b3fb8bde63ac5a1958"},
- {file = "pyarrow-6.0.0.tar.gz", hash = "sha256:5be62679201c441356d3f2a739895dcc8d4d299f2a6eabcd2163bfb6a898abba"},
+ {file = "pyarrow-6.0.1-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:c80d2436294a07f9cc54852aa1cef034b6f9c97d29235c4bd53bbf52e24f1ebf"},
+ {file = "pyarrow-6.0.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:f150b4f222d0ba397388908725692232345adaa8e58ad543ca00f03c7234ae7b"},
+ {file = "pyarrow-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c3a727642c1283dcb44728f0d0a00f8864b171e31c835f4b8def07e3fa8f5c73"},
+ {file = "pyarrow-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d29605727865177918e806d855fd8404b6242bf1e56ade0a0023cd4fe5f7f841"},
+ {file = "pyarrow-6.0.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b63b54dd0bada05fff76c15b233f9322de0e6947071b7871ec45024e16045aeb"},
+ {file = "pyarrow-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e90e75cb11e61ffeffb374f1db7c4788f1df0cb269596bf86c473155294958d"},
+ {file = "pyarrow-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f4f3db1da51db4cfbafab3066a01b01578884206dced9f505da950d9ed4402d"},
+ {file = "pyarrow-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:2523f87bd36877123fc8c4813f60d298722143ead73e907690a87e8557114693"},
+ {file = "pyarrow-6.0.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:8f7d34efb9d667f9204b40ce91a77613c46691c24cd098e3b6986bd7401b8f06"},
+ {file = "pyarrow-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3c9184335da8faf08c0df95668ce9d778df3795ce4eec959f44908742900e10"},
+ {file = "pyarrow-6.0.1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02baee816456a6e64486e587caaae2bf9f084fa3a891354ff18c3e945a1cb72f"},
+ {file = "pyarrow-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604782b1c744b24a55df80125991a7154fbdef60991eb3d02bfaed06d22f055e"},
+ {file = "pyarrow-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fab8132193ae095c43b1e8d6d7f393451ac198de5aaf011c6b576b1442966fec"},
+ {file = "pyarrow-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:31038366484e538608f43920a5e2957b8862a43aa49438814619b527f50ec127"},
+ {file = "pyarrow-6.0.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:632bea00c2fbe2da5d29ff1698fec312ed3aabfb548f06100144e1907e22093a"},
+ {file = "pyarrow-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc03c875e5d68b0d0143f94c438add3ab3c2411ade2748423a9c24608fea571e"},
+ {file = "pyarrow-6.0.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1cd4de317df01679e538004123d6d7bc325d73bad5c6bbc3d5f8aa2280408869"},
+ {file = "pyarrow-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e77b1f7c6c08ec319b7882c1a7c7304731530923532b3243060e6e64c456cf34"},
+ {file = "pyarrow-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a424fd9a3253d0322d53be7bbb20b5b01511706a61efadcf37f416da325e3d48"},
+ {file = "pyarrow-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c958cf3a4a9eee09e1063c02b89e882d19c61b3a2ce6cbd55191a6f45ed5004b"},
+ {file = "pyarrow-6.0.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:0e0ef24b316c544f4bb56f5c376129097df3739e665feca0eb567f716d45c55a"},
+ {file = "pyarrow-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c13ec3b26b3b069d673c5fa3a0c70c38f0d5c94686ac5dbc9d7e7d24040f812"},
+ {file = "pyarrow-6.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71891049dc58039a9523e1cb0d921be001dacb2b327fa7b62a35b96a3aad9f0d"},
+ {file = "pyarrow-6.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:943141dd8cca6c5722552a0b11a3c2e791cdf85f1768dea8170b0a8a7e824ff9"},
+ {file = "pyarrow-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fd077c06061b8fa8fdf91591a4270e368f63cf73c6ab56924d3b64efa96a873"},
+ {file = "pyarrow-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5308f4bb770b48e07c8cff36cf6a4452862e8ce9492428ad5581d846420b3884"},
+ {file = "pyarrow-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:cde4f711cd9476d4da18128c3a40cb529b6b7d2679aee6e0576212547530fef1"},
+ {file = "pyarrow-6.0.1-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:b8628269bd9289cae0ea668f5900451043252fe3666667f614e140084dd31aac"},
+ {file = "pyarrow-6.0.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:981ccdf4f2696550733e18da882469893d2f33f55f3cbeb6a90f81741cbf67aa"},
+ {file = "pyarrow-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:954326b426eec6e31ff55209f8840b54d788420e96c4005aaa7beed1fe60b42d"},
+ {file = "pyarrow-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6b6483bf6b61fe9a046235e4ad4d9286b707607878d7dbdc2eb85a6ec4090baf"},
+ {file = "pyarrow-6.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7ecad40a1d4e0104cd87757a403f36850261e7a989cf9e4cb3e30420bbbd1092"},
+ {file = "pyarrow-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c752fb41921d0064568a15a87dbb0222cfbe9040d4b2c1b306fe6e0a453530"},
+ {file = "pyarrow-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:725d3fe49dfe392ff14a8ae6a75b230a60e8985f2b621b18cfa912fe02b65f1a"},
+ {file = "pyarrow-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:2403c8af207262ce8e2bc1a9d19313941fd2e424f1cb3c4b749c17efe1fd699a"},
+ {file = "pyarrow-6.0.1.tar.gz", hash = "sha256:423990d56cd8f12283b67367d48e142739b789085185018eb03d05087c3c8d43"},
]
pycparser = [
{file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
@@ -2130,8 +2149,8 @@ pympler = [
{file = "Pympler-0.9.tar.gz", hash = "sha256:f2cbe7df622117af890249f2dea884eb702108a12d729d264b7c5983a6e06e47"},
]
pyparsing = [
- {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
- {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
+ {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"},
+ {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"},
]
pyrsistent = [
{file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"},
@@ -2246,6 +2265,11 @@ regex = [
{file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f"},
{file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0"},
{file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4"},
+ {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9ed0b1e5e0759d6b7f8e2f143894b2a7f3edd313f38cf44e1e15d360e11749b"},
+ {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:473e67837f786404570eae33c3b64a4b9635ae9f00145250851a1292f484c063"},
+ {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2fee3ed82a011184807d2127f1733b4f6b2ff6ec7151d83ef3477f3b96a13d03"},
+ {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d5fd67df77bab0d3f4ea1d7afca9ef15c2ee35dfb348c7b57ffb9782a6e4db6e"},
+ {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5d408a642a5484b9b4d11dea15a489ea0928c7e410c7525cd892f4d04f2f617b"},
{file = "regex-2021.11.10-cp310-cp310-win32.whl", hash = "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a"},
{file = "regex-2021.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12"},
{file = "regex-2021.11.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc"},
@@ -2255,6 +2279,11 @@ regex = [
{file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733"},
{file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23"},
{file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e"},
+ {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:74cbeac0451f27d4f50e6e8a8f3a52ca074b5e2da9f7b505c4201a57a8ed6286"},
+ {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:3598893bde43091ee5ca0a6ad20f08a0435e93a69255eeb5f81b85e81e329264"},
+ {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:50a7ddf3d131dc5633dccdb51417e2d1910d25cbcf842115a3a5893509140a3a"},
+ {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:61600a7ca4bcf78a96a68a27c2ae9389763b5b94b63943d5158f2a377e09d29a"},
+ {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:563d5f9354e15e048465061509403f68424fef37d5add3064038c2511c8f5e00"},
{file = "regex-2021.11.10-cp36-cp36m-win32.whl", hash = "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4"},
{file = "regex-2021.11.10-cp36-cp36m-win_amd64.whl", hash = "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e"},
{file = "regex-2021.11.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e"},
@@ -2264,6 +2293,11 @@ regex = [
{file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a"},
{file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e"},
{file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f"},
+ {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:42b50fa6666b0d50c30a990527127334d6b96dd969011e843e726a64011485da"},
+ {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6e1d2cc79e8dae442b3fa4a26c5794428b98f81389af90623ffcc650ce9f6732"},
+ {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:0416f7399e918c4b0e074a0f66e5191077ee2ca32a0f99d4c187a62beb47aa05"},
+ {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ce298e3d0c65bd03fa65ffcc6db0e2b578e8f626d468db64fdf8457731052942"},
+ {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dc07f021ee80510f3cd3af2cad5b6a3b3a10b057521d9e6aaeb621730d320c5a"},
{file = "regex-2021.11.10-cp37-cp37m-win32.whl", hash = "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec"},
{file = "regex-2021.11.10-cp37-cp37m-win_amd64.whl", hash = "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4"},
{file = "regex-2021.11.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83"},
@@ -2274,6 +2308,11 @@ regex = [
{file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec"},
{file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe"},
{file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94"},
+ {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f5be7805e53dafe94d295399cfbe5227f39995a997f4fd8539bf3cbdc8f47ca8"},
+ {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a955b747d620a50408b7fdf948e04359d6e762ff8a85f5775d907ceced715129"},
+ {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:139a23d1f5d30db2cc6c7fd9c6d6497872a672db22c4ae1910be22d4f4b2068a"},
+ {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ca49e1ab99593438b204e00f3970e7a5f70d045267051dfa6b5f4304fcfa1dbf"},
+ {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:96fc32c16ea6d60d3ca7f63397bff5c75c5a562f7db6dec7d412f7c4d2e78ec0"},
{file = "regex-2021.11.10-cp38-cp38-win32.whl", hash = "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc"},
{file = "regex-2021.11.10-cp38-cp38-win_amd64.whl", hash = "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d"},
{file = "regex-2021.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b"},
@@ -2284,6 +2323,11 @@ regex = [
{file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449"},
{file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b"},
{file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef"},
+ {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cd410a1cbb2d297c67d8521759ab2ee3f1d66206d2e4328502a487589a2cb21b"},
+ {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e6096b0688e6e14af6a1b10eaad86b4ff17935c49aa774eac7c95a57a4e8c296"},
+ {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:529801a0d58809b60b3531ee804d3e3be4b412c94b5d267daa3de7fadef00f49"},
+ {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f594b96fe2e0821d026365f72ac7b4f0b487487fb3d4aaf10dd9d97d88a9737"},
+ {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2409b5c9cef7054dde93a9803156b411b677affc84fca69e908b1cb2c540025d"},
{file = "regex-2021.11.10-cp39-cp39-win32.whl", hash = "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a"},
{file = "regex-2021.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29"},
{file = "regex-2021.11.10.tar.gz", hash = "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6"},
diff --git a/pyproject.toml b/pyproject.toml
index c77b0f9..5e9da2f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,15 +9,15 @@ license = "MIT"
python = "^3.9"
streamlit = "^1.2.0"
plotly = "^5.4.0"
-openpyxl = "^3.0.9"
-XlsxWriter = "^3.0.2"
-phik = "^0.12.0"
[tool.poetry.dev-dependencies]
jupyterlab-code-formatter = "^1.4.10"
pandas-stubs = "^1.2.0"
isort = "^5.10.1"
black = "^21.10b0"
+openpyxl = "^3.0.9"
+XlsxWriter = "^3.0.2"
+phik = "^0.12.0"
[build-system]
requires = ["poetry-core>=1.0.0"]
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..5359d53
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,89 @@
+altair==4.1.0; python_version >= "3.6"
+appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.7" and sys_platform == "darwin"
+argon2-cffi==21.1.0; python_version >= "3.7"
+astor==0.8.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
+attrs==21.2.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7"
+backcall==0.2.0; python_version >= "3.7"
+base58==2.1.1; python_version >= "3.6"
+bleach==4.1.0; python_version >= "3.7"
+blinker==1.4; python_version >= "3.6"
+cachetools==4.2.4; python_version >= "3.6" and python_version < "4.0"
+certifi==2021.10.8; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
+cffi==1.15.0; python_full_version >= "3.6.1" and python_version >= "3.7" and implementation_name == "pypy"
+charset-normalizer==2.0.8; python_full_version >= "3.6.0" and python_version >= "3.6"
+click==7.1.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
+colorama==0.4.4; python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.5.0"
+debugpy==1.5.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7"
+decorator==5.1.0; python_version >= "3.7"
+defusedxml==0.7.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7"
+entrypoints==0.3; python_full_version >= "3.6.1" and python_version >= "3.7"
+gitdb==4.0.9; python_version >= "3.7"
+gitpython==3.1.24; python_version >= "3.7"
+idna==3.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
+ipykernel==6.5.1; python_version >= "3.7"
+ipython-genutils==0.2.0; python_version >= "3.7"
+ipython==7.30.0; python_version >= "3.7"
+ipywidgets==7.6.5; python_version >= "3.7"
+jedi==0.18.1; python_version >= "3.7"
+jinja2==3.0.3; python_version >= "3.7"
+jsonschema==4.2.1; python_version >= "3.7"
+jupyter-client==7.1.0; python_full_version >= "3.6.1" and python_version >= "3.7"
+jupyter-core==4.9.1; python_full_version >= "3.6.1" and python_version >= "3.7"
+jupyterlab-pygments==0.1.2; python_version >= "3.7"
+jupyterlab-widgets==1.0.2; python_version >= "3.7"
+markupsafe==2.0.1; python_version >= "3.6"
+matplotlib-inline==0.1.3; python_version >= "3.7"
+mistune==0.8.4; python_version >= "3.7"
+nbclient==0.5.9; python_full_version >= "3.6.1" and python_version >= "3.7"
+nbconvert==6.3.0; python_version >= "3.7"
+nbformat==5.1.3; python_full_version >= "3.6.1" and python_version >= "3.7"
+nest-asyncio==1.5.1; python_full_version >= "3.6.1" and python_version >= "3.7"
+notebook==6.4.6; python_version >= "3.7"
+numpy==1.21.1
+packaging==21.3; python_version >= "3.7"
+pandas==1.3.4; python_full_version >= "3.7.1" and python_version >= "3.6"
+pandocfilters==1.5.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
+parso==0.8.2; python_version >= "3.7"
+pexpect==4.8.0; sys_platform != "win32" and python_version >= "3.7"
+pickleshare==0.7.5; python_version >= "3.7"
+pillow==8.4.0; python_version >= "3.6"
+plotly==5.4.0; python_version >= "3.6"
+prometheus-client==0.12.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
+prompt-toolkit==3.0.23; python_full_version >= "3.6.2" and python_version >= "3.7"
+protobuf==3.19.1; python_version >= "3.6"
+ptyprocess==0.7.0; sys_platform != "win32" and python_version >= "3.7" and os_name != "nt"
+py==1.11.0; python_full_version >= "3.6.1" and python_version >= "3.7" and implementation_name == "pypy"
+pyarrow==6.0.1; python_version >= "3.6"
+pycparser==2.21; python_full_version >= "3.6.1" and python_version >= "3.7" and implementation_name == "pypy"
+pydeck==0.7.1; python_version >= "3.7"
+pygments==2.10.0; python_version >= "3.7"
+pympler==0.9; python_version >= "3.6"
+pyparsing==3.0.6; python_version >= "3.6"
+pyrsistent==0.18.0; python_version >= "3.7"
+python-dateutil==2.8.2; python_full_version >= "3.7.1" and python_version >= "3.7"
+pytz-deprecation-shim==0.1.0.post0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
+pytz==2021.3; python_full_version >= "3.7.1" and python_version >= "3.6"
+pywin32==302; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_full_version >= "3.6.1" and python_version >= "3.7"
+pywinpty==1.1.6; os_name == "nt" and python_version >= "3.7"
+pyzmq==22.3.0; python_full_version >= "3.6.1" and python_version >= "3.7"
+requests==2.26.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
+send2trash==1.8.0; python_version >= "3.7"
+six==1.16.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7"
+smmap==5.0.0; python_version >= "3.7"
+streamlit==1.2.0; python_version >= "3.6"
+tenacity==8.0.1; python_version >= "3.6"
+terminado==0.12.1; python_version >= "3.7"
+testpath==0.5.0; python_version >= "3.7"
+toml==0.10.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6"
+toolz==0.11.2; python_version >= "3.6"
+tornado==6.1; python_full_version >= "3.6.1" and python_version >= "3.7"
+traitlets==5.1.1; python_full_version >= "3.6.1" and python_version >= "3.7"
+typing-extensions==4.0.0; python_version < "3.10" and python_version >= "3.7"
+tzdata==2021.5; platform_system == "Windows" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6")
+tzlocal==4.1; python_version >= "3.6"
+urllib3==1.26.7; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.6"
+validators==0.18.2; python_version >= "3.6"
+watchdog==2.1.6; platform_system != "Darwin" and python_version >= "3.6"
+wcwidth==0.2.5; python_full_version >= "3.6.2" and python_version >= "3.7"
+webencodings==0.5.1; python_version >= "3.7"
+widgetsnbextension==3.5.2; python_version >= "3.7"
diff --git a/scripts/clean_merged.py b/scripts/clean_merged.py
index 611323f..1c54a3a 100755
--- a/scripts/clean_merged.py
+++ b/scripts/clean_merged.py
@@ -21,6 +21,12 @@ def construct_cs_df():
columns={
"startlanguage": "XXcountry",
"lastpage": "XXlastpage",
+ "CSfinance2[SQ01]": "CSfinance2cs[private_foundations]",
+ "CSfinance2[SQ02]": "CSfinance2cs[donations]",
+ "CSfinance2[SQ03]": "CSfinance2cs[national_public_funds]",
+ "CSfinance2[SQ04]": "CSfinance2cs[corporate_sponsorship]",
+ "CSfinance2[SQ05]": "CSfinance2cs[international_public_funds]",
+ "CSfinance2[SQ06]": "CSfinance2cs[other]",
"CSfoi5[SQ01]": "CSfoi5[not_aware]",
"CSfoi5[SQ02]": "CSfoi5[not_covered]",
"CSfoi5[SQ03]": "CSfoi5[too_expensive]",
@@ -93,6 +99,15 @@ def construct_cs_df():
"CSexpertise3",
"CSexpertise4",
"CSfinance1",
+ "CSfinance2cs[private_foundations]",
+ "CSfinance2cs[donations]",
+ "CSfinance2cs[national_public_funds]",
+ "CSfinance2cs[corporate_sponsorship]",
+ "CSfinance2cs[international_public_funds]",
+ "CSfinance2cs[other]",
+ # "CSfinance2other",
+ "CSfinance3",
+ "CSfinance4",
"CSfoi1",
"CSfoi2",
"CSfoi3",
@@ -184,8 +199,8 @@ def construct_cs_df():
# Make column names compatible
df.columns = df.columns.str[2:]
- # Set surveytype
- df["surveytype"] = "Civil Society Scrutiny"
+ # Set field
+ df["field"] = "CSO Professionals"
return df
@@ -206,6 +221,7 @@ def construct_ms_df():
columns={
"startlanguage": "XXcountry",
"lastpage": "XXlastpage",
+ "MSfinance2": "MSfinance2ms",
"MFfoi2": "MSfoi2",
"MSfoi5[SQ01]": "MSfoi5[not_aware]",
"MSfoi5[SQ02]": "MSfoi5[not_covered]",
@@ -283,6 +299,7 @@ def construct_ms_df():
"MSexpertise3",
"MSexpertise4",
"MSfinance1",
+ "MSfinance2ms",
"MSfoi1",
"MSfoi2",
"MSfoi3",
@@ -374,8 +391,8 @@ def construct_ms_df():
# Make column names compatible
df.columns = df.columns.str[2:]
- # Set surveytype
- df["surveytype"] = "Media Scrutiny"
+ # Set field
+ df["field"] = "Media Professionals"
return df
@@ -388,8 +405,8 @@ def construct_ms_df():
# Helper variables needed when answers are coded differently in the
# respective survey types or languages
-is_civsoc = df.surveytype == "Civil Society Scrutiny"
-is_media = df.surveytype == "Media Scrutiny"
+is_civsoc = df.field == "CSO Professionals"
+is_media = df.field == "Media Professionals"
is_de = df.country == "Germany"
is_uk = df.country == "United Kingdom"
is_fr = df.country == "France"
@@ -478,6 +495,48 @@ def construct_ms_df():
}
)
+df["finance2ms"] = df["finance2ms"].replace(
+ {
+ "AO01": "Yes",
+ "AO02": "No",
+ "AO03": "I don't know",
+ "AO04": "I prefer not to say",
+ }
+)
+
+finance2cs_options = [
+ "private_foundations",
+ "donations",
+ "national_public_funds",
+ "corporate_sponsorship",
+ "international_public_funds",
+ "other",
+]
+for label in finance2cs_options:
+ df[f"finance2cs[{label}]"] = df[f"finance2cs[{label}]"].replace(
+ {
+ "AO01": "Very important",
+ "AO02": "Important",
+ "AO03": "Somewhat important",
+ "AO04": "Slightly important",
+ "AO07": "Not important at all",
+ "AO09": "I don't know",
+ "AO11": "I prefer not to say",
+ }
+ )
+
+df["finance4"] = df["finance4"].replace(
+ {
+ "AO01": "Clearly beneficial for fundraising",
+ "AO02": "Rather beneficial for fundraising",
+ "AO03": "No effect on fundraising",
+ "AO04": "Rather constraining for fundraising",
+ "AO05": "Clearly constraining for fundraising",
+ "AO06": "I don't know",
+ "AO07": "I prefer not to say",
+ }
+)
+
df["foi1"] = df["foi1"].replace(
{
"AO01": "Yes",
@@ -700,21 +759,21 @@ def construct_ms_df():
df["attitude1"] = df["attitude1"].replace(
{
- "AO01": "Intelligence agencies are incompatible with democratic
values and should be abolished",
- "AO02": "Intelligence agencies contradict democratic principles,
and their powers should be kept at a bare minimum",
- "AO03": "Intelligence agencies are necessary and legitimate institutions
of democratic states, even though they may sometimes overstep
their legal mandates",
- "AO04": "Intelligence agencies are a vital component of national
security and should be shielded from excessive bureaucratic
restrictions",
- "AO05": "I prefer not to say",
+ "AO01": "A1: Intelligence agencies are incompatible with
democratic values and should be abolished",
+ "AO02": "A2: Intelligence agencies contradict democratic
principles, and their powers should be kept at a
bare minimum",
+ "AO03": "A3: Intelligence agencies are necessary and
legitimate institutions of democratic states,
even though they may sometimes overstep their
legal mandates",
+ "AO04": "A4: Intelligence agencies are a vital component
of national security and should be shielded from
excessive bureaucratic restrictions",
+ "AO05": "A5: I prefer not to say",
}
)
df["attitude2"] = df["attitude2"].replace(
{
- "AO01": "Intelligence oversight generally succeeds in uncovering
past misconduct and preventing future misconduct",
- "AO02": "Intelligence oversight is mostly effective, however its
institutional design needs reform for oversight practitioners
to reliably uncover past misconduct and prevent future
misconduct",
- "AO03": "Intelligence oversight lacks efficacy, hence a fundamental
reorganization of oversight capacity is needed for oversight
practitioners to reliably uncover past misconduct and
prevent future misconduct",
- "AO04": "Effective intelligence oversight is a hopeless endeavour
and even a systematic reorganization is unlikely to ensure
misconduct is uncovered and prevented.",
- "AO05": "I prefer not to say",
+ "AO01": "A1: Intelligence oversight generally succeeds
in uncovering past misconduct and preventing
future misconduct",
+ "AO02": "A2: Intelligence oversight is mostly effective,
however its institutional design needs reform
for oversight practitioners to reliably uncover
past misconduct and prevent future misconduct",
+ "AO03": "A3: Intelligence oversight lacks efficacy,
hence a fundamental reorganization of oversight
capacity is needed for oversight practitioners
to reliably uncover past misconduct and prevent
future misconduct",
+ "AO04": "A4: Effective intelligence oversight is a
hopeless endeavour and even a systematic
reorganization is unlikely to ensure misconduct
is uncovered and prevented.",
+ "AO05": "A5: I prefer not to say",
}
)