From 621806208b80fb38d807cc3f23aee5f3851786c8 Mon Sep 17 00:00:00 2001 From: linozen Date: Tue, 30 Nov 2021 18:46:05 +0100 Subject: [PATCH] a whole lot of refactoring and a new workflow --- .dockerignore | 15 + .github/workflows/deploy.yml | 70 ++-- Dockerfile | 32 +- explorer/merged.py => explorer.py | 525 ++++++++++++++++++++++-------- poetry.lock | 254 +++++++++------ pyproject.toml | 6 +- requirements.txt | 89 +++++ scripts/clean_merged.py | 91 +++++- 8 files changed, 759 insertions(+), 323 deletions(-) create mode 100644 .dockerignore rename explorer/merged.py => explorer.py (76%) create mode 100644 requirements.txt 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", } )