diff --git a/.env.example b/.env.example index 8a38d5a8..4d324f9e 100644 --- a/.env.example +++ b/.env.example @@ -2,4 +2,9 @@ ACLED_EMAIL= ACLED_KEY= MEDIACLOUD_API_TOKEN= ZENROWS_API_KEY= -OPENAI_API_KEY= +AZURE_API_BASE= +AZURE_API_VERSION= +AZURE_API_KEY= +DATAFORSEO_EMAIL= +DATAFORSEO_PASSWORD= +PORT= diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0f074ead..1a7486a7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -59,3 +59,8 @@ jobs: ACLED_EMAIL: ${{ secrets.ACLED_EMAIL }} ACLED_KEY: ${{ secrets.ACLED_KEY }} ZENROWS_API_KEY: ${{ secrets.ZENROWS_API_KEY }} + AZURE_API_BASE: ${{ secrets.AZURE_API_BASE }} + AZURE_API_VERSION: ${{ secrets.AZURE_API_VERSION }} + AZURE_API_KEY: ${{ secrets.AZURE_API_KEY }} + DATAFORSEO_EMAIL: ${{ secrets.DATAFORSEO_EMAIL }} + DATAFORSEO_PASSWORD: ${{ secrets.DATAFORSEO_PASSWORD }} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..4db8a592 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: FastAPI", + "type": "debugpy", + "request": "launch", + "module": "uvicorn", + "args": [ + "media_impact_monitor.api:app", + "--host=0.0.0.0", + "--port=8000", + ], + "jinja": true + } + ] +} \ No newline at end of file diff --git a/backend-python/README.md b/backend-python/README.md index 7ee32cc1..947d95e1 100644 --- a/backend-python/README.md +++ b/backend-python/README.md @@ -10,11 +10,26 @@ - `poetry run uvicorn media_impact_monitor.api:app --host 0.0.0.0 --port 8000` to serve the API - `poetry run py-spy record -o profile.svg -- python xyz.py` to do profiling -## Setting up a server to serve the Docker container +## Deployment -- Set up a Ubuntu 22.04 server. -- Create a `.env` file based on `.env.example` and put it on the server. -- Run `setup_server.sh` on the server. +Continuous deployment is currently set up with railway.app. + +Important: Configure a `PORT` environment variable there, otherwise the app will not be accessible and will be `Shutting down` for no apparent reason. + +## 3rd party services + +These are configured via a `.env` file, see [`.env.example`](../.env.example). + +### Azure OpenAI + +We have defined the following endpoints on Azure OpenAI: + +- `gpt-35-turbo`: `gpt-3.5-turbo-1106` (16k tokens context) +- `gpt-4`: `gpt-4-turbo-2024-04-09` (128k tokens context) + +Azure OpenAI uses content filters, also for the input texts, that cannot be switched off, but their thresholds can be set to high. + +Similar models are also available via OpenAI directly. ## Conventions diff --git a/backend-python/media_impact_monitor/api.py b/backend-python/media_impact_monitor/api.py index a2b39522..716f8318 100644 --- a/backend-python/media_impact_monitor/api.py +++ b/backend-python/media_impact_monitor/api.py @@ -107,7 +107,7 @@ def _get_fulltexts(q: FulltextSearch) -> Response[FulltextSearch, list[Event]]: @app.post("/impact") -def _get_impact(q: ImpactSearch) -> Response[ImpactSearch, Impact]: +def _get_impact(q: ImpactSearch): # -> Response[ImpactSearch, Impact]: """Compute the impact of an event on a media trend.""" impact = get_impact(q) return Response(query=q, data=impact) diff --git a/backend-python/media_impact_monitor/data_loaders/news_online/mediacloud_.py b/backend-python/media_impact_monitor/data_loaders/news_online/mediacloud_.py index b851d228..2a1502cf 100644 --- a/backend-python/media_impact_monitor/data_loaders/news_online/mediacloud_.py +++ b/backend-python/media_impact_monitor/data_loaders/news_online/mediacloud_.py @@ -1,16 +1,13 @@ -import os from datetime import date from typing import Literal import mediacloud.api import pandas as pd -from dotenv import load_dotenv +from mcmetadata import extract -from media_impact_monitor.util.cache import cache +from media_impact_monitor.util.cache import cache, get_proxied from media_impact_monitor.util.env import MEDIACLOUD_API_TOKEN - -load_dotenv() - +from media_impact_monitor.util.parallel import parallel_tqdm search = mediacloud.api.SearchApi(MEDIACLOUD_API_TOKEN) directory = mediacloud.api.DirectoryApi(MEDIACLOUD_API_TOKEN) @@ -18,28 +15,19 @@ Platform = Literal["onlinenews-mediacloud", "onlinenews-waybackmachine"] +end_date = date.today() + @cache def get_mediacloud_counts( query: str, - start_date: date = date(2023, 1, 1), - end_date: date = date.today(), + start_date: date = date(2022, 1, 1), + end_date: date = end_date, countries: list | None = None, platform: Platform = "onlinenews-mediacloud", ) -> pd.Series: - assert start_date.year >= 2023, "MediaCloud currently only goes back to 2023" - collection_ids: list[int] = [] - if countries: - collection_ids = [] - for country in countries: - # get national newspapers (regional newspapers are also available) - results = directory.collection_list(name=f"{country} - national")["results"] - # ignore research collections - results = [r for r in results if "(Research Only)" not in r["name"]] - assert ( - len(results) == 1 - ), f"Expected 1 result, got {len(results)} for {country}" - collection_ids.append(results[0]["id"]) + assert start_date.year >= 2022, "MediaCloud currently only goes back to 2022" + collection_ids = resolve_countries(countries) data = search.story_count_over_time( query=query, start_date=start_date, @@ -52,3 +40,56 @@ def get_mediacloud_counts( df["date"] = pd.to_datetime(df["date"]).dt.date df = df.set_index("date") return df["count"] + + +def get_mediacloud_fulltexts( + query: str, + start_date: date = date(2022, 1, 1), + end_date: date = end_date, + countries: list | None = None, + platform: Platform = "onlinenews-mediacloud", +) -> pd.DataFrame: + assert start_date.year >= 2022, "MediaCloud currently only goes back to 2022" + collection_ids = resolve_countries(countries) + data = search.story_list( + query=query, + start_date=start_date, + end_date=end_date, + collection_ids=collection_ids, + platform=platform, + ) + pagination_token = data[1] + if pagination_token: + raise NotImplementedError("Pagination not implemented") + df = pd.DataFrame(data[0]) + df["publish_date"] = pd.to_datetime(df["publish_date"]) + df["text"] = parallel_tqdm( + retrieve_text, df["url"], n_jobs=4, desc="Retrieving fulltexts" + ) + df = df.dropna(subset=["text"]) + return df + + +def retrieve_text(url: str) -> str | None: + try: + html = get_proxied(url, timeout=15).text + except ValueError as e: + if "RESP002" in str(e): # zenrows error code for http 404 + return None + raise e + data = extract(url=url, html_text=html) + # this also contains additional metadata (title, language, extraction method, ...) that could be used + return data["text_content"] + + +def resolve_countries(countries: list | None) -> list | None: + collection_ids: list[int] = [] + collection_ids = [] + for country in countries or []: + # get national newspapers (regional newspapers are also available) + results = directory.collection_list(name=f"{country} - national")["results"] + # ignore research collections + results = [r for r in results if "(Research Only)" not in r["name"]] + assert len(results) == 1, f"Expected 1 result, got {len(results)} for {country}" + collection_ids.append(results[0]["id"]) + return collection_ids diff --git a/backend-python/media_impact_monitor/data_loaders/news_print/genios.py b/backend-python/media_impact_monitor/data_loaders/news_print/genios.py index 967dd259..4bb07188 100644 --- a/backend-python/media_impact_monitor/data_loaders/news_print/genios.py +++ b/backend-python/media_impact_monitor/data_loaders/news_print/genios.py @@ -4,12 +4,14 @@ from media_impact_monitor.util.cache import cache, get +end_date = date.today() + @cache def get_genios_counts( query: str, start_date: date = date(2010, 1, 1), - end_date: date = date.today(), + end_date: date = end_date, ) -> pd.Series: response = get( "https://www.genios.de/api/searchResult/Alle/Presse", @@ -32,5 +34,5 @@ def get_genios_counts( df["date"] = pd.to_datetime(df["date"]).dt.date df = df.set_index("date") # there is a bug that sets the count at day -1 to 0 - df = df[df.index >= pd.Timestamp(start_date)] + df = df[df.index >= start_date] return df["count"] diff --git a/backend-python/media_impact_monitor/data_loaders/news_print/genios_test.py b/backend-python/media_impact_monitor/data_loaders/news_print/genios_test.py index 03c0fd6a..e064bf18 100644 --- a/backend-python/media_impact_monitor/data_loaders/news_print/genios_test.py +++ b/backend-python/media_impact_monitor/data_loaders/news_print/genios_test.py @@ -1,15 +1,19 @@ +from datetime import date + import pandas as pd import pytest + from media_impact_monitor.data_loaders.news_print.genios import get_genios_counts -@pytest.mark.skip(reason="The Genios API is currently down.") +# @pytest.mark.skip(reason="The Genios API is currently down.") def test_get_counts_genios(): df = get_genios_counts( "Fridays for Future", - pd.Timestamp("2023-06-01"), - pd.Timestamp("2023-12-01"), + date(2023, 6, 1), + date(2023, 12, 1), ) + df.index = pd.to_datetime(df.index) assert not df.empty, "The dataframe returned is unexpectedly empty." assert ( df.index >= "2023-06-01" @@ -17,19 +21,19 @@ def test_get_counts_genios(): assert ( df.index <= "2023-12-01" ).all(), "The returned dataframe contains dates after the end date." - assert (df["count"] >= 0).all(), "The returned dataframe contains negative counts." - print(df["count"].diff().abs()) + assert (df >= 0).all(), "The returned dataframe contains negative counts." + print(df.diff().abs()) assert ( - df["count"].diff().abs().fillna(0) <= 1000 + df.diff().abs().fillna(0) <= 1000 ).all(), "The returned dataframe contains a count change of more than 1000." # assume more counts in September (due to global climate strike) than in August assert ( - df.resample("ME").sum()["count"]["2023-09"].item() - > df.resample("ME").sum()["count"]["2023-08"].item() + df.resample("ME").sum()["2023-09"].item() + > df.resample("ME").sum()["2023-08"].item() ), "The count in September is not higher than in August." assert ( - df.resample("ME").sum()["count"] < 10_000 + df.resample("ME").sum() < 10_000 ).all(), "The count per month is higher than 10,000 for some months." assert ( - df.resample("ME").sum()["count"] > 10 + df.resample("ME").sum() > 10 ).all(), "The count per month is lower than 30 for some months." diff --git a/backend-python/media_impact_monitor/data_loaders/web/google_trends.py b/backend-python/media_impact_monitor/data_loaders/web/google_trends.py index 8e55e748..fde8a0e1 100644 --- a/backend-python/media_impact_monitor/data_loaders/web/google_trends.py +++ b/backend-python/media_impact_monitor/data_loaders/web/google_trends.py @@ -13,6 +13,7 @@ import pandas as pd from media_impact_monitor.util.cache import cache, post +from media_impact_monitor.util.env import DATAFORSEO_EMAIL, DATAFORSEO_PASSWORD end_date = date.today() @@ -30,7 +31,7 @@ def get_google_trends_counts(query: str, end_date: date = end_date) -> pd.Series "language_code": "de", } ] - credentials = "davidpomerenke@mailbox.org:99e67272d04117b1" + credentials = f"{DATAFORSEO_EMAIL}:{DATAFORSEO_PASSWORD}" credentials_encoded = base64.b64encode(credentials.encode()).decode() headers = { "Authorization": f"Basic {credentials_encoded}", @@ -40,9 +41,8 @@ def get_google_trends_counts(query: str, end_date: date = end_date) -> pd.Series data = response.json()["tasks"][0]["result"][0]["items"][0]["data"] df = pd.DataFrame(data) df["value"] = df["values"].str[0] - # df = df[~df["missing_data"]] + # df = df[~df["missing_data"]] # this ignores data from the current day/week/month, which is not yet complete df = df.rename(columns={"date_from": "date", "value": "count"}) df["date"] = pd.to_datetime(df["date"]).dt.date df = df.set_index("date")["count"] - print(df) return df diff --git a/backend-python/media_impact_monitor/events.py b/backend-python/media_impact_monitor/events.py index 8108efc6..17876b90 100644 --- a/backend-python/media_impact_monitor/events.py +++ b/backend-python/media_impact_monitor/events.py @@ -11,8 +11,10 @@ climate_orgs_aliases, ) from media_impact_monitor.types_ import EventSearch +from media_impact_monitor.util.cache import cache +@cache def get_events(q: EventSearch) -> pd.DataFrame: assert q.source == "acled", "Only ACLED is supported." df = get_acled_events(countries=["Germany"]) diff --git a/backend-python/media_impact_monitor/impact.py b/backend-python/media_impact_monitor/impact.py index 8c5e63d8..49e43cd1 100644 --- a/backend-python/media_impact_monitor/impact.py +++ b/backend-python/media_impact_monitor/impact.py @@ -2,35 +2,66 @@ from media_impact_monitor.events import get_events_by_id from media_impact_monitor.impact_estimators.interrupted_time_series import ( - estimate_impacts, estimate_mean_impact, ) from media_impact_monitor.trend import get_trend -from media_impact_monitor.types_ import Impact, ImpactSearch, TrendSearch +from media_impact_monitor.types_ import Impact, ImpactSearch, Method, TrendSearch from media_impact_monitor.util.cache import cache -@cache +# @cache def get_impact(q: ImpactSearch) -> Impact: events = get_events_by_id(q.cause) - trend = get_trend(TrendSearch(**dict(q.effect))) - hidden_days_before_protest = 4 + trends = get_trend(TrendSearch(**dict(q.effect))) + applicabilities = [] + limitations = [] + dfs = dict() + for topic in trends.columns: + trend = trends[topic] + trend.name = "count" + appl, warning, impact = get_impact_for_single_trend( + events=events, + trend=trend, + method=q.method, + aggregation=q.effect.aggregation, + ) + dfs[topic] = impact.reset_index().to_dict(orient="records") + applicabilities.append(appl) + limitations.append(warning) + assert len(set(applicabilities)) == 1, "All topics should have same applicability." + assert len(set(limitations)) == 1, "All topics should have same limitations." + impact = dict( + method_applicability=applicabilities[0], + method_applicability_reason=limitations[0], + time_series=dfs, + ) + return impact + + +def get_impact_for_single_trend( + events: pd.DataFrame, + trend: pd.DataFrame, + method: Method, + aggregation="daily", +) -> tuple[str, str, pd.DataFrame]: + hidden_days_before_protest = 7 horizon = 28 - match q.method: + match method: case "interrupted_time_series": - mean_impact = estimate_mean_impact( + mean_impact, warnings = estimate_mean_impact( events=events, article_counts=trend, horizon=horizon, hidden_days_before_protest=hidden_days_before_protest, + aggregation=aggregation, ) case "synthetic_control": raise NotImplementedError("Synthetic control is not yet implemented.") case _: - raise ValueError(f"Unsupported method: {q.method}") - return Impact( - method_applicability="maybe", - method_applicability_reason="We're not checking this yet 🤡", - time_series=mean_impact.to_dict(orient="index"), - ) + raise ValueError(f"Unsupported method: {method}") + warning = "We are not yet systematically checking the applicability of the impact estimation method.\n\n" + if warnings: + warning += "However, we have determined the following limitations:\n\n" + warning += "\n".join([f"- {w}" for w in warnings]) + return "maybe", warning, mean_impact # TODO: divide impact by number of events on that day (by the same org) diff --git a/backend-python/media_impact_monitor/impact_estimators/interrupted_time_series.py b/backend-python/media_impact_monitor/impact_estimators/interrupted_time_series.py index bc823b83..1ad72b18 100644 --- a/backend-python/media_impact_monitor/impact_estimators/interrupted_time_series.py +++ b/backend-python/media_impact_monitor/impact_estimators/interrupted_time_series.py @@ -1,5 +1,6 @@ import warnings from datetime import date, timedelta +from typing import Literal import pandas as pd @@ -12,23 +13,34 @@ from statsforecast import StatsForecast from statsforecast.models import ARIMA +Aggregation = Literal["daily", "weekly"] -def predict_with_arima(train: pd.DataFrame, horizon: int): +freq = { # map aggregation to frequency + "daily": "D", + "weekly": "W", +} + + +def predict_with_arima(train: pd.DataFrame, horizon: int, aggregation: Aggregation): train = ( # convert to format for statsforecast train.copy() .reset_index() .rename(columns={"date": "ds", "count": "y"}) .assign(unique_id=0) ) - fcst = StatsForecast( - models=[ - ARIMA( + match aggregation: + case "daily": + model = ARIMA( order=(1, 1, 1), season_length=7, seasonal_order=(1, 1, 1), - ), - ], - freq="D", + ) + case "weekly": + model = ARIMA(order=(1, 1, 1)) + horizon = horizon // 7 + fcst = StatsForecast( + models=[model], + freq=freq[aggregation], n_jobs=4, ) fcst.fit(train) @@ -48,6 +60,7 @@ def estimate_impact( ds: pd.Series, horizon: int, hidden_days_before_protest: int, + aggregation: Aggregation, ) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: """ Calculate the impact of a protest event on the media coverage. @@ -81,7 +94,7 @@ def estimate_impact( ] # predict and calculate impact - counterfactual = predict_with_arima(train, _horizon)["count"] + counterfactual = predict_with_arima(train, _horizon, aggregation)["count"] impact = actual - counterfactual return actual, counterfactual, impact @@ -91,34 +104,59 @@ def estimate_impacts( article_counts: pd.Series, horizon: int, hidden_days_before_protest: int, -) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: + aggregation: Aggregation, +) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, list[str]]: + min_training_days = 90 + _events = events[ + events["date"] >= article_counts.index[0] + timedelta(days=min_training_days) + ] + def _estimate_impact(event_): i, event = event_ return estimate_impact( - event["date"], article_counts, horizon, hidden_days_before_protest + event["date"], + article_counts, + horizon, + hidden_days_before_protest, + aggregation, ) estimates = parallel_tqdm( - _estimate_impact, events.iterrows(), total=events.shape[0], n_jobs=1 + _estimate_impact, _events.iterrows(), total=_events.shape[0], n_jobs=1 ) actuals, counterfactuals, impacts = zip(*estimates) - return actuals, counterfactuals, impacts + if len(events) != len(_events): + warnings = [ + f"Only {len(_events)} out of {len(events)} events were used for estimating the impact, because for the other {len(events) - len(_events)} events there is less than {min_training_days} days of data available, since the media time series starts on {article_counts.index[0].isoformat()}." + ] + else: + warnings = [] + return actuals, counterfactuals, impacts, warnings +@cache def estimate_mean_impact( events: pd.DataFrame, article_counts: pd.DataFrame, horizon: int, hidden_days_before_protest: int, + aggregation: Aggregation, cumulative: bool = True, -) -> pd.DataFrame: +) -> tuple[pd.DataFrame, list[str]]: # output: dataframe with columns mean, ci_upper, ci_lower # and index from -hidden_days_before_protest to horizon - actuals, counterfactuals, impacts = estimate_impacts( - events, article_counts, horizon, hidden_days_before_protest + actuals, counterfactuals, impacts, warnings = estimate_impacts( + events, article_counts, horizon, hidden_days_before_protest, aggregation ) impacts_df = pd.concat([df.reset_index(drop=True) for df in impacts], axis=1) - impacts_df.index = impacts_df.index - hidden_days_before_protest + match aggregation: + case "daily": + impacts_df.index = range(-hidden_days_before_protest, horizon) + case "weekly": + assert hidden_days_before_protest % 7 == 0 + + impacts_df.index = range(-hidden_days_before_protest, horizon, 7) + impacts_df.index.name = "date" if cumulative: impacts_df = impacts_df.cumsum() average = impacts_df.mean(axis=1, skipna=True) @@ -128,4 +166,6 @@ def estimate_mean_impact( ci_upper = impacts_df.apply( lambda x: confidence_interval_ttest(x.dropna(), 0.95)[1], axis=1 ) - return pd.DataFrame({"mean": average, "ci_lower": ci_lower, "ci_upper": ci_upper}) + return pd.DataFrame( + {"mean": average, "ci_lower": ci_lower, "ci_upper": ci_upper} + ), warnings diff --git a/backend-python/media_impact_monitor/impact_estimators/interrupted_time_series_test.py b/backend-python/media_impact_monitor/impact_estimators/interrupted_time_series_test.py index c4897bf4..691b3f6f 100644 --- a/backend-python/media_impact_monitor/impact_estimators/interrupted_time_series_test.py +++ b/backend-python/media_impact_monitor/impact_estimators/interrupted_time_series_test.py @@ -1,9 +1,6 @@ from datetime import date, timedelta -import matplotlib.pyplot as plt -import numpy as np import pandas as pd -from tqdm.auto import tqdm from media_impact_monitor.data_loaders.news_online.mediacloud_ import ( get_mediacloud_counts, @@ -22,7 +19,11 @@ def test_estimate_impact(): '"Letzte Generation"', date(2023, 1, 1), date(2024, 3, 31) ) actual, counterfactual, impact = estimate_impact( - date(2023, 7, 1), article_counts, horizon=14, hidden_days_before_protest=2 + date(2023, 7, 1), + article_counts, + horizon=14, + hidden_days_before_protest=2, + aggregation="daily", ) assert isinstance(actual, pd.Series) assert isinstance(counterfactual, pd.Series) @@ -49,8 +50,12 @@ def test_estimate_impacts(): article_counts = get_mediacloud_counts( '"Letzte Generation"', date(2023, 1, 1), date(2024, 3, 31) ) - actuals, counterfactuals, impacts = estimate_impacts( - events, article_counts, horizon=7, hidden_days_before_protest=4 + actuals, counterfactuals, impacts, warnings = estimate_impacts( + events, + article_counts, + horizon=7, + hidden_days_before_protest=4, + aggregation="daily", ) assert len(actuals) == len(events) assert len(counterfactuals) == len(events) @@ -72,8 +77,12 @@ def test_mean_impact_estimates(): article_counts = get_mediacloud_counts( '"Letzte Generation"', date(2023, 1, 1), date(2024, 3, 31) ) - impacts_df = estimate_mean_impact( - events, article_counts, horizon=7, hidden_days_before_protest=4 + impacts_df, warnings = estimate_mean_impact( + events, + article_counts, + horizon=7, + hidden_days_before_protest=4, + aggregation="daily", ) assert isinstance(impacts_df, pd.DataFrame) assert impacts_df.index.is_monotonic_increasing diff --git a/backend-python/media_impact_monitor/sentiment.py b/backend-python/media_impact_monitor/sentiment.py new file mode 100644 index 00000000..b835cedd --- /dev/null +++ b/backend-python/media_impact_monitor/sentiment.py @@ -0,0 +1,51 @@ +import json + +from litellm import BadRequestError + +from media_impact_monitor.util.llm import completion + +system_prompt = "You're a sentiment analysis tool. For a given user input, always return the sentiment of the input. Return -1 for negative, 0 for neutral, and 1 for positive. Before you make your decision, reason about the decision." + +tools = [ + { + "type": "function", + "function": { + "name": "score_sentiment", + "description": "", + "parameters": { + "type": "object", + "properties": { + "reasoning": { + "type": "string", + "description": "The reasoning for the sentiment", + }, + "sentiment": { + "type": "number", + "description": "The sentiment: -1 for negative, 0 for neutral, 1 for positive", + }, + }, + "required": ["reasoning", "sentiment"], + }, + }, + } +] + + +def sentiment(text: str) -> float: + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": text}, + ] + try: + response = completion( + messages=messages, + tools=tools, + tool_choice={"type": "function", "function": {"name": "score_sentiment"}}, + temperature=0.0, + ) + except BadRequestError as e: + print(e) + print(text) + print(response) + return + return json.loads(response.choices[0].message.tool_calls[0].function.arguments) diff --git a/backend-python/media_impact_monitor/trend.py b/backend-python/media_impact_monitor/trend.py index 0bcf8c17..bb70f085 100644 --- a/backend-python/media_impact_monitor/trend.py +++ b/backend-python/media_impact_monitor/trend.py @@ -1,111 +1,15 @@ import pandas as pd -import yaml -from media_impact_monitor.data_loaders.news_online.mediacloud_ import ( - get_mediacloud_counts, -) -from media_impact_monitor.data_loaders.news_print.genios import get_genios_counts -from media_impact_monitor.data_loaders.web.google_trends import get_google_trends_counts +from media_impact_monitor.trends.keyword_trend import get_keyword_trend +from media_impact_monitor.trends.sentiment_trend import get_sentiment_trend from media_impact_monitor.types_ import TrendSearch -from media_impact_monitor.util.cache import cache -from media_impact_monitor.util.date import verify_dates -from media_impact_monitor.util.paths import src def get_trend(q: TrendSearch) -> pd.DataFrame: - assert q.trend_type == "keywords", "Only keywords are supported." - assert q.topic == "climate_change", "Only climate_change is supported." - dss = {} - for topic, query in topic_queries(q.media_source).items(): - match q.media_source: - case "news_online": - ds = get_mediacloud_counts(query=query) - case "news_print": - ds = get_genios_counts(query=query) - case "web_google": - ds = get_google_trends_counts(query=query) - case _: - raise ValueError(f"Unsupported media source: {q.media_source}") - ds.index = pd.to_datetime(ds.index) - ds = ds.resample("W").sum() - ds.index = ds.index.date - ds.index.name = "date" - dss[topic] = ds - df = pd.DataFrame(dss) - return df - - -def topic_queries(media_source: str) -> dict[str, str]: - with open(src / "media_impact_monitor/trend_keywords.yaml") as f: - keywords = yaml.load(f, Loader=yaml.FullLoader) - all_incl_activism = build_query( - media_source=media_source, - positive=keywords["science"] + keywords["policy"] + keywords["urgency"], - ) - all_excl_activism = build_query( - media_source=media_source, - positive=keywords["science"] + keywords["policy"] + keywords["urgency"], - negative=keywords["activism"], - ) - # all_only_activism = f"({all_incl_activism}) AND ({keywords['activism']})" - keywords = { - "science": build_query(media_source=media_source, positive=keywords["science"]), - "policy": build_query(media_source=media_source, positive=keywords["policy"]), - "urgency": build_query(media_source=media_source, positive=keywords["urgency"]), - # "all_incl_activism": all_incl_activism, - # "all_excl_activism": all_excl_activism, - } - return keywords - - -def build_query( - media_source: str, - positive: list[str] | None = None, - negative: list[str] | None = None, -) -> str: - """ - Build a boolean query, which works differently for different data sources. - This does not support general boolean queries, but only like: - - A or B or ... or G - - not (A or B or ... or G) - - (A or B or ... or G) and not (Q or V or ... or Z) - """ - assert media_source in ["news_online", "news_print", "web_google"] - assert positive or negative - match media_source: - case "news_online": - if positive: - q_positive = [f'"{a}"' if len(a.split()) > 1 else a for a in positive] - q_positive = " OR ".join(q_positive) - if negative: - q_negative = [f'"{a}"' if len(a.split()) > 1 else a for a in negative] - q_negative = " OR ".join(q_negative) - if positive and negative: - query = f"({q_positive}) AND NOT ({q_negative})" - elif positive: - query = q_positive - elif negative: - query = f"NOT ({q_negative})" - case "news_print": - raise NotImplementedError - case "web_google": - # see https://newsinitiative.withgoogle.com/resources/trainings/advanced-google-trends/ - # and https://support.google.com/trends/answer/4359582?hl=en - q_positive = ( - [f'+"{a}"' if len(a.split()) > 1 else f"+{a}" for a in positive] - if positive - else [] - ) - q_negative = ( - [f'-"{a}"' if len(a.split()) > 1 else f"-{a}" for a in negative] - if negative - else [] - ) - if positive and negative: - query = " ".join(q_positive[:4] + q_negative[:4]) - elif positive: - query = " ".join(q_positive[:4]) - elif negative: - query = " ".join(q_negative[:4]) - query = query.replace("*", "") - return query + match q.trend_type: + case "keywords": + return get_keyword_trend(q) + case "sentiment": + return get_sentiment_trend(q) + case _: + raise ValueError(f"Unsupported trend type: {q.trend_type}") diff --git a/backend-python/media_impact_monitor/trends/keyword_trend.py b/backend-python/media_impact_monitor/trends/keyword_trend.py new file mode 100644 index 00000000..ebc61a23 --- /dev/null +++ b/backend-python/media_impact_monitor/trends/keyword_trend.py @@ -0,0 +1,112 @@ +import pandas as pd +import yaml + +from media_impact_monitor.data_loaders.news_online.mediacloud_ import ( + get_mediacloud_counts, +) +from media_impact_monitor.data_loaders.news_print.genios import get_genios_counts +from media_impact_monitor.data_loaders.web.google_trends import get_google_trends_counts +from media_impact_monitor.types_ import TrendSearch +from media_impact_monitor.util.cache import cache +from media_impact_monitor.util.paths import src + + +def get_keyword_trend(q: TrendSearch): + assert q.trend_type == "keywords" + assert q.topic == "climate_change", "Only climate_change is supported." + dss = {} + for topic, query in topic_queries(q.media_source).items(): + match q.media_source: + case "news_online": + ds = get_mediacloud_counts(query=query, countries=["Germany"]) + case "news_print": + ds = get_genios_counts(query=query) + case "web_google": + ds = get_google_trends_counts(query=query) + case _: + raise ValueError(f"Unsupported media source: {q.media_source}") + ds.index = pd.to_datetime(ds.index) + if q.aggregation == "weekly": + ds = ds.resample("W").sum() + elif q.aggregation == "monthly": + ds = ds.resample("M").sum() + ds.index = ds.index.date + ds.index.name = "date" + dss[topic] = ds + df = pd.DataFrame(dss) + return df + + +def topic_queries(media_source: str) -> dict[str, str]: + with open(src / "media_impact_monitor/trend_keywords.yaml") as f: + keywords = yaml.load(f, Loader=yaml.FullLoader) + all_incl_activism = build_query( + media_source=media_source, + positive=keywords["science"] + keywords["policy"] + keywords["urgency"], + ) + all_excl_activism = build_query( + media_source=media_source, + positive=keywords["science"] + keywords["policy"] + keywords["urgency"], + negative=keywords["activism"], + ) + # all_only_activism = f"({all_incl_activism}) AND ({keywords['activism']})" + keywords = { + "science": build_query(media_source=media_source, positive=keywords["science"]), + "policy": build_query(media_source=media_source, positive=keywords["policy"]), + "urgency": build_query(media_source=media_source, positive=keywords["urgency"]), + # "all_incl_activism": all_incl_activism, + # "all_excl_activism": all_excl_activism, + } + return keywords + + +def build_query( + media_source: str, + positive: list[str] | None = None, + negative: list[str] | None = None, +) -> str: + """ + Build a boolean query, which works differently for different data sources. + This does not support general boolean queries, but only like: + - A or B or ... or G + - not (A or B or ... or G) + - (A or B or ... or G) and not (Q or V or ... or Z) + """ + assert media_source in ["news_online", "news_print", "web_google"] + assert positive or negative + match media_source: + case "news_online" | "news_print": + # for print news see: https://www.gbi-genios.de/de/hilfe/genios/verknuepfung-von-suchworten + if positive: + q_positive = [f'"{a}"' if len(a.split()) > 1 else a for a in positive] + q_positive = " OR ".join(q_positive) + if negative: + q_negative = [f'"{a}"' if len(a.split()) > 1 else a for a in negative] + q_negative = " OR ".join(q_negative) + if positive and negative: + query = f"({q_positive}) AND NOT ({q_negative})" + elif positive: + query = q_positive + elif negative: + query = f"NOT ({q_negative})" + case "web_google": + # see https://newsinitiative.withgoogle.com/resources/trainings/advanced-google-trends/ + # and https://support.google.com/trends/answer/4359582?hl=en + q_positive = ( + [f'+"{a}"' if len(a.split()) > 1 else f"+{a}" for a in positive] + if positive + else [] + ) + q_negative = ( + [f'-"{a}"' if len(a.split()) > 1 else f"-{a}" for a in negative] + if negative + else [] + ) + if positive and negative: + query = " ".join(q_positive[:4] + q_negative[:4]) + elif positive: + query = " ".join(q_positive[:4]) + elif negative: + query = " ".join(q_negative[:4]) + query = query.replace("*", "") + return query diff --git a/backend-python/media_impact_monitor/trends/sentiment_trend.py b/backend-python/media_impact_monitor/trends/sentiment_trend.py new file mode 100644 index 00000000..1fa31541 --- /dev/null +++ b/backend-python/media_impact_monitor/trends/sentiment_trend.py @@ -0,0 +1,39 @@ +from datetime import date + +import pandas as pd + +from media_impact_monitor.data_loaders.news_online.mediacloud_ import ( + get_mediacloud_fulltexts, +) +from media_impact_monitor.sentiment import sentiment +from media_impact_monitor.types_ import TrendSearch +from media_impact_monitor.util.cache import cache +from media_impact_monitor.util.parallel import parallel_tqdm + + +@cache +def get_sentiment_trend(q: TrendSearch) -> pd.DataFrame: + assert q.trend_type == "sentiment" + assert ( + q.media_source == "news_online" + ), "Currently only news_online has fulltexts available, which are necessary for sentiment analysis." + start_date = date(2024, 4, 1) + query = '"letzte generation"' + fulltexts = get_mediacloud_fulltexts( + query=query, start_date=start_date, countries=["Germany"] + ) + responses = parallel_tqdm(sentiment, fulltexts["text"], desc="Sentiment analysis") + fulltexts["sentiment"] = [r["sentiment"] for r in responses] + fulltexts["sentiment_reasoning"] = [r["reasoning"] for r in responses] + # aggregate positive, neutral, negative sentiments by day + fulltexts["sentiment"] = fulltexts["sentiment"].astype(int) + fulltexts = ( + fulltexts.groupby("publish_date")["sentiment"] + .value_counts() + .unstack() + .fillna(0) + ) + fulltexts.columns = ["negative", "neutral", "positive"] + fulltexts.index = pd.to_datetime(fulltexts.index).date + fulltexts.index.name = "date" + return fulltexts diff --git a/backend-python/media_impact_monitor/types_.py b/backend-python/media_impact_monitor/types_.py index d742124a..75f4157d 100644 --- a/backend-python/media_impact_monitor/types_.py +++ b/backend-python/media_impact_monitor/types_.py @@ -68,7 +68,8 @@ class Event: #### Trend types #### -TrendType = Literal["keywords", "topics", "sentiments"] +TrendType = Literal["keywords", "topic", "sentiment"] +Aggregation = Literal["daily", "weekly", "monthly"] class TrendSearch(BaseModel): @@ -81,6 +82,9 @@ class TrendSearch(BaseModel): topic: Topic | None = Field( description="When retrieving keyword frequencies, this automatically sets relevant sets of keywords. Currently only _climate_change_ is supported." ) + aggregation: Aggregation = Field( + default="daily", description="The time aggregation of the trend." + ) #### Fulltext types #### diff --git a/backend-python/media_impact_monitor/util/cache.py b/backend-python/media_impact_monitor/util/cache.py index 6ebe1151..974c1bc2 100644 --- a/backend-python/media_impact_monitor/util/cache.py +++ b/backend-python/media_impact_monitor/util/cache.py @@ -52,13 +52,13 @@ def post(url, sleep=None, **kwargs): concurrency = 10 -retries = 5 +retries = 2 @cache def get_proxied(url, *args, **kwargs): - client = ZenRowsClient(ZENROWS_API_KEY, retries=2, concurrency=concurrency) + client = ZenRowsClient(ZENROWS_API_KEY, retries=retries, concurrency=concurrency) response = client.get(url, *args, **kwargs) if '{"code":' in response.text: - raise ValueError(response.text) + raise ValueError(f"{url}: {response.text}") return response diff --git a/backend-python/media_impact_monitor/util/env.py b/backend-python/media_impact_monitor/util/env.py index 2768a71f..1f0683f4 100644 --- a/backend-python/media_impact_monitor/util/env.py +++ b/backend-python/media_impact_monitor/util/env.py @@ -8,8 +8,18 @@ ACLED_KEY = environ["ACLED_KEY"] MEDIACLOUD_API_TOKEN = environ["MEDIACLOUD_API_TOKEN"] ZENROWS_API_KEY = environ["ZENROWS_API_KEY"] +AZURE_API_BASE = environ["AZURE_API_BASE"] +AZURE_API_VERSION = environ["AZURE_API_VERSION"] +AZURE_API_KEY = environ["AZURE_API_KEY"] +DATAFORSEO_EMAIL = environ["DATAFORSEO_EMAIL"] +DATAFORSEO_PASSWORD = environ["DATAFORSEO_PASSWORD"] assert ACLED_EMAIL assert ACLED_KEY assert MEDIACLOUD_API_TOKEN assert ZENROWS_API_KEY +assert AZURE_API_BASE +assert AZURE_API_VERSION +assert AZURE_API_KEY +assert DATAFORSEO_EMAIL +assert DATAFORSEO_PASSWORD diff --git a/backend-python/media_impact_monitor/util/llm.py b/backend-python/media_impact_monitor/util/llm.py new file mode 100644 index 00000000..202b79b3 --- /dev/null +++ b/backend-python/media_impact_monitor/util/llm.py @@ -0,0 +1,18 @@ +from functools import partial + +import litellm + +from media_impact_monitor.util.cache import cache +from media_impact_monitor.util.env import ( + AZURE_API_BASE, + AZURE_API_KEY, + AZURE_API_VERSION, +) + +completion = partial( + cache(litellm.completion), + model="azure/gpt-35-turbo", # model = azure/ + api_base=AZURE_API_BASE, + api_version=AZURE_API_VERSION, + api_key=AZURE_API_KEY, +) diff --git a/backend-python/poetry.lock b/backend-python/poetry.lock index 397b3b5f..d0a87b55 100644 --- a/backend-python/poetry.lock +++ b/backend-python/poetry.lock @@ -14,6 +14,116 @@ files = [ [package.dependencies] triad = ">=0.6.1" +[[package]] +name = "aiohttp" +version = "3.9.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + [[package]] name = "altair" version = "5.3.0" @@ -229,6 +339,17 @@ files = [ [package.dependencies] typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + [[package]] name = "attrs" version = "23.2.0" @@ -323,6 +444,17 @@ files = [ {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, ] +[[package]] +name = "boilerpy3" +version = "1.0.7" +description = "Python port of Boilerpipe, for HTML boilerplate removal and text extraction" +optional = false +python-versions = ">=3.6" +files = [ + {file = "boilerpy3-1.0.7-py3-none-any.whl", hash = "sha256:fbfba91745606965400204d26852283ddf90235ab30afe9904de20051556a523"}, + {file = "boilerpy3-1.0.7.tar.gz", hash = "sha256:a9fede212f80a36dbc7d4f93e35d8636911cb6b37085a3230557d16ad0f076c8"}, +] + [[package]] name = "cachetools" version = "5.3.3" @@ -445,6 +577,17 @@ files = [ [package.dependencies] pycparser = "*" +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + [[package]] name = "charset-normalizer" version = "3.3.2" @@ -690,6 +833,33 @@ files = [ [package.dependencies] numpy = ">=1.20.0" +[[package]] +name = "courlan" +version = "1.1.0" +description = "Clean, filter and sample URLs to optimize data collection – includes spam, content type and language filters." +optional = false +python-versions = ">=3.6" +files = [ + {file = "courlan-1.1.0-py3-none-any.whl", hash = "sha256:88354c1e50fde84890c13f58924a5ecc5c0527dcf3eb36e80564fe68e330bb03"}, + {file = "courlan-1.1.0.tar.gz", hash = "sha256:d706684334f18be4ada1fbd57f2680adf0036648f6d840852f7a4822d3adfd8d"}, +] + +[package.dependencies] +babel = ">=2.11.0" +tld = {version = ">=0.13", markers = "python_version >= \"3.7\""} +urllib3 = {version = ">=1.26,<3", markers = "python_version >= \"3.7\""} + +[[package]] +name = "cssselect" +version = "1.2.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] + [[package]] name = "cycler" version = "0.12.1" @@ -809,6 +979,28 @@ files = [ {file = "dash_vega_components-0.10.0.tar.gz", hash = "sha256:007acf910dc85a2112e521f5cd28367e7f01a0450a9924837eb7e657d75b4e20"}, ] +[[package]] +name = "dateparser" +version = "1.2.0" +description = "Date parsing library designed to parse dates from HTML pages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dateparser-1.2.0-py2.py3-none-any.whl", hash = "sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830"}, + {file = "dateparser-1.2.0.tar.gz", hash = "sha256:7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30"}, +] + +[package.dependencies] +python-dateutil = "*" +pytz = "*" +regex = "<2019.02.19 || >2019.02.19,<2021.8.27 || >2021.8.27" +tzlocal = "*" + +[package.extras] +calendars = ["convertdate", "hijri-converter"] +fasttext = ["fasttext"] +langdetect = ["langdetect"] + [[package]] name = "debugpy" version = "1.8.1" @@ -1025,6 +1217,126 @@ files = [ {file = "fastprogress-1.0.3.tar.gz", hash = "sha256:7a17d2b438890f838c048eefce32c4ded47197ecc8ea042cecc33d3deb8022f5"}, ] +[[package]] +name = "faust-cchardet" +version = "2.1.19" +description = "cChardet is high speed universal character encoding detector." +optional = false +python-versions = "*" +files = [ + {file = "faust-cchardet-2.1.19.tar.gz", hash = "sha256:f89386297cde0c8e0f5e21464bc2d6d0e4a4fc1b1d77cdb238ca24d740d872e0"}, + {file = "faust_cchardet-2.1.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fd76c4c39fde29d8d8a0a79d63c15cd698d79a6cd21350f27a55c5f700ae37a0"}, + {file = "faust_cchardet-2.1.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:749d5293531d10ed6f9f7055d37dded2294c849371904bf3a4dc93c544bd8b29"}, + {file = "faust_cchardet-2.1.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:033d0cbbdb7d30775c895be0b8625854f0bc53c1b0bd43b382bc37d165a85072"}, + {file = "faust_cchardet-2.1.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32298550400afe008bf5071975bfdeef051db6d266aa6c0b5cd9db86c87091a8"}, + {file = "faust_cchardet-2.1.19-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab0c4a6c26558daf7bf8a125ae9f46226557dbdb9bf185ff8824960dea9e3c23"}, + {file = "faust_cchardet-2.1.19-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b07fcb7a1269807289ac42917d18ad4b6e25385428293d9f972fb4bd2f0240a9"}, + {file = "faust_cchardet-2.1.19-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:974af1b3a27a7b015571600ca941c9d2b127d23b47bb02039c56063b30c34431"}, + {file = "faust_cchardet-2.1.19-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89121579c5606ea9f5b9dee43edcad99f8e3bf14973127fdd564fd42931a01ac"}, + {file = "faust_cchardet-2.1.19-cp310-cp310-win_amd64.whl", hash = "sha256:ad0c52de878464242fee94f743879b9dfd5789ef612e022b54ec0f468c87f4ca"}, + {file = "faust_cchardet-2.1.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90fa1ec45ec7afd0ecc523287c26858bc5e57ec8180880b9ae390460f65fe197"}, + {file = "faust_cchardet-2.1.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6812ab2295f826c24e31e561e77a6044cdcb5841df685fb870d3dd573c0abec3"}, + {file = "faust_cchardet-2.1.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34b9540f4ec63315902053bb328de6e367f1a3d6f42fcff4acf6ccd33b0f02f9"}, + {file = "faust_cchardet-2.1.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e27c7c561db5ba1df87466003b6a76c88698efde2300cbfff62902d2a749f26"}, + {file = "faust_cchardet-2.1.19-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7789695f100c6e60fead2c50277ad6d22b25b66b85ee091b5b7398a82ee98ea"}, + {file = "faust_cchardet-2.1.19-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ddd7b1e40695fe4d3c42879ea91a96ea8552c757250109ddd80b8270ad49baa3"}, + {file = "faust_cchardet-2.1.19-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6f79cf808f92f7c910a1922bdba4d4c711dda0ce7aff0cb8503c47c277c99d06"}, + {file = "faust_cchardet-2.1.19-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cd10370deebd340da20d94f7d5af70b7c17b78c90f8f98a0e11cbb45232d754c"}, + {file = "faust_cchardet-2.1.19-cp311-cp311-win_amd64.whl", hash = "sha256:f19f128b00b81b3e50f1e6fc6e177e0976e5d9b8ec24c047b68ae6e8118db309"}, + {file = "faust_cchardet-2.1.19-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8ce7889e03ba7550099127ffc9b27f1c799c75cdf3698ea3a60e86dadff4bea4"}, + {file = "faust_cchardet-2.1.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da1be0b5281f77e79009cf535a218892c24d87483a7a21a7f85d113c6e1da466"}, + {file = "faust_cchardet-2.1.19-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2d088af4711241bc24d858d2fd54854f0a7a969e9890b6dea5512be28d3f83a"}, + {file = "faust_cchardet-2.1.19-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5eded4811f4a6d5a12ee5eed3c0b95312b0644ca504966043fdcc2f20637d7d5"}, + {file = "faust_cchardet-2.1.19-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a194b7d63073ebf8bdc2a1c76451bbbf6b1d31191d2d04b02b14335df5523840"}, + {file = "faust_cchardet-2.1.19-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0f808d12233fe92de881e4d232c0acd52f0123804bcd6d711db3a46b5e09ecf6"}, + {file = "faust_cchardet-2.1.19-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:171191fbc41b541012f5bd18efb3b1434c789f4eedb664332178715b70377372"}, + {file = "faust_cchardet-2.1.19-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5e6c400186d8ec37365e9b22f322bb98d70aff0798da7377b2580f9169358a40"}, + {file = "faust_cchardet-2.1.19-cp312-cp312-win_amd64.whl", hash = "sha256:a41cc69686450b7402a2e87703389cc9d6738a9658781ddb9acf7b52fea068f7"}, + {file = "faust_cchardet-2.1.19-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:29f72f7ba7fb6a238e072596f0fc6731f770ddb415957ed951969236cab05e4c"}, + {file = "faust_cchardet-2.1.19-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:533dcb28107b255d8122268f2e76f0e1cbb1c1e437d522850cd67077fe36f16a"}, + {file = "faust_cchardet-2.1.19-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb649e25b7d5d594035dba3fb807ebc59d8dd433a434a8f5afa22c62f9deb0d0"}, + {file = "faust_cchardet-2.1.19-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f2e2ac15168c77a0a34bd1c1118ed85837cc3c922124e3bdc58f5a49ca3644d"}, + {file = "faust_cchardet-2.1.19-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:225495cc44f9f698456ccd325f105f2be206996fc743128de9e5afa866687879"}, + {file = "faust_cchardet-2.1.19-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:600903f05ed0e2a70e557c30a629b6ba879d7eee259ae2d3cd27b907da09f139"}, + {file = "faust_cchardet-2.1.19-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7b4b2a21af19d9034a31e2c990f5a572d00b5f5b758ef2cee0282e8545eba2ab"}, + {file = "faust_cchardet-2.1.19-cp36-cp36m-win_amd64.whl", hash = "sha256:da7ea1892ac51a1f96c1431ccfa0e9c99d6dda8a434c778a6da1ba12b2f5fa25"}, + {file = "faust_cchardet-2.1.19-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5b150e1a3bf78e6680755902f1bb880caadd93a472ac460ebc0e6f55b3b31d78"}, + {file = "faust_cchardet-2.1.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99c42ed30a9b431633f729e24831ccc8a0d8c40b92789e72075197582424f84"}, + {file = "faust_cchardet-2.1.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c23252578dd3be28e3e81b84702e2174e3b34da303128dc662d92fa217ee169"}, + {file = "faust_cchardet-2.1.19-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d705e5ae8cba8cfa6af28bda60a99d2f846752abc9dc4cdb5d2354e9a628008"}, + {file = "faust_cchardet-2.1.19-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0930c2adccd871ab7d39d4919d1cd5368556ea3bf7c96365e282125f22636692"}, + {file = "faust_cchardet-2.1.19-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d99c2d5735f48b4c80417322f9a36287d454e9dbdf683caa1f990f9a3b2cfb5c"}, + {file = "faust_cchardet-2.1.19-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d14aaeb2ab67250e0b39e550b9554e97c3c92f4611590058d975556bc5f0408a"}, + {file = "faust_cchardet-2.1.19-cp37-cp37m-win_amd64.whl", hash = "sha256:05573988162fcb4d92966946561094bc9d8e73cdb6cd697473b12b234bf1a828"}, + {file = "faust_cchardet-2.1.19-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6091daffd040575f4cd384346a71f130eddb0e0fe3be1b9c2bb412eb6dcc34c0"}, + {file = "faust_cchardet-2.1.19-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:908b278fa3d38b3c01c5c0933523be23e6f5bfba649314864eb9a6262b407488"}, + {file = "faust_cchardet-2.1.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8357587d56757582a1851a389159dd6234ba03af418119be0d43e18086538c8"}, + {file = "faust_cchardet-2.1.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec258ee3ecbaae39293343c735218a4750d0230a3e56c1bc1a2c7710d555e16f"}, + {file = "faust_cchardet-2.1.19-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16cad2e3e81fd125f6ee00deb58afb5270b01f45db2a46e92701aa95d7fe2b50"}, + {file = "faust_cchardet-2.1.19-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fef6c9217e5fde444cec776aaf0d99b397dc59b6e379cdad86eb6c21c6844e8c"}, + {file = "faust_cchardet-2.1.19-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d8bfaa533b92f7813c43bfb81ed0b418a939d808946aa6b160f8d29ba384a089"}, + {file = "faust_cchardet-2.1.19-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:998d7f4ad7bed4f879216bc658e738ca5f1a89a573f770914a16db5e26d160da"}, + {file = "faust_cchardet-2.1.19-cp38-cp38-win_amd64.whl", hash = "sha256:9d2eba1a31dfb8df5cc9ad42e9a8ead510f03314e5f09094f89cc164b82f47a4"}, + {file = "faust_cchardet-2.1.19-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:97d97a03165c2238147c76ff5d1fa4fd676721f1563407073a4ef00191beacc6"}, + {file = "faust_cchardet-2.1.19-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1398d438bb718adc4b04828c2f790dd195db14b529533a7daf6fc60572231f04"}, + {file = "faust_cchardet-2.1.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fe6ae7c65825042f9db03ff1edb8b93b50db68d40b3eaa9340d22eb4f9d1e7d"}, + {file = "faust_cchardet-2.1.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7196a7a27c14f0b7a26beaf78bde6de7a2999d18a5ced74b55c01d6b85c54eef"}, + {file = "faust_cchardet-2.1.19-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d350349ea9024476b146134da40fb2696ce53827a6e7681cd11a3f4413bb53bc"}, + {file = "faust_cchardet-2.1.19-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5de8d35909c9a2186307a340525e67ebc5f84f808db6d67676a4d5ce134e0bfc"}, + {file = "faust_cchardet-2.1.19-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:283cdc978ca2149a77d92433ff15da4cb471924642a6c0add16c13f4afb9b4af"}, + {file = "faust_cchardet-2.1.19-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27de578ef1e50d6bea5119abbf9056179f9ba799233a93632097485962882f4"}, + {file = "faust_cchardet-2.1.19-cp39-cp39-win_amd64.whl", hash = "sha256:e783e06f04bd2f35432c5735bee70ba0a1fd7bf33628c598ad865fa6a7d80fd1"}, + {file = "faust_cchardet-2.1.19-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d5c5b245afbf89a4254abcdda93d7da3a8a58614aa0aed211e8d6e726c11b91"}, + {file = "faust_cchardet-2.1.19-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64b3d9559a3c88baa7de0300e4d131b395903d0a9f32412aae15619791199527"}, + {file = "faust_cchardet-2.1.19-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8706fc2ce4392cf18fb823f0a805213bae103c1eb3659792d7ab690c5589ea39"}, + {file = "faust_cchardet-2.1.19-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0dbf865b5a7f03d967294efb435de6eede51e74a8af31abc6e959b87b90b0d3a"}, + {file = "faust_cchardet-2.1.19-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:873089b385009c672c7364aaf281f39601af739218d812a8d41b6ac3a96e83d4"}, + {file = "faust_cchardet-2.1.19-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b24c4d5c8eb12f09955e10566c9d2b372eb869060aca9999bd2e38770129eb7e"}, + {file = "faust_cchardet-2.1.19-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa5d8a290fe66a40582d0034c1ab6c8934231474f9361641f1206585716994fc"}, + {file = "faust_cchardet-2.1.19-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70511edd3be6d2537f47527762f44e9aeaf0d135cb78b2ba7a0d7e283baaaa01"}, + {file = "faust_cchardet-2.1.19-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba438330d8017016f0bb74d81d504bf9c5ab58211cbc35e71695cbf6858fca4b"}, + {file = "faust_cchardet-2.1.19-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f81c2f643b2e09a09119554a5f9d60f40a70320b6519e9a6634ae93d05c01c0f"}, + {file = "faust_cchardet-2.1.19-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:17d8aa6575d0b81fffc4b05a97f5ffe79a2dac585689517c9410b6ce4678981a"}, + {file = "faust_cchardet-2.1.19-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5447f1c9b133abbcc97b87c5d29825567b76384088783b6171eefbca120e44ca"}, + {file = "faust_cchardet-2.1.19-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0b3b8897ed14f338310a998a86d7671004bbe27dcd99451f2f9d73e0f04d110"}, + {file = "faust_cchardet-2.1.19-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:396094d4875fcb30a573c71b6e8f44260ed89cf4e957769c50e84f453827d96d"}, + {file = "faust_cchardet-2.1.19-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:9df42a1bc3f244ed219529c668d4b42e24243114bcb120229ebb7c44a829c648"}, + {file = "faust_cchardet-2.1.19-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a36f56c921536abcfdb560cbc02dca9fc637c48e58585699105e5ea8c6f558bc"}, + {file = "faust_cchardet-2.1.19-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce81f69a3dee0bf73470bac31c8bcc29d05b981874b84c46e5599374b9f20d4f"}, + {file = "faust_cchardet-2.1.19-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd130c3feca879ef80c5090aefcd0cd4f22da80040c82206de666ca5eb2ee5e3"}, + {file = "faust_cchardet-2.1.19-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e6fa0a2ca80d6d3ce7dae158eb85ae3d784583aed22b064ffebca592be5e46"}, + {file = "faust_cchardet-2.1.19-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:dfe3d4360711cdc4ed5b913ab56b99fa03daa945e05bd7755eaaf7e1d8a3fa94"}, +] + +[[package]] +name = "feedfinder2" +version = "0.0.4" +description = "Find the feed URLs for a website." +optional = false +python-versions = "*" +files = [ + {file = "feedfinder2-0.0.4.tar.gz", hash = "sha256:3701ee01a6c85f8b865a049c30ba0b4608858c803fe8e30d1d289fdbe89d0efe"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +requests = "*" +six = "*" + +[[package]] +name = "feedparser" +version = "6.0.11" +description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds" +optional = false +python-versions = ">=3.6" +files = [ + {file = "feedparser-6.0.11-py3-none-any.whl", hash = "sha256:0be7ee7b395572b19ebeb1d6aafb0028dee11169f1c934e0ed67d54992f4ad45"}, + {file = "feedparser-6.0.11.tar.gz", hash = "sha256:c9d0407b64c6f2a065d0ebb292c2b35c01050cc0dc33757461aaabdc4c4184d5"}, +] + +[package.dependencies] +sgmllib3k = "*" + [[package]] name = "filelock" version = "3.14.0" @@ -1139,6 +1451,92 @@ files = [ {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, ] +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + [[package]] name = "fs" version = "2.4.16" @@ -1220,6 +1618,47 @@ ray = ["duckdb (>=0.5.0)", "pandas (<2.2)", "pyarrow (>=7.0.0)", "ray[data] (>=2 spark = ["pyspark (>=3.1.1)"] sql = ["fugue-sql-antlr (>=0.2.0)", "jinja2", "qpd (>=0.4.4)", "sqlglot"] +[[package]] +name = "furl" +version = "2.1.3" +description = "URL manipulation made simple." +optional = false +python-versions = "*" +files = [ + {file = "furl-2.1.3-py2.py3-none-any.whl", hash = "sha256:9ab425062c4217f9802508e45feb4a83e54324273ac4b202f1850363309666c0"}, + {file = "furl-2.1.3.tar.gz", hash = "sha256:5a6188fe2666c484a12159c18be97a1977a71d632ef5bb867ef15f54af39cc4e"}, +] + +[package.dependencies] +orderedmultidict = ">=1.0.1" +six = ">=1.8.0" + +[[package]] +name = "goose3" +version = "3.1.19" +description = "Html Content / Article Extractor, web scrapping for Python3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "goose3-3.1.19-py3-none-any.whl", hash = "sha256:65744ae4cce205314b28026179d69b05aaa9eee4259b5ec0732951e1ab5c5c8c"}, + {file = "goose3-3.1.19.tar.gz", hash = "sha256:95fb419d5173a84b4f1041dcaa290f4ca00072eb36245de503b39671c38b96a9"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +cssselect = "*" +langdetect = "*" +lxml = "*" +Pillow = "*" +pyahocorasick = "*" +python-dateutil = "*" +requests = "*" + +[package.extras] +all = ["jieba", "nltk"] +arabic = ["nltk"] +chinese = ["jieba"] + [[package]] name = "graphviz" version = "0.20.3" @@ -1309,6 +1748,28 @@ files = [ {file = "html2text-2020.1.16.tar.gz", hash = "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"}, ] +[[package]] +name = "htmldate" +version = "1.8.1" +description = "Fast and robust extraction of original and updated publication dates from URLs and web pages." +optional = false +python-versions = ">=3.6" +files = [ + {file = "htmldate-1.8.1-py3-none-any.whl", hash = "sha256:b1209dedfa7bc9bb4d0b812a3f0983ea5d39f1bdfe21745659ad26af4f8b7f32"}, + {file = "htmldate-1.8.1.tar.gz", hash = "sha256:caf1686cf75c61dd1f061ede5d7a46e759b15d5f9987cd8e13c8c4237511263d"}, +] + +[package.dependencies] +charset-normalizer = {version = ">=3.3.2", markers = "python_version >= \"3.7\""} +dateparser = ">=1.1.2" +lxml = {version = ">=4.9.4,<6", markers = "platform_system != \"Darwin\" or python_version > \"3.8\""} +python-dateutil = ">=2.8.2" +urllib3 = {version = ">=1.26,<3", markers = "python_version >= \"3.7\""} + +[package.extras] +all = ["backports-datetime-fromisoformat", "faust-cchardet (>=2.1.19)", "urllib3[brotli]"] +speed = ["backports-datetime-fromisoformat", "faust-cchardet (>=2.1.19)", "urllib3[brotli]"] + [[package]] name = "httpcore" version = "1.0.5" @@ -1402,6 +1863,40 @@ cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +[[package]] +name = "huggingface-hub" +version = "0.23.0" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.23.0-py3-none-any.whl", hash = "sha256:075c30d48ee7db2bba779190dc526d2c11d422aed6f9044c5e2fdc2c432fdb91"}, + {file = "huggingface_hub-0.23.0.tar.gz", hash = "sha256:7126dedd10a4c6fac796ced4d87a8cf004efc722a5125c2c09299017fa366fa9"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + [[package]] name = "idna" version = "3.7" @@ -1579,6 +2074,16 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +[[package]] +name = "jieba3k" +version = "0.35.1" +description = "Chinese Words Segementation Utilities" +optional = false +python-versions = "*" +files = [ + {file = "jieba3k-0.35.1.zip", hash = "sha256:980a4f2636b778d312518066be90c7697d410dd5a472385f5afced71a2db1c10"}, +] + [[package]] name = "jinja2" version = "3.1.4" @@ -1932,6 +2437,20 @@ files = [ {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, ] +[[package]] +name = "justext" +version = "3.0.1" +description = "Heuristic based boilerplate removal tool" +optional = false +python-versions = "*" +files = [ + {file = "jusText-3.0.1-py2.py3-none-any.whl", hash = "sha256:e0fb882dd7285415709f4b7466aed23d6b98b7b89404c36e8a2e730facfed02b"}, + {file = "justext-3.0.1.tar.gz", hash = "sha256:b6ed2fb6c5d21618e2e34b2295c4edfc0bcece3bd549ed5c8ef5a8d20f0b3451"}, +] + +[package.dependencies] +lxml = {version = ">=4.4.2", extras = ["html-clean"]} + [[package]] name = "kiwisolver" version = "1.4.5" @@ -2045,6 +2564,46 @@ files = [ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] +[[package]] +name = "langdetect" +version = "1.0.9" +description = "Language detection library ported from Google's language-detection." +optional = false +python-versions = "*" +files = [ + {file = "langdetect-1.0.9-py2-none-any.whl", hash = "sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a"}, + {file = "langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "litellm" +version = "1.37.16" +description = "Library to easily interface with LLM API providers" +optional = false +python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" +files = [ + {file = "litellm-1.37.16-py3-none-any.whl", hash = "sha256:b3250832ff8578d906ee9230ebaf13b787f139de705d4d397f87a0ce3ee57392"}, + {file = "litellm-1.37.16.tar.gz", hash = "sha256:c90c826a16d154c755f73a828b84b11cef9fc0891ff322023ea247b3c7fcdc1f"}, +] + +[package.dependencies] +aiohttp = "*" +click = "*" +importlib-metadata = ">=6.8.0" +jinja2 = ">=3.1.2,<4.0.0" +openai = ">=1.0.0" +python-dotenv = ">=0.2.0" +requests = ">=2.31.0,<3.0.0" +tiktoken = ">=0.4.0" +tokenizers = "*" + +[package.extras] +extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "resend (>=0.8.0,<0.9.0)"] +proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.111.0,<0.112.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=22.0.0,<23.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] + [[package]] name = "llvmlite" version = "0.42.0" @@ -2089,6 +2648,181 @@ files = [ multipledispatch = "*" toolz = "*" +[[package]] +name = "lxml" +version = "5.2.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, +] + +[package.dependencies] +lxml-html-clean = {version = "*", optional = true, markers = "extra == \"html-clean\""} + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.10)"] + +[[package]] +name = "lxml-html-clean" +version = "0.1.1" +description = "HTML cleaner from lxml project" +optional = false +python-versions = "*" +files = [ + {file = "lxml_html_clean-0.1.1-py3-none-any.whl", hash = "sha256:58c04176593c9caf72ec92e033d2f38859e918b3eff0cc0f8051ad27dc2ab8ef"}, + {file = "lxml_html_clean-0.1.1.tar.gz", hash = "sha256:8a644ed01dbbe132fabddb9467f077f6dad12a1d4f3a6a553e280f3815fa46df"}, +] + +[package.dependencies] +lxml = "*" + [[package]] name = "markupsafe" version = "2.1.5" @@ -2238,6 +2972,38 @@ requests = "==2.*" dev = ["flake8", "isort", "mypy", "pre-commit", "python-dotenv", "types-requests", "types-urllib3"] test = ["pytest"] +[[package]] +name = "mediacloud-metadata" +version = "1.0.2" +description = "Media Cloud news article metadata extraction" +optional = false +python-versions = ">=3.10" +files = [ + {file = "mediacloud_metadata-1.0.2-py3-none-any.whl", hash = "sha256:ee224df2b1a8907dfd946415db05e6ffc7567ab6ba488573e540bd87885a5575"}, + {file = "mediacloud_metadata-1.0.2.tar.gz", hash = "sha256:abb18ed1b84329eda961ea74f8034c9a0fed4425c121dd2a876213a22d4e9706"}, +] + +[package.dependencies] +BeautifulSoup4 = "==4.12.*" +boilerpy3 = "==1.0.*" +dateparser = "==1.2.*" +faust-cchardet = "==2.1.*" +furl = "==2.1.*" +goose3 = "==3.1.*" +htmldate = "==1.8.*" +newspaper3k = "==0.2.*" +py3langid = "==0.2.*" +readability-lxml = "==0.8.*" +requests = "*" +surt = "0.3.1" +tldextract = "==5.1.*" +trafilatura = "==1.8.*" +url-normalize = "==1.4.*" + +[package.extras] +dev = ["flake8", "isort", "mypy", "pre-commit", "types-requests", "types-urllib3"] +test = ["parameterized", "pytest"] + [[package]] name = "minikanren" version = "1.0.3" @@ -2266,6 +3032,105 @@ files = [ {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + [[package]] name = "multipledispatch" version = "1.0.0" @@ -2368,6 +3233,57 @@ files = [ {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] +[[package]] +name = "newspaper3k" +version = "0.2.8" +description = "Simplified python article discovery & extraction." +optional = false +python-versions = "*" +files = [ + {file = "newspaper3k-0.2.8-py3-none-any.whl", hash = "sha256:44a864222633d3081113d1030615991c3dbba87239f6bbf59d91240f71a22e3e"}, + {file = "newspaper3k-0.2.8.tar.gz", hash = "sha256:9f1bd3e1fb48f400c715abf875cc7b0a67b7ddcd87f50c9aeeb8fcbbbd9004fb"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.4.1" +cssselect = ">=0.9.2" +feedfinder2 = ">=0.0.4" +feedparser = ">=5.2.1" +jieba3k = ">=0.35.1" +lxml = ">=3.6.0" +nltk = ">=3.2.1" +Pillow = ">=3.3.0" +python-dateutil = ">=2.5.3" +PyYAML = ">=3.11" +requests = ">=2.10.0" +tinysegmenter = "0.3" +tldextract = ">=2.0.1" + +[[package]] +name = "nltk" +version = "3.8.1" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, + {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + [[package]] name = "notebook" version = "7.1.3" @@ -2527,6 +3443,20 @@ files = [ [package.dependencies] et-xmlfile = "*" +[[package]] +name = "orderedmultidict" +version = "1.0.1" +description = "Ordered Multivalue Dictionary" +optional = false +python-versions = "*" +files = [ + {file = "orderedmultidict-1.0.1-py2.py3-none-any.whl", hash = "sha256:43c839a17ee3cdd62234c47deca1a8508a3f2ca1d0678a3bf791c87cf84adbf3"}, + {file = "orderedmultidict-1.0.1.tar.gz", hash = "sha256:04070bbb5e87291cc9bfa51df413677faf2141c73c61d2a5f7b26bea3cd882ad"}, +] + +[package.dependencies] +six = ">=1.8.0" + [[package]] name = "overrides" version = "7.7.0" @@ -2966,6 +3896,58 @@ files = [ {file = "py_spy-0.3.14-py2.py3-none-win_amd64.whl", hash = "sha256:8f5b311d09f3a8e33dbd0d44fc6e37b715e8e0c7efefafcda8bfd63b31ab5a31"}, ] +[[package]] +name = "py3langid" +version = "0.2.2" +description = "Fork of the language identification tool langid.py, featuring a modernized codebase and faster execution times." +optional = false +python-versions = ">=3.6" +files = [ + {file = "py3langid-0.2.2-py3-none-any.whl", hash = "sha256:a5460ccc565c7b6a7a0e72f42236900b810e73c065a1b769a69fa9d9cff13f00"}, + {file = "py3langid-0.2.2.tar.gz", hash = "sha256:b4de01dad7e701f29d216a0935e85e096cc8675903d23ea8445b2bb5f090b96f"}, +] + +[package.dependencies] +numpy = "*" + +[[package]] +name = "pyahocorasick" +version = "2.1.0" +description = "pyahocorasick is a fast and memory efficient library for exact or approximate multi-pattern string search. With the ``ahocorasick.Automaton`` class, you can find multiple key string occurrences at once in some input text. You can use it as a plain dict-like Trie or convert a Trie to an automaton for efficient Aho-Corasick search. And pickle to disk for easy reuse of large automatons. Implemented in C and tested on Python 3.6+. Works on Linux, macOS and Windows. BSD-3-Cause license." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyahocorasick-2.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c46288044c4f71392efb4f5da0cb8abd160787a8b027afc85079e9c3d7551eb"}, + {file = "pyahocorasick-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f15529c83b8c6e0548d7d3c5631fefa23fba5190e67be49d6c9e24a6358ff9c"}, + {file = "pyahocorasick-2.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:581e3d85043f1797543796f021e8d7d48c18e594529b72d86f70ea78abc88fff"}, + {file = "pyahocorasick-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c860ad9cb59e56c31aed8a5d1ee9d83a0151277b09198d027ffce213697716ed"}, + {file = "pyahocorasick-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:4f8eba88fce34a1d8020638a4a8732c6241a5d85fe12be8669b7495d99d36b6a"}, + {file = "pyahocorasick-2.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d6e0da0a8fc78c694778dced537c1bfb8b2f178ec92a82d81539d2e35a15cba0"}, + {file = "pyahocorasick-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:658d55e51c7588a5dba57de674241a16a3c94bf57f3bfd70022c4d7defe2b0f4"}, + {file = "pyahocorasick-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9f2728ac77bab807ba65c6ef41be30358ef0c9bb6960c9fe070d43f7024cb91"}, + {file = "pyahocorasick-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a58c44c407a45155dc7a3253274b5fd78ab00b579bd5685059610867cdb37142"}, + {file = "pyahocorasick-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8254d6333df5eb400ed3ec8b24da9e3f5da8e28b94a71392391703a7aac568d"}, + {file = "pyahocorasick-2.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:82b0d20e82cc282fd29324e8df93809cebbffb345055214ce4b7873698df02c8"}, + {file = "pyahocorasick-2.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6dedb9fed92705b742d6aa3d87abb1ec999f57310ef32b962f65f4e42182fe0a"}, + {file = "pyahocorasick-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f209796e7d354734781dd883c333596e482c70136fa76a4cb169f383e6c40bca"}, + {file = "pyahocorasick-2.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8337af64c649223cff548c7204dda823e83622d63e5449bc51ae069efb2f240f"}, + {file = "pyahocorasick-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:5ebe0d1e15afb782477e3d0aa1dce28ab9dad1200211fb785b9c1cc1208e6f04"}, + {file = "pyahocorasick-2.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7454ba5fa528958ca9a1bc3143f8e980bd7817ea481f46495e6ffa89675ab93b"}, + {file = "pyahocorasick-2.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3795ac922d21fbfea40a6b3a330762e8b38ce8ba511b1eb15bf9eeb9303b2662"}, + {file = "pyahocorasick-2.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8e92150849a3c13da37e37ca6374fa55960fd5c845029eca02d9b5846b26fe48"}, + {file = "pyahocorasick-2.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:23b183600e2087f16f6c5e6185d61525ad74335f2a5b693dd6d66bba2f6a4b05"}, + {file = "pyahocorasick-2.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:7034b26e145518610651339b8701568a3533a3114b00cf55f22bca80bff58e6d"}, + {file = "pyahocorasick-2.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:36491675a13fe4181a6b3bccfc9032a1a5d03bd3b0a151c06f8865c16ba44b42"}, + {file = "pyahocorasick-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:895ab1ff5384ee5325c74cbacafc419e534f1f110b9fb3c544cc56832ecce082"}, + {file = "pyahocorasick-2.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bf4a4b19ac37e9a7087646b8bcc306acd7a91649355d59b866b756068e35d018"}, + {file = "pyahocorasick-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f44f96496aa773fc5bf302ddf968dd6b920fab34522f944392af8bde13cbe805"}, + {file = "pyahocorasick-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:05b7c2ef52da247efec6fb5a011113b7e943e961e22aaaf757cb9c15083440c9"}, + {file = "pyahocorasick-2.1.0.tar.gz", hash = "sha256:4df4845c1149e9fa4aa33f0f0aa35f5a42957a43a3d6e447c9b44e679e2672ea"}, +] + +[package.extras] +testing = ["pytest", "setuptools", "twine", "wheel"] + [[package]] name = "pyarrow" version = "16.0.0" @@ -3541,6 +4523,25 @@ packaging = "*" [package.extras] test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] +[[package]] +name = "readability-lxml" +version = "0.8.1" +description = "fast html to text parser (article readability tool) with python 3 support" +optional = false +python-versions = "*" +files = [ + {file = "readability-lxml-0.8.1.tar.gz", hash = "sha256:e51fea56b5909aaf886d307d48e79e096293255afa567b7d08bca94d25b1a4e1"}, + {file = "readability_lxml-0.8.1-py3-none-any.whl", hash = "sha256:e0d366a21b1bd6cca17de71a4e6ea16fcfaa8b0a5b4004e39e2c7eff884e6305"}, +] + +[package.dependencies] +chardet = "*" +cssselect = "*" +lxml = "*" + +[package.extras] +test = ["timeout-decorator"] + [[package]] name = "referencing" version = "0.35.1" @@ -3556,6 +4557,94 @@ files = [ attrs = ">=22.2.0" rpds-py = ">=0.7.0" +[[package]] +name = "regex" +version = "2024.5.15" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, +] + [[package]] name = "requests" version = "2.31.0" @@ -3577,6 +4666,20 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-file" +version = "2.0.0" +description = "File transport adapter for Requests" +optional = false +python-versions = "*" +files = [ + {file = "requests-file-2.0.0.tar.gz", hash = "sha256:20c5931629c558fda566cacc10cfe2cd502433e628f568c34c80d96a0cc95972"}, + {file = "requests_file-2.0.0-py2.py3-none-any.whl", hash = "sha256:3e493d390adb44aa102ebea827a48717336d5268968c370eaf19abaf5cae13bf"}, +] + +[package.dependencies] +requests = ">=1.0.0" + [[package]] name = "retrying" version = "1.3.4" @@ -3861,6 +4964,16 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "sgmllib3k" +version = "1.0.0" +description = "Py3k port of sgmllib." +optional = false +python-versions = "*" +files = [ + {file = "sgmllib3k-1.0.0.tar.gz", hash = "sha256:7868fb1c8bfa764c1ac563d3cf369c381d1325d36124933a726f29fcdaa812e9"}, +] + [[package]] name = "six" version = "1.16.0" @@ -4057,6 +5170,20 @@ build = ["cython (>=0.29.33)"] develop = ["colorama", "cython (>=0.29.33)", "cython (>=3.0.10,<4)", "flake8", "isort", "joblib", "matplotlib (>=3)", "pytest (>=7.3.0,<8)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=8.0,<9.0)"] docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] +[[package]] +name = "surt" +version = "0.3.1" +description = "Sort-friendly URI Reordering Transform (SURT) python package." +optional = false +python-versions = "*" +files = [ + {file = "surt-0.3.1.tar.gz", hash = "sha256:24167eb6c01f24f757eef9bca6bf0ec089ec05ad5b6213c3b727a5e58c0c4720"}, +] + +[package.dependencies] +six = "*" +tldextract = ">=2.0" + [[package]] name = "tenacity" version = "8.3.0" @@ -4104,6 +5231,58 @@ files = [ {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, ] +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + [[package]] name = "tinycss2" version = "1.3.0" @@ -4122,6 +5301,165 @@ webencodings = ">=0.4" doc = ["sphinx", "sphinx_rtd_theme"] test = ["pytest", "ruff"] +[[package]] +name = "tinysegmenter" +version = "0.3" +description = "Very compact Japanese tokenizer" +optional = false +python-versions = "*" +files = [ + {file = "tinysegmenter-0.3.tar.gz", hash = "sha256:ed1f6d2e806a4758a73be589754384cbadadc7e1a414c81a166fc9adf2d40c6d"}, +] + +[[package]] +name = "tld" +version = "0.13" +description = "Extract the top-level domain (TLD) from the URL given." +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "tld-0.13-py2.py3-none-any.whl", hash = "sha256:f75b2be080f767ed17c2338a339eaa4fab5792586319ca819119da252f9f3749"}, + {file = "tld-0.13.tar.gz", hash = "sha256:93dde5e1c04bdf1844976eae440706379d21f4ab235b73c05d7483e074fb5629"}, +] + +[[package]] +name = "tldextract" +version = "5.1.2" +description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tldextract-5.1.2-py3-none-any.whl", hash = "sha256:4dfc4c277b6b97fa053899fcdb892d2dc27295851ab5fac4e07797b6a21b2e46"}, + {file = "tldextract-5.1.2.tar.gz", hash = "sha256:c9e17f756f05afb5abac04fe8f766e7e70f9fe387adb1859f0f52408ee060200"}, +] + +[package.dependencies] +filelock = ">=3.0.8" +idna = "*" +requests = ">=2.1.0" +requests-file = ">=1.4" + +[package.extras] +release = ["build", "twine"] +testing = ["black", "mypy", "pytest", "pytest-gitignore", "pytest-mock", "responses", "ruff", "syrupy", "tox", "types-filelock", "types-requests"] + +[[package]] +name = "tokenizers" +version = "0.19.1" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] + [[package]] name = "tomli" version = "2.0.1" @@ -4184,6 +5522,30 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "trafilatura" +version = "1.8.0" +description = "Python package and command-line tool designed to gather text on the Web, includes all necessary discovery and text processing components to perform web crawling, downloads, scraping, and extraction of main texts, metadata and comments." +optional = false +python-versions = ">=3.6" +files = [ + {file = "trafilatura-1.8.0-py3-none-any.whl", hash = "sha256:58ce230f987745537ce912ae8f3d182f11b921976a2bd2a8c248e5aca9ecc4ae"}, + {file = "trafilatura-1.8.0.tar.gz", hash = "sha256:ea54875ed24f3eafaf199b8a0f89b5835c7cf343733c32efbc4af9d3057a8f72"}, +] + +[package.dependencies] +certifi = "*" +charset-normalizer = {version = ">=3.2.0", markers = "python_version >= \"3.7\""} +courlan = ">=1.0.0" +htmldate = ">=1.8.0" +justext = ">=3.0.0" +lxml = {version = ">=4.9.4,<6", markers = "platform_system != \"Darwin\" or python_version > \"3.8\""} +urllib3 = {version = ">=1.26,<3", markers = "python_version >= \"3.7\""} + +[package.extras] +all = ["brotli", "cchardet (>=2.1.7)", "faust-cchardet (>=2.1.19)", "htmldate[speed] (>=1.8.0)", "py3langid (>=0.2.2)", "pycurl (>=7.45.3)"] +gui = ["Gooey (>=1.0.1)"] + [[package]] name = "traitlets" version = "5.14.3" @@ -4268,6 +5630,23 @@ files = [ {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] +[[package]] +name = "tzlocal" +version = "5.2" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, + {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, +] + +[package.dependencies] +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + [[package]] name = "uri-template" version = "1.3.0" @@ -4282,6 +5661,20 @@ files = [ [package.extras] dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] +[[package]] +name = "url-normalize" +version = "1.4.3" +description = "URL normalization for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, + {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, +] + +[package.dependencies] +six = "*" + [[package]] name = "urllib3" version = "2.2.1" @@ -4686,6 +6079,109 @@ einops = ["einops"] numba = ["numba (>=0.55)"] test = ["hypothesis", "packaging", "pytest", "pytest-cov"] +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + [[package]] name = "zenrows" version = "1.3.2" @@ -4718,4 +6214,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "d47fd4a29446442dd49732ce33eeef96fcb42f9dc552407b16662c6f6fdc34a2" +content-hash = "eb0901a5989ac5dd2b798b62cf774fcd440029d494827fd9bfe444001179ccf5" diff --git a/backend-python/pyproject.toml b/backend-python/pyproject.toml index ab584b74..a5c896a6 100644 --- a/backend-python/pyproject.toml +++ b/backend-python/pyproject.toml @@ -38,6 +38,8 @@ dash-vega-components = "^0.10.0" dash-treeview-antd = "^0.0.1" dash-bootstrap-components = "^1.6.0" number-parser = "^0.3.2" +litellm = "^1.37.16" +mediacloud-metadata = "^1.0.2" [tool.poetry.group.dev.dependencies] pytest = "^8.0.2" diff --git a/frontend-alpha/src/.observablehq/deploy.json b/frontend-alpha/src/.observablehq/deploy.json new file mode 100644 index 00000000..3a1ea6a0 --- /dev/null +++ b/frontend-alpha/src/.observablehq/deploy.json @@ -0,0 +1,5 @@ +{ + "projectId": "99db05473b8c4436", + "projectSlug": "media-impact-monitor", + "workspaceLogin": "davidpomerenke" +} diff --git a/frontend-alpha/src/components/util.js b/frontend-alpha/src/components/util.js new file mode 100644 index 00000000..434f89f7 --- /dev/null +++ b/frontend-alpha/src/components/util.js @@ -0,0 +1,25 @@ +import * as vega from 'npm:vega' +import ve from 'npm:vega-embed@6' + +const url = 'https://api.dev.mediaimpactmonitor.app' +// const url = 'http://localhost:8000' + +export const embed = async (spec, options) => { + // see https://observablehq.com/@mbostock/hello-vega-embed + const div = document.createElement('div') + div.value = (await ve(div, spec, options)).view + return div +} +embed.changeset = vega.changeset + +export const queryApi = (endpoint, query) => + fetch(`${url}/${endpoint}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(query) + }) + .then(res => res.json()) + .then(data => data['data']) + .catch(err => console.warn(err)) diff --git a/frontend-alpha/src/impacts.md b/frontend-alpha/src/impacts.md new file mode 100644 index 00000000..74a89f6f --- /dev/null +++ b/frontend-alpha/src/impacts.md @@ -0,0 +1,93 @@ +# Impact + +## Daily + +```js +import { embed, queryApi } from './components/util.js' + +let events = await queryApi('events', { + source: 'acled', + topic: 'climate_change' +}) +events = events + .filter(a => a.organizers.includes('Last Generation (Germany)')) + .slice(-100) + +const event_ids = events.map(a => a.event_id) +let impact = await queryApi('impact', { + cause: event_ids, + effect: { + trend_type: 'keywords', + media_source: 'news_online', + topic: 'climate_change' + }, + method: 'interrupted_time_series' +}) +display(html`${impact.method_applicability_reason}`) +``` + +```js +const spec_ = (topic, data_) => ({ + data: { values: data_ }, + layer: [ + { + mark: 'errorband', + encoding: { + x: { + field: 'date', + type: 'quantitative', + title: 'Days after protest', + axis: { values: { expr: '[-7,0,7,14,21]' } } + }, + y: { field: 'ci_lower', type: 'quantitative', title: '' }, + y2: { field: 'ci_upper', type: 'quantitative' } + } + }, + { + mark: { type: 'line', color: 'red' }, + encoding: { + x: { field: 'date', type: 'quantitative' }, + y: { + field: 'mean', + type: 'quantitative', + title: 'Number of additional articles' + } + } + } + ], + title: `Impact on ${topic}` +}) +for (const topic in impact.time_series) { + let data = impact.time_series[topic] + data = Object.keys(data) + .map(k => ({ day: parseInt(k), ...data[k] })) + .sort((a, b) => a.day - b.day) + display(await embed(spec_(topic, data))) +} +``` + +## Weekly + +```js +let impact_weekly = await queryApi('impact', { + cause: event_ids, + effect: { + trend_type: 'keywords', + media_source: 'news_online', + topic: 'climate_change', + aggregation: 'weekly' + }, + method: 'interrupted_time_series' +}) +display(html`${impact.method_applicability_reason}`) +``` + +```js +for (const topic in impact_weekly.time_series) { + let data = impact_weekly.time_series[topic] + data = Object.keys(data) + .map(k => ({ day: parseInt(k), ...data[k] })) + .sort((a, b) => a.day - b.day) + display(await embed(spec_(topic, data))) +} +``` diff --git a/frontend-alpha/src/index.md b/frontend-alpha/src/index.md index c8b4c6d1..bc666c58 100644 --- a/frontend-alpha/src/index.md +++ b/frontend-alpha/src/index.md @@ -1,34 +1,8 @@ # Media Impact Monitor ```js -import * as vega from 'npm:vega' -import ve from 'npm:vega-embed@6' +import { embed, queryApi } from './components/util.js' -const url = 'https://api.dev.mediaimpactmonitor.app' -// const url = 'http://localhost:8000' - -const embed = async (spec, options) => { - // see https://observablehq.com/@mbostock/hello-vega-embed - const div = document.createElement('div') - div.value = (await ve(div, spec, options)).view - return div -} -embed.changeset = vega.changeset - -const queryApi = (endpoint, query) => - fetch(`${url}/${endpoint}`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(query) - }) - .then(res => res.json()) - .then(data => data['data']) - .catch(err => console.warn(err)) -``` - -```js let events = await queryApi('events', { source: 'acled', topic: 'climate_change' @@ -43,25 +17,64 @@ events = events.map(a => ({ ``` ```js -const media_sources = ['news_online', 'web_google'] -// const media_source = view( -// Inputs.select(media_sources, { -// value: 'news_online', -// label: 'Media data source' -// }) -// ) +const media_sources = { + news_online: 'coverage of climate in german online news', + news_print: 'coverage of climate in german print news', + web_google: 'google search volume in germany' +} +const media_source = view( + Inputs.select(Object.keys(media_sources), { + value: 'news_online', + label: 'Media data source' + }) +) ``` ```js -let trends = media_sources.map(source => - queryApi('trend', { - trend_type: 'keywords', - media_source: source, +const trend_plot = (trend, title) => ({ + data: { values: trend }, + width: 600, + height: 100, + title: title, + mark: { type: 'line', interpolate: 'step-after' }, + encoding: { + x: { + field: 'date', + type: 'temporal', + axis: { title: null }, + scale: { domain: { selection: 'brush' } } + }, + y: { + field: 'n_articles', + type: 'quantitative', + axis: { title: 'Number of articles' } + }, + color: { + field: 'topic', + type: 'nominal' + } + } +}) + +const keyword_trend = await queryApi('trend', { + trend_type: 'keywords', + media_source: media_source, + topic: 'climate_change' +}) +const trend_plots = [trend_plot(keyword_trend, media_sources[media_source])] +if (media_source === 'news_online') { + const sentiment_trend = await queryApi('trend', { + trend_type: 'sentiment', + media_source: media_source, topic: 'climate_change' }) -) -trends = await Promise.all(trends) -const trend = trends[0] + trend_plots.push( + trend_plot( + sentiment_trend, + media_sources[media_source].replace(/coverage of/, 'sentiment of') + ) + ) +} // display(Inputs.table(trend)) ``` @@ -83,7 +96,7 @@ const spec = { select: { type: 'interval', encodings: ['x'] }, value: { x: [ - { year: 2023, month: 'jan', date: 1 }, + { year: 2022, month: 'jan', date: 1 }, { year: year, month: month, date: lastDay } ] } @@ -150,108 +163,9 @@ const spec = { ] } }, - { - data: { values: trends[0] }, - width: 600, - height: 100, - title: 'coverage of climate in german online news', - mark: { type: 'line', interpolate: 'step-after' }, - encoding: { - x: { - field: 'date', - type: 'temporal', - axis: { title: null }, - scale: { domain: { selection: 'brush' } } - }, - y: { - field: 'n_articles', - type: 'quantitative', - axis: { title: 'Number of articles' } - }, - color: { - field: 'topic', - type: 'nominal' - } - } - }, - { - data: { values: trends[1] }, - width: 600, - height: 100, - title: 'google search volume in germany', - mark: { type: 'line', interpolate: 'step-after' }, - encoding: { - x: { - field: 'date', - type: 'temporal', - axis: { title: null }, - scale: { domain: { selection: 'brush' } } - }, - y: { - field: 'n_articles', - type: 'quantitative', - axis: { title: 'Number of articles' } - }, - color: { - field: 'topic', - type: 'nominal' - } - } - } + ...trend_plots ], resolve: { scale: { color: 'independent', size: 'independent' } } } display(await embed(spec)) ``` - - diff --git a/notebooks/2024-04-12-david-impact-api.ipynb b/notebooks/2024-04-12-david-impact-api.ipynb index 4ad0abb4..45e0dca2 100644 --- a/notebooks/2024-04-12-david-impact-api.ipynb +++ b/notebooks/2024-04-12-david-impact-api.ipynb @@ -1,457 +1,513 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "import requests" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Settings:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "topic = \"climate_change\"\n", - "organizers = [\"Last Generation (Germany)\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'event_id': '9064cc0660a50363ec2d44a8fe51b376',\n", - " 'event_type': 'protest',\n", - " 'source': 'acled',\n", - " 'date': '2023-12-15',\n", - " 'organizers': ['Last Generation (Germany)'],\n", - " 'description': 'On 15 December 2023, about 15 Last Generation activists blocked streets at various places across Koln (Nordrhein-Westfalen), demanding immediate climate change. Law enforcers quickly removed them and resumed traffic.'}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } + "cells": [ + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import requests" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Settings:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "topic = \"climate_change\"\n", + "organizers = [\"Last Generation (Germany)\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'event_id': '4524f849805e1de77fa8624267f83129',\n", + " 'event_type': 'protest',\n", + " 'source': 'acled',\n", + " 'date': '2023-12-09',\n", + " 'organizers': ['Fridays for Future'],\n", + " 'description': 'On 9 December 2023, 25 members of FFF demonstrated at Schillerplatz in Saarbrucken (Saarland) against the influence of the fossil fuel industry at the COP28 in Dubai. They called for an effective phase-out plan for oil, coal, and gas, as well as the implementation of a global goal for the expansion of renewable energies.'}" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res = requests.post(\n", + " # \"https://api.dev.mediaimpactmonitor.app/events\",\n", + " \"http://localhost:8000/events\",\n", + " json={\n", + " \"event_type\": \"protest\",\n", + " \"source\": \"acled\",\n", + " \"start_date\": \"2023-07-01\",\n", + " \"end_date\": \"2023-12-31\",\n", + " \"organizers\": [\"Fridays for Future\"],\n", + " },\n", + ")\n", + "events = res.json()[\"data\"]\n", + "event_ids = [event[\"event_id\"] for event in events]\n", + "events[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import altair as alt\n", + "\n", + "df = pd.DataFrame(events)\n", + "df[\"organizer\"] = df[\"organizers\"].apply(lambda x: x[0] if x else \"nooo\")\n", + "df[\"y\"] = np.random.normal(loc=0, scale=1, size=len(df))\n", + "df[\"participants\"] = np.random.randint(100, 1000, size=len(df))\n", + "df.head()\n", + "\n", + "alt.Chart(df).mark_circle().encode(\n", + " x=\"date:T\", # T: temporal\n", + " y=\"y:Q\", # Q: quantitative\n", + " color=\"organizer:N\", # N: nominal\n", + " size=\"participants:Q\", # Quantitative size encoding\n", + ").properties(width=600, height=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "res = requests.post(\n", + " # \"https://api.dev.mediaimpactmonitor.app/trend\",\n", + " \"http://localhost:8000/trend\",\n", + " json={\n", + " \"trend_type\": \"keywords\",\n", + " \"media_source\": \"news_online\",\n", + " \"topic\": \"climate_change\",\n", + " \"query\": '\"Letzte Generation\"',\n", + " \"start_date\": \"2023-01-01\",\n", + " \"end_date\": \"2023-12-31\",\n", + " },\n", + ")\n", + "data = res.json()[\"data\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(list(data.items()), columns=[\"date\", \"value\"])\n", + "df[\"date\"] = pd.to_datetime(df[\"date\"]) # Convert the date column to datetime type\n", + "\n", + "alt.Chart(df).mark_line(point=True).encode(\n", + " x=\"date:T\", # T: temporal\n", + " y=\"value:Q\", # Q: quantitative\n", + " tooltip=[\"date\", \"value\"],\n", + ").properties(width=600, height=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "from media_impact_monitor.data_loaders.web.google_trends import get_google_trends_counts\n", + "\n", + "# df = get_google_trends_counts(\"Letzte Generation\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from media_impact_monitor.trend import get_trend\n", + "from media_impact_monitor.types_ import TrendSearch\n", + "\n", + "df = get_trend(\n", + " TrendSearch(\n", + " trend_type=\"keywords\",\n", + " media_source=\"web_google\",\n", + " start_date=\"2023-07-01\",\n", + " end_date=\"2023-12-31\",\n", + " query='\"Fridays for Future\"',\n", + " )\n", + ")\n", + "df.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "11e0834a5dbf40f4935d8e38b406f0e8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/121 [00:00" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGdCAYAAAA8F1jjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABGtklEQVR4nO3deXDb9Z0//ufno9OHJJ+yLUtJyH07sRNCCg1XIEAOQg46/XYZ2u0fux1Kh9LtDN3Zgbb769BOd7vd2TI7250ezHQLIUBICDQhBAhpCTns2Ekc27njQ5Z8W5Jt3fr9IduxEzvxIen9kfR8zHggPl92Yuvpz+f1er+kSCQSAREREZECyaILICIiIhoPgwoREREpFoMKERERKRaDChERESkWgwoREREpFoMKERERKRaDChERESkWgwoREREpllp0AdMVDodht9thMBggSZLocoiIiGgCIpEI3G43LBYLZHn86yZJH1TsdjtsNpvoMoiIiGgKmpqaYLVax3150gcVg8EAIPqJGo1GwdUQERHRRLhcLthstuHH8fEkfVAZut1jNBoZVIiIiJLMndo22ExLREREisWgQkRERIrFoEJERESKxaBCREREisWgQkRERIrFoEJERESKxaBCREREisWgQkRERIrFoEJERESKxaBCREREisWgQkRERIrFoEJERESKxaBCREREisWgQkSK5A+GUdfqQlefX3QpRCSQWnQBRERDQuEIrnX2ocHhxpV2DwKhCLRqGRuWFGOuOVt0eUQkAIMKEQkViUTQ0jOABocbF9s8GPCHRr3cHwxj/xk77r4rD2tn50OSJEGVEpEIDCpEJES724cGhxv1Dhfc3uBtXzcSAY5f6UK724cNS4qh16gSVCURicagQkQJ0zsQQIPDjQaHCx2eyfeeXGnvw5snGrG5zIL8bF0cKiQipWFQIaK4GvCHcMHpRoPDDXvvACKR6b2/7v4A3jzZxL4VojTBoEJEMecPhnGlw4P6Vjcau/oRCk8znYzx/vefsePuWXlYO4d9K0SpjEGFiGIiPHJip6MP/mA4rh8vEgGOX+1Cu4d9K0SpjEGFiKYsEonA3utFg8OFC85bJ3YSgX0rRKmNQYWIJq3D40N9qxsNTjdcAwHR5YzoWynCXLNBdDlEFEMMKkQ0IS5vYHCc2I0Ot090ObeI9q20YvUsH77CvhWilMGg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iCjJZQ+GFWNG6oUVBhUiIqIUYNRrsKPCCoNeLbqUmGJQISIiShGmjGhYydalTlhhUCEiIkohOZlabK+wIkunEl1KTDCoEBERpZi8LC22lVuRoU3+sMKgQkRElIIKsnXYVl4KvSa5wwqDChERUYoyG/TYVl4KnSZ5H+6Tt3IiIiK6oyKjHk+tLIVWnZwP+clZNREREU1YiSkDW5M0rCRfxURERDRppTkZ2FJmgUYliS5lUhhUiIiI0oQtLxObyyxQy8kTVhhUiIiI0sjM/CxsXF4CVZKEFQYVIiKiNDO7MBtPLCuBLCk/rDCoEBERpaG55mw8vqxY8WGFQYWIiChNzS8y4NElRVByVmFQISIiSmOLSoxYv0i5YYVBhYiIKM0tLTXh4YXKDCsMKkRERIRlVhMeWGAWXcYtGFSIiIgIALDCloN18wtElzEKgwoRERENq5iZh3vnKiesMKgQERHRKHfflYd7ZueLLgMAoBZdABERESnP2jn5CEciostgUCEiIqKx3Tu3AG5vQGgNvPVDRERE4zLoNUI/PoMKERERKRaDChERESkWgwoREREpFoMKERERKRaDChERESkWgwoREREpFoMKERERKRaDChERESkWgwoREREpFoMKERERKRaDChERESkWgwoREREpFoMKERERKRaDChERESmWWnQB0xWJRAAALpdLcCVEREQ0UUOP20OP4+NJ+qDidrsBADabTXAlRERENFlutxsmk2ncl0uRO0UZhQuHw7Db7TAYDJAkKabv2+VywWazoampCUajMabvWwn4+SW/VP8c+fklv1T/HPn5TV0kEoHb7YbFYoEsj9+JkvRXVGRZhtVqjevHMBqNKfkPcAg/v+SX6p8jP7/kl+qfIz+/qbndlZQhbKYlIiIixWJQISIiIsViULkNnU6HV155BTqdTnQpccHPL/ml+ufIzy/5pfrnyM8v/pK+mZaIiIhSF6+oEBERkWIxqBAREZFiMagQERGRYjGoEBERkWIxqIxDkqQxn375y1+KLo0m6LXXXsOsWbOg1+uxZs0anDhxQnRJNEGzZs0a8/vvueeeE10ajeHzzz/H5s2bYbFYIEkS3nvvvXFf9x//8R8hSRJ+/etfJ6w+urNXX30Vq1evhsFggNlsxtatW9HQ0DDqdX7729/igQcegNFohCRJ6OnpSUhtDCrjaG1tHfX0+9//HpIkYfv27aJLownYtWsXXnzxRbzyyiuoqqpCWVkZNmzYgLa2NtGl0QScPHly1PffoUOHAAA7d+4UXBmNpa+vD2VlZXjttddu+3p79uzBl19+CYvFkqDKaKKOHDmC5557Dl9++SUOHTqEQCCARx99FH19fcOv09/fj8ceewz//M//nNDaOJ48QVu3boXb7cbhw4dFl0ITsGbNGqxevRq/+c1vAER3QtlsNjz//PN46aWXBFdHk/XCCy9g//79uHjxYsx3elFsSZKEPXv2YOvWraOe39LSgjVr1uDgwYPYuHEjXnjhBbzwwgtCaqQ7a29vh9lsxpEjR7Bu3bpRL/vss8/w4IMPoru7Gzk5OXGvhVdUJsDpdOKDDz7At7/9bdGl0AT4/X5UVlZi/fr1w8+TZRnr16/HsWPHBFZGU+H3+/GnP/0Jf//3f8+QkqTC4TCeeeYZ/PCHP8SSJUtEl0MT0NvbCwDIy8sTXAmDyoS8/vrrMBgM2LZtm+hSaAI6OjoQCoVQVFQ06vlFRUVwOByCqqKpeu+999DT04NvfvObokuhKfrFL34BtVqN733ve6JLoQkIh8N44YUXcO+992Lp0qWiy2FQAYD/+7//Q3Z29vDT0aNHR73897//Pb7xjW9Ar9cLqpAoff3ud7/D448/zr6GJFVZWYn//M//xB//+EdeEUsSzz33HM6dO4c333xTdCkAALXoApRgy5YtWLNmzfCfS0tLh///6NGjaGhowK5du0SURlNQUFAAlUoFp9M56vlOpxPFxcWCqqKpuH79Oj7++GO8++67okuhKTp69Cja2towY8aM4eeFQiH84Ac/wK9//Wtcu3ZNXHF0i+9+97vYv38/Pv/8c1itVtHlAGBQAQAYDAYYDIYxX/a73/0OFRUVKCsrS3BVNFVarRYVFRU4fPjwcENfOBzG4cOH8d3vfldscTQpf/jDH2A2m7Fx40bRpdAUPfPMM6P6xQBgw4YNeOaZZ/Ctb31LUFV0s0gkgueffx579uzBZ599hrvuukt0ScMYVG7D5XJh9+7d+Pd//3fRpdAkvfjii3j22WexatUq3H333fj1r3+Nvr4+/mBMIuFwGH/4wx/w7LPPQq3mjyol83g8uHTp0vCfr169iurqauTl5WHGjBnIz88f9foajQbFxcVYsGBBokulcTz33HP485//jL1798JgMAz385lMJmRkZAAAHA4HHA7H8N/12bNnYTAYMGPGjPg23UZoXP/zP/8TycjIiPT09Iguhabgv/7rvyIzZsyIaLXayN133x358ssvRZdEk3Dw4MEIgEhDQ4PoUugOPv300wiAW56effbZMV9/5syZkf/4j/9IaI10e2P9/QGI/OEPfxh+nVdeeeWOrxMPPEeFiIiIFItTP0RERKRYDCpERESkWAwqREREpFgMKkRERKRYDCpERESkWAwqREREpFgMKkRERKRYDCpERESkWAwqREREpFgMKkRERKRYDCpERESkWAwqREREpFj/P4WZqj6ag1mRAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "pd.Series(data[\"impact_mean\"]).plot()\n", + "plt.fill_between(\n", + " pd.Series(data[\"impact_mean\"]).index,\n", + " pd.Series(data[\"impact_mean_lower\"]).values,\n", + " pd.Series(data[\"impact_mean_upper\"]).values,\n", + " alpha=0.5,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "impacts__ = pd.Series(\n", + " [list(ts.values())[4 + 14] for ts in data[\"individual_impacts\"].values()]\n", + ")\n", + "print(impacts__.describe())\n", + "impacts__.hist(bins=50)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.stats import normaltest\n", + "\n", + "normaltest(impacts__)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Small p-value means that it's likely not normal. (However, large p-value does not mean anything, e. g. it can be due to small sample size.)\n", + "See https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.normaltest.html." + ] + } ], - "source": [ - "res = requests.post(\n", - " # \"https://api.dev.mediaimpactmonitor.app/events\",\n", - " \"http://localhost:8000/events\",\n", - " json={\n", - " \"event_type\": \"protest\",\n", - " \"source\": \"acled\",\n", - " \"topic\": \"climate_change\",\n", - " \"start_date\": \"2023-07-01\",\n", - " \"end_date\": \"2023-12-31\",\n", - " \"topic\": topic,\n", - " \"organizers\": organizers,\n", - " },\n", - ")\n", - "events = res.json()[\"data\"]\n", - "event_ids = [event[\"event_id\"] for event in events]\n", - "events[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import altair as alt\n", - "\n", - "df = pd.DataFrame(events)\n", - "df[\"organizer\"] = df[\"organizers\"].apply(lambda x: x[0] if x else \"nooo\")\n", - "df[\"y\"] = np.random.normal(loc=0, scale=1, size=len(df))\n", - "df[\"participants\"] = np.random.randint(100, 1000, size=len(df))\n", - "df.head()\n", - "\n", - "alt.Chart(df).mark_circle().encode(\n", - " x=\"date:T\", # T: temporal\n", - " y=\"y:Q\", # Q: quantitative\n", - " color=\"organizer:N\", # N: nominal\n", - " size=\"participants:Q\", # Quantitative size encoding\n", - ").properties(width=600, height=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "res = requests.post(\n", - " # \"https://api.dev.mediaimpactmonitor.app/trend\",\n", - " \"http://localhost:8000/trend\",\n", - " json={\n", - " \"trend_type\": \"keywords\",\n", - " \"media_source\": \"news_online\",\n", - " \"topic\": \"climate_change\",\n", - " \"query\": '\"Letzte Generation\"',\n", - " \"start_date\": \"2023-01-01\",\n", - " \"end_date\": \"2023-12-31\",\n", - " },\n", - ")\n", - "data = res.json()[\"data\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = pd.DataFrame(list(data.items()), columns=[\"date\", \"value\"])\n", - "df[\"date\"] = pd.to_datetime(df[\"date\"]) # Convert the date column to datetime type\n", - "\n", - "alt.Chart(df).mark_line(point=True).encode(\n", - " x=\"date:T\", # T: temporal\n", - " y=\"value:Q\", # Q: quantitative\n", - " tooltip=[\"date\", \"value\"],\n", - ").properties(width=600, height=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "res = requests.post(\n", - " # \"https://api.dev.mediaimpactmonitor.app/impact\",\n", - " \"http://localhost:8000/impact\",\n", - " json={\n", - " \"cause\": event_ids,\n", - " \"effect\": {\n", - " \"trend_type\": \"keywords\",\n", - " \"media_source\": \"news_online\",\n", - " \"query\": '\"Klima*\"',\n", - " },\n", - " \"method\": \"interrupted_time_series\",\n", - " },\n", - ")\n", - "data = res.json()[\"data\"]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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kQgvaWSCVocPr3zSxLBDRETnJXsLz0cffYS1a9di4cKFiEQiePjhh7FixQocOHAAWVlZieN+9KMf4fHHH088NhgMifvRaBSrVq2C1WrF7t270dHRgTvuuANqtRpPPfXUmH4eGlufnuhF3TFewiIioguTPfC89957/R6/9NJLKCoqwhdffIGlS5cm9hsMBlit1gFf44MPPsCBAwewY8cOWCwWzJ07F0888QQefPBBPProo9BoNKP6GUgeuw53Yk+zU+4yiIgoBch+SetsLpcLAJCXl9dv/yuvvIKCggJUVVVh48aN8Pl8iefq6uowa9YsWCyWxL7a2lqIooj9+/ef8x7BYBCiKPbbKHVIkoS/HLIz7BAR0ZDJ3sJzplgshvvvvx9XXHEFqqqqEvu/+93vorKyEiUlJdi7dy8efPBBHD58GG+88QYAwGaz9Qs7ABKPbTbbOe+zefNmPPbYY6P4SWi0SJKEHQc70dDmkrsUIiJKIUkVeNauXYuGhgb8/e9/77f/xz/+ceL+rFmzUFxcjK997Ws4duwYJk6cOOz32bhxI9avX594LIoiysvLL75wGhOxmIQPDthxsIMtckRENDxJc0nr3nvvxTvvvIMPP/wQZWVlFzy2uroaANDY2AgAsFqtsNvt/Y459Xigfj9arRYmk6nfRsktFpPw3n4bww4REV0U2QOPJEm499578cc//hF/+ctfMH78+EF/pr6+HgBQXFwMAKipqcG+ffvQ2dmZOGb79u0wmUyYMWPGqNRNYycak7BtXwcO29xyl0JERClK9ktaa9euxauvvoq33noLRqMx0efGbDZDr9fj2LFjePXVV/GNb3wD+fn52Lt3L9atW4elS5di9uzZAIAVK1ZgxowZuP322/GLX/wCNpsNmzZtwtq1a6HVauX8eHSJItEYtu3r4JpYRER0SQRJkncCE0EQBty/detW3HXXXWhpacFtt92GhoYGeL1elJeX48Ybb8SmTZv6XYpqamrCmjVrsGvXLmRlZeHOO+/E008/DZVq8EwniiLMZjNcLhcvbyWRcDSGd/a242S3b/CDiYgoaenUSqxZNvw+t4MZzve37IEnGTDwJJ9QJIa3v2pHSy/DDhFRqkuGwCP7JS2iswUjUby1px1tTr8s7x+KxOAJRuAJRuDtuz3zfiAcg06tgF6tjG8aJXR9t2fu06uV0KoU523FJCKiscPAQ0klEI7izT1t6HAFRu09JElCuzOAbm+wf6AJROEJRhCKxgZ9DdcQs5ggADqVEoa+UGTSqZCfrUV+tgb5WRpka1UMREREY4CBh5JGIBzFG1+2wS6OXthpc/qxu7Eb7YMEKo1SgSytEtlaFbJ1KmRrVcjSxm91KiWCkSj84b4tFL8NhGOJ+/5QFKFoDJKExHEA0AYAOD3aTKtSID9LkwhBBVnxW51aOWrngIgoEzHwUFLwhSJ448s2dLmDo/L63Z4gdh/rSayorlQIqMwzJMLMmYEmW6uCRnXpMzZEYxIC4Sh8oWji1uUPo9sTRI83BIcvhGAkhnZX4JwAlq1V9QWhvjCUpUm0EqkUAluFAMQkCf5Q/Lz6QhEEIzEIAqAQhL4tPijizNtTz50+rv9zSkXfzyoApcDzTJROGHhIdmIgjDf3tKHHExrx13b5w/j4eA8O9c3hIwjAzGITqsfnI1s3ur/+SoWArL4gNZBILAaHN4webxDdnhB6+oKQO3D6MlvTAJ22lQoBOrUCOrUSOpXy9P2+/kPavv5FZz6n1yihSIEvb0mSEI5K8IYi8AXjQcYbisIbjMAXisb3h6LwBSPwhaMY7SEXAgCFQoDyVCjqC0TxYBTviFlVasZUixFKRfKfX6JMxsBDsml3+vFVixNHOz2Ixkb2m8sbjOCzk73Y1+bCqZeeXJSNmon5yDVoRvS9LpZKoUChUYtCY/+5ooKRKHo8IfR4+0KQJ4ReXwiBcBQxKd5y5A1G4Q1Gh/xeAuJfzgZNfNNrlDBoVInHp+7rNUoY1EqolAO3cEmSlKghGpMQicXOuC8l7odjMYQjEsLRWN8mIRSNIRyJPw717ev3fCS+f7i/C3q1EllaJbQqZaK+mCRBOus21vecdNbtmc+d83nR91lxvprC6HAFUHesB/MrclBVaob6POeOiOTFwENjKhqTcNjmRn2Lc1T66gQjUXzZ5MSeFgfC0fiXVEWeAYsn5sNi0o34+40GrUqJkhw9SnL0/fafav0IhOOXyPzhKIKRWPw2fOr2dH+iQCTad2wMEk73JeoZwhyOGqUCek08QJwdZsZiHgu1UkCWRgWDVhm/1Shh0KqQpVH2269XK6EYoZYVqS8cRU8FoFg8DEVjpwPR6fvx59tdftS3OOEJRvDXo9349GQv5pTlYE55DvTsh0WUVBh4aEx4ghHsbXFiX5sLvtDQWyaGKhKNYW+bC5+d7EUgHB9lZTFpsXhiASryDCP+fnIQBAEalQCNSgGTXj3kn4vFJPjDp/u6+ENR+M547AtF+/WFiUlAKBpDyD/4aDWFEG+pUiqExKbqu9WoFFArFVArBWiUffdVir77Qt9zfc/3HatRxi/BjUQfquESTvXtwdADVGmuHvPKc3Cww40vmh1w+cP45EQvvmhyoKrUjPkVOTDqhv7fiohGDwMPjaq2vstWjaNw2QqIf5kftIn4+HgvPMEIACDXoEbNxHxMKsxmp1PE+52c7kt04aVWJElCMBJLdLQ+1V/lzCBz5n2eX0ClVGBWmRkzS0xo7PLg85MOdHmCqG9xYm+rE1OtRlxWmYe8rOS4lEqUqRh4aMRFojEctscvW3WKozPqCgCae3346HAXen3xzs7ZWhWqJ+RhhtU0Ypc5Mo0gCIkO0DQ8CoWAKRYjJhdlo7nXh89POtDq9ONghxsHO9yYWJiFyyrzYDWnxqVVonTDwEMjxh0IY2+rCw2jdNnqlJgk4dMTvfjkRC8AQKdSYOG4PMwuM5+3sy3RWBEEAZX5WajMz0KHy48vmhw41uVNbGU5elw2LhcVeQa2kBGNIQYeuiRd7iBO9nhxotuLDmcAsVEeJ+wLRfD+fjua+4ZrV5WYsGRyAbQqtkhQ8ik26/HN2Xr0ekP4osmBQzYRrU4/Wuv98b5YOhVMOjVMOjWM+vh9o04Fk14NHZclIRpRDDw0LOFoDM29PpzsjoccdyAyZu/d7vTjzw02eIIRqBQCrplWhOnFXOyVkl9elgZfn2HB5RPysKfZiYZ2F0KRGLo9IXSfZ/4ptVI4HYB0apj0Z96Pj1AbrUAkSRI8wQgcvjAcvhC8wQjyDBpYzDrk6NUMYpSSGHhoUC5fGMe7PTjZ40Vrrx+RUeh8fCGSJKG+xYm/N3YjJsU7JX9jVjEKsi/cAZco2Rh1aiydUojFE/Ph8ofhDkQgBsIQAxG4/fFbMRCGLxRFOCrF52LyXiAQ6dUw94Uhk04Fsz5+36xXD2k+oHA0BocvBIc3HmziWxhOXygxrcPZNCoFLEYtLCZd36blmnCUEhh46BzRmIQ2hx8nerw42e1F73n+4I6FYCSKHQc60djlARCfPHD5dIssw5aJRopKqehbP23g0B6JxuAORiCeGYr8p8JRGN5gXyDyhM47Q7lerewLQPFWIbNejUhMgsN7OticGtk4EEEAzDo1crM0yNIo0eMNodMdRCgSQ4vDjxbH6RV0DRplPPycEYT0Gl5mpuTCwEMJ7kAYdcd6cLTTg1Bk8DlYRluXO4ht+zrg8oehEIClkwsxu8zMf0lS2lMpFcg1aM47K3gkGoM7EIErEIboD8PlPx2IXP5wYkJKfzgKm3jh99KrlcgxqOPvl6VOvK9Zrz5nuYxoTEKvNwS7GIBNDMAuBtDjDcEXiuJE32XuU0w6FSwmHcYXZGGa1cj/b0l2DDyEcDSGL5oc+KLJkRRBBwD2t7vw4eEuRGMSjDoVvlFVzOG8RH1USgVyszTIPc/cPsFwtC8MRfrCUBiuQBgqhYAcgwa5iYCjGdaM0EqFkFgOparUDCD+96PLHYRdDMDed+v0nbo858HRTg+O2N34+gwLDBp+5ZB8+NuX4Q7b3Pjb0a4x7Xx8IZFoDB8e7sKBjvg/SyvzDaidaeU0/UTDoFUrUaRWosg4+u+lVirOWQolGI7C7g6izeHHF80OnOzx4ZVPmvH1GRaMy88a/aKIBsDAk6HsYgAfHe5Cm9M/+MFjxOEL4d19Hej2hCAAuHxCPhaOy2VTOFGK0aqVqMgzoCLPgMmWbLzXYEOPN4S36tsxtzwHV0zM55xZNOYYeDKMJxjBPxq7cbBDxChPmTMsRzvd2HGgE6FoDHq1EiurrGmzBhZRJivI1uI7C8vx98ZufNXqQn2LE60OH1bOtJ630zbRaGDgyRCRaAxfNjvx2cnepOmnI0kSHL4w9rY68VWrCwBQYtbh2qpiZOv4q0mULlRKBZZNLUJlfha2H7Cj2xPC//usBVdOLsDsUg5EoLHBb5UMcMTuxt+OdkP0h+UuBcFIFC29fjT1eNHU6+vXd2h+RQ4WTyw4Z2QIEaWH8QVZ+F51BbYftKOpx4ddh7vQ1OPD8ulF7NBMo46/YWmsUwxg15EutDnk66cjSRK6PEE09fjQ1ONDh8uPM+ctVCoElOboMafcjAkF2bLVSURjI0urwg1zSlDf4sQ/GntwotuLVz5pxooZFlSyQzONIgaeNBOJxmATAzjQLuKATP10/KEomnt9iVacsxcSzTGoMS4vC5X5BpTm6oc0IywRpQ9BEDCvIhdluQa8t9+GXm8Ib9a3Y155DhZPyodKwb8JNPIYeFJcIBxFu9OPdmcA7U4/bGIA0TFc+iEcjSXm+bC7g2jq8cIuBvsdo1YKKM81oDLfgMr8LJj16jGrj4iSV6FRi1sXluNvR7uxt82FPS1OtDh8uLaqGHnnmWOI6GIx8KQYTzCCNocf7U4/Wp1+9HiCo9qKE41JcPet9ZOY0fWMCc384eiAP1eQrUFlfhYq8wwoydEnVb8ctVJARX4W1AoBnmAEnmAE3mDkvGsHEdHoUSkVuHpaESrzDdhxsDPeofnTZlw5uQCz2KGZRhADT5Lr9Ybi4aYv5LhGseOxwxdCY6cHTt/pYOMJRDBYDNCqFDDp1cg1qFGRZ0BlXlbSjbLSqhWYUJCFSUXZqMzPGvAyWiAcjQegQKRfEDrzvi8UTarh/ETpYkJhNr5n0uGDA3Y09/rw4eEu7G1zYVapGdOsRmhVnHyULk1yfSsRgPhlooY2F75sdo76yKpgJIqjdg8OdIjocAUGPEapEGDSqfqvzKxXJe7rknQW5CytEhMKsjGpKBvleYZBW5l0aiV0auUFV2GPxiQ4fSEc6/LiiN2NLnfwvMcS0fBkaVVYPbcEe1qcqDvWgx5PCLsOd+Efjd2YajFidlkOCo2cu4cuDgNPEgmEo/iqxYk9LU74QwNfKhoJMUlCq8OPAx0ijnV6EOnr8yMAqMg3oMSs77fCskGjTJlmZZNejUlF2ZhYmIXSHP2I161UCIlVrheNz4PDG0qsFcTwQ3TpBEHA/IpczCg24ZDNjb2tTjh8YTS0i2hoF2E16TC7zIzJRdmcrZmGRZAkNtCLogiz2QyXywWTyTTm7+8JRvBlkwP72lyjOimgwxfCwQ4RBzvc8ARPz3+TZ9BgeokR06wmZGtTLwPnZ2swqTDeklNkkm+BUacvhCN2D452utEpMvwQjQRJktDm9GNfqwuNXZ7EtBY6lQLTS0yYVWo+76rylDx0aiXWLJs44q87nO/v1Pt2SyNOXwifn3TgYIeYaGUZaee7ZKVVKTDFYsSMYhMsJm3KtOCcaYrFiMsn5CXN9PQ5Bg0Wjc/DovF5cPpOt/ww/BBdPEEQUJZrQFmuAd5gBPs7RDS0ueAORLCn2Yk9zU6U5+oxqyw+l1cyDZCg5JJWgec3v/kNnnnmGdhsNsyZMwe/+tWvsGjRIrnLOkenO4DPTzpw1O5BbBQa2KKx+L+IDrSLaOzyJIapC4ivPj692IQJBVkp2xxckqPD0imFKDbrBz9YJjkGDRaOy8PCcQw/RCMlS6vConF5uKwyF009PuxtdeJkjw8tDj9aHH5kaZSYWWJGVakJRh2nv6D+0uaS1muvvYY77rgDL7zwAqqrq/Hcc8/h9ddfx+HDh1FUVHTBnx2rS1qtDh8+P+nAiW7vkI4PhKPwh6IIRKIIhmOJ22DkzPtRBM64DUViCEX7XxbLM2gwo8SEqVZjSl6yOsWsV+PKyQWYbDHKXcpF6xQD2NPixBGbe9Ra9YgyiegPo6HdhYY2MTFNhlIhYGFlLhaMy+UkhkkiGS5ppU3gqa6uxsKFC/HrX/8aABCLxVBeXo777rsPDz300AV/drQDz/EuDz4/6UCb8/xLPEiSBDEQQZvTjzaHH22XOARdq1JgqsWI6SUmWIypecnqFJ1aiUXj8zC3PCdtmqt9oQj2tbqwt9XVrz8VEV2caEzCsS4Pvmpxor3v8n2uQY1rphWhLNcgc3WUDIEndf+5f4ZQKIQvvvgCGzduTOxTKBRYvnw56urqzjk+GAwiGDx9aUEUxVGt709fdZxz6UqSJDh9YbT1TSDY5vAP+MWnUSqgVSugUymhVSugVSmgUyuhVSmgVSuhUymgVSmhU8dvterTzytSOOQA8X+lzS4z4/IJ+Uk79P1iGTQqVE/Ix2Xj8tDY6UF9iwPtzoGnBSCiwSkVAqZYjJhclI0jdg/+erQLDl8Y/9+XbZhebMSVkwqh16TX3xEanrQIPN3d3YhGo7BYLP32WywWHDp06JzjN2/ejMcee2ysygMQDzg93lCi9abN6T9njSmFABQZdSjN1aM0R4+SHF3GTrY1qSgbV04uQE6aj75QKgRMtRox1WqEzRVAfYsDR+yeMV0ehCidCEL8/6lx+Qb841gP9rW5cLDDjRNdXiyZXIAZxaaUbvGmi5cWgWe4Nm7ciPXr1ycei6KI8vLyEX8fly+M179owdtftaHN4UfgrCHnSoUAq0mH0hw9SnP1KDbrMn4hTas53iG5NCd5OySPFqtZh5XmYlw5OYK9rS7sa3PCGxy9+ZiI0plWrcQ104owvdiIvxyKL1mx42AnDna4cc20Iq7VlYHSIvAUFBRAqVTCbrf322+322G1Ws85XqvVQqsdm6HMT757MLEUgVopoNgcb70pzdHDYtayQ10fk16NKyblY6rFmPH/+srSqlAzMR+LxufhiN2N+hYnbOeZBZuILqzYrMd3FlagvsWJj4/3oM3pxyufNGFBZS4WjctL2dGqNHxpEXg0Gg0WLFiAnTt3YvXq1QDinZZ37tyJe++9V7a6zAY17ri8Ese7vCjJ0aPQqE2bTreXIlurglkfX5Yix6BGrkGDiYWpO0x+tCgVAqYXmzC92IQOlx/720Qc6XQjGB69ySmJ0pFSIWBBZS4mF2Vj15EunOj24rOT8cvHV08tRGV+ltwl0hhIm1Far732Gu68807813/9FxYtWoTnnnsOf/jDH3Do0KFz+vacbbRHaT2/4+iozLcz0hSCgByDGoIARKISIrEYIjEJ0ag0rCHUSoUAs159ejOo+z3O9Mt2lyIcjeFYlwf720S0OHxcyJRomCRJwrEuLz460pUYKDLFko2lkwuRlcLTdiQ7jtIaQbfccgu6urrw85//HDabDXPnzsV77703aNiRi0IQoBAAhUKAIJzxWBAg9N0XAPjC0VH5F71Rp0J+tgYF2VoUZGuRn61BnkFz3lYWSYqHnmhMSoSgcCzW77EgxFu1jFpVxl+WGi1qpQLTrCZMs5ogBsI42C7iQIcIp290F5klSheCIGBSUTYq8gyoO96Dr1qcOGL34GSPD1dMzMesUjP/fqWptGnhuRSj3cITCEf7BRrFMC9rhSIxeIMReM7eApHEfm8wOmArkkalQEG2BvlZWhQYtSjoCznpNsw7k51aa2h/u4jGTs+orsdGlG7sYgB/OdSJzr7Ffw0aJcYXZGFCQRYq8gy81D5CkqGFh4EH8i8eOhIkSYI3FIU3GIE7EIEgAAXZWph0bG3JJKFIDEc73djfLqLd6eclL6IhiEkS9ra68PHxHgTP+AeDSiGgIs+ACYVZGF+QBYMmbS6KjDkGniSRDoGH6GxOXwgHOkQcaBfhDnA2Z6LBRGMSWh0+HO/24niX95zJYIvNOkwozMKEgmwOax8mBp4kwcBD6UySJJzs8WFfmwsnurwp0YGeSG6SJKHbE8KxLg9OdHsTl7xOyTGoMaEgCxMKs1Fs1qX8zPajLRkCD9vniNKcIAgYXxBvkvcEIzjQLqKhzXVJa7URpTtBEFBo1KLQqMXlE/LhDoRxvNuLE11etDh8cPrC+LLZiS+bndCrlajMN8Bq1sFq0qEgO/2mIAlGonAHIojGJBSl6PqMbOEBW3go80iShJZePxraXWjs5FIWRMMRjETR3BO/9HWi29uv3w8AKAUBBUYNrCYdLKZ4CIpP+ZGcIUGSJATCMYiBMMRAGO5ABG5/pN/jMz9jsVmHZVMKUWTSDfk9kqGFh4EHDDyU2fyhKA50xFt9er0hucshSinRmIT2vvURbWIAdjGAwABTiWhUClhM2n4hSI55f4KRKA7Z3Oj2BPsFm6HMtaZTKRDpm4pEADCr1IyaiUNb3JmBJ0kw8BDFtTn92NfqQmOnG+Foxv9pIBo2SZIgBiKwueLhxyYG0OkODtiKmq1VwWLSYnxBFqZYjKM6Kas7EEZ9ixMNbSJC0YGnrsjSKGHUqWHSqWDUq2HUqWA69VinhkalgDsQxt+PduNIpwcAoFcrccWk/EEXZWXgSRIMPET9BcJRHLG7caLbi1aHn3P7EF2CaExCrzeUaAGyiQH0ekI488tXo1RgiiUbVaXmEe0j0+UO4stmB47Y3TiVufIMGkwqyoZRHw80Rp0KRq1qWHMOtfT6sOtwF3p98VZhq0mHq6ee/zIXA0+SYOAhOr9YTEKHGEBzjw/NvV7YXEGO9CK6RKFIDF3uINqcfhzsEOE8YxBBQbYGVSVmTLMaob2ISWIlSUJzrw9fNjvR3OtL7C/L0WN+ZS7G5RtGJFBFYxK+anHi4xM9iRbhWaVmLB7gMhcDT5Jg4CEaumAkipZeP1p6fWjq8cLBZS2ILsmp2dIb+mZLP3X5S6kQMLkoG1UlZpTk6AYNKdGYhCN2N75sdqDbE295EQBMtmRjfkUuLMPoZDwcnmAEfzvahSP2+GUunVqBKyYWYGbJ6ctcDDxJgoGH6OKJgXBf609884eicpdElLIC4Xin4oZ2F3o8pwcR5BjUqCoxY3qx8ZwZn4ORKBraRNS3OBOTJaqVAmaWmDGvPAcmvXpMam91xC9z9fQNfrCYtLh6ahEsJh0DT7Jg4CEaGZIkocsdRFOvDye7vehwBTjknegiSJIEuxjE/nYXDttPDyJQCMCEgmxUlZqQm6XBV2d1RDZolJhbnoNZpWZZ1kyMxiR81erEJ8d7EzVVlZpwzVQL1q+YMuLvx8AzTAw8RKPj1OWvph4vmnp8nOyQ6CKEIjEc6XRjf5sImxgY8Jg8gwbzK3Mw1WqESiH/gqfeYAR/a+zGYZsbQPwy1yPXzcQtl5UPewHtC2HgGSYGHqKx4fCGcLIv/LQ6fBz6TjRM3Z4g9reJOGgTEYzERrwj8kg78zKXWilgx/qrUJmfNWKvz8AzTAw8RGMvEo2hzenHyZ545+cz+ysQ0YVFojEEIzFZJi8crmhMwoEOEfMrcnDvNZNH9LW5lhYRJT2VUoHK/Ky+f+0V9uv83NLrg4+dn4nOS6VUDGveHDkpFQIWjssblU7Lw8HAQ0RJwaRTo6rUjKpSM4B4031L38ivNqcfwQGm6yciGioGHiJKSgXZWhRkazGvIhexmIROdxAtjnjrT7vTz/4/RDQsDDxElPQUCgFWsw5Wsw4Lx+UhGpPQ4fKjudeH1t74oo0c/k5EF8LAQ0QpR6kQUJZrQFmuAZgYH7bb1ONFQ7sLTT0+cCgGEZ2NgYeIUp5GpcBkixGTLUa4/GHsb3fhQLsIdyAid2lElCQYeIgorZj1aiyeWIDLx+fjZI8X+9pcONnt44KnRBmOgYeI0pJCIWBCYTYmFGbDE4xgf5sLDe0iRM72TJSRGHiIKO1la1WonpCPRePz0Nzrw742F453ednRmSiDMPAQUcYQBCEx2aEvFMGBdhENbS44fGz1IUp3DDxElJEMGhUuG5eHBZW5aOn146tWJ453ednXhyhNMfAQUUYTBAEV+QZU5BvgCUbQ0OZCQ5uLI7yI0gwDDxFRn2ytCpdPyMeicXk43u3F3lYnmns5rw9ROmDgISI6i0IhYFJRNiYVZcPpC2FvqwsHOkT4uaApUcpi4CEiuoAcgwZLpxRi8cR8HLF7sK/NiXZnQO6yiGiYGHiIiIZApVRgRokJM0pM6HQHsK/VhUM2N0IRruJOlAoUcr3xyZMncffdd2P8+PHQ6/WYOHEiHnnkEYRCoX7HCIJwzvbxxx/3e63XX38d06ZNg06nw6xZs/Duu++O9cchogxSZNTha9Mt+M7Ccpj0arnLIaIhkC3wHDp0CLFYDP/1X/+F/fv345e//CVeeOEFPPzww+ccu2PHDnR0dCS2BQsWJJ7bvXs3br31Vtx9993Ys2cPVq9ejdWrV6OhoWEsPw4RZaD8bC1uXVSOYrNO7lKIaBCCJCXP+INnnnkG//mf/4njx48DiLfwjB8/Hnv27MHcuXMH/JlbbrkFXq8X77zzTmLf5Zdfjrlz5+KFF14Y0vuKogiz2QyXywWTyXTJn4OIMkskGsP7++04YnfLXQpRUtKplVizbOKIv+5wvr9la+EZiMvlQl5e3jn7r7/+ehQVFWHJkiV4++23+z1XV1eH5cuX99tXW1uLurq6875PMBiEKIr9NiKii6VSKvCNWVYsGn/u3y8iSg5JE3gaGxvxq1/9Cj/5yU8S+7Kzs/Hss8/i9ddfx7Zt27BkyRKsXr26X+ix2WywWCz9XstiscBms533vTZv3gyz2ZzYysvLR/4DEVFGEQQBV0wqwIqZFigVgtzlENFZRjzwPPTQQwN2ND5zO3ToUL+faWtrw8qVK3HzzTfjRz/6UWJ/QUEB1q9fj+rqaixcuBBPP/00brvtNjzzzDOXVOPGjRvhcrkSW0tLyyW9HhHRKTNLzLhxXil0aqXcpRDRGUZ8WPoDDzyAu+6664LHTJgwIXG/vb0dV199NRYvXowtW7YM+vrV1dXYvn174rHVaoXdbu93jN1uh9VqPe9raLVaaLXaQd+LiOhilOcZcMvCcrxV3wYnFyYlSgojHngKCwtRWFg4pGPb2tpw9dVXY8GCBdi6dSsUisEbnOrr61FcXJx4XFNTg507d+L+++9P7Nu+fTtqamqGXTsR0UjJy9LgOwsr8Kev2tHm9MtdDlHGk23iwba2NixbtgyVlZX4P//n/6Crqyvx3KnWmZdffhkajQbz5s0DALzxxhv43e9+h9/+9reJY3/2s5/hqquuwrPPPotVq1bh97//PT7//PMhtRYREY0mvUaJb80vxfYDdhyycQQXkZxkCzzbt29HY2MjGhsbUVZW1u+5M0fKP/HEE2hqaoJKpcK0adPw2muv4aabbko8v3jxYrz66qvYtGkTHn74YUyePBlvvvkmqqqqxuyzEBGdj0qpwLWzimE2qPHJ8V65yyHKWEk1D49cOA8PEY2FA+0idhy0IxrL+D+7lGE4Dw8RUQaZUWLCt+ZzBBeRHBh4iIjGUFmuAbcuKseEwiy5SyHKKFwtnYhojOUYNLhhbinanX7sPtaDll6f3CURpT228BARyaQkR4+bFpThpgVlKMnhAqREo4ktPEREMivPM+CWvAoc7/Kg7ngPOsWg3CURpR0GHiKiJDGhMBvjC7LQ2BkPPj2ekNwlEaUNBh4ioiQiCAImW4yYVJSNgx1ufHy8By4/l6cgulQMPERESUgQBMwoMWGq1Yj97S58eqIX7kBE7rKIUhYDDxFRElMqBMwuy8GMYhP2trnw2Yle+EJRucsiSjkMPEREKUClVGB+RS5mlpjw6Yle1Dc7EeGMzURDxmHpREQpRKtS4srJhbijZhwmFWXLXQ5RymDgISJKQWaDGtfNKcFNC8pQaNTKXQ5R0mPgISJKYeV5BnyvugJfn2FBlpZrdBGdD/vwEBGlOEEQUFVqxmRLNj474cCeZgf79xCdhS08RERpQqtSYsnkAtxRMw6TLezfQ3QmBh4iojRjNqjxzdkluPmyMhSZ2L+HCGDgISJKW2W5Bnx3Efv3EAHsw0NElNZO9e+ZYjHiZI8XbQ4/Wp1+9HiCkNjNhzIIAw8RUQbQqBSYYjFiisUIAAiEo2hz+tHm8KPN6UenGESMCYjSGAMPEVEG0qmVmFiYjYmF8c7NoUgMHS5/ogXI7gpwpBelFQYeIiKCRqVAZX4WKvOzAACRaAx2dxBtDj9OdHvQ7gzIXCHRpWHgISKic6iUCpTm6FGao8ei8Xk40C7ir0e74OfCpZSiOEqLiIgGNaPEhDtrxmF6sVHuUoguCgMPERENiV6jxMqqYnxrfinMerXc5RANCwMPERENS2V+Fm6vqcSCylwoBEHucoiGhIGHiIiGTa1UYOmUQty6qJyzOVNKYOAhIqKLVmTS4daFFVg6pQBqJVt7KHkx8BAR0SVRKAQsqMzD7TXjMK7AIHc5RANi4CEiohFh1qtx47wyrKyywqDh2l2UXDgPDxERjajpxSaMy8/CX4924UC7KHc5RADYwkNERKNAr1GidqYVi8bnyV0KEQCZA8+4ceMgCEK/7emnn+53zN69e3HllVdCp9OhvLwcv/jFL855nddffx3Tpk2DTqfDrFmz8O67747VRyAiogtYPDEfk4qy5S6DSP4WnscffxwdHR2J7b777ks8J4oiVqxYgcrKSnzxxRd45pln8Oijj2LLli2JY3bv3o1bb70Vd999N/bs2YPVq1dj9erVaGhokOPjEBHRGQRBwMoqK4euk+xkDzxGoxFWqzWxZWVlJZ575ZVXEAqF8Lvf/Q4zZ87Ed77zHfz0pz/F//2//zdxzPPPP4+VK1diw4YNmD59Op544gnMnz8fv/71r+X4OEREdBa1UoHr55QgW8tuoyQf2QPP008/jfz8fMybNw/PPPMMIpFI4rm6ujosXboUGo0msa+2thaHDx+Gw+FIHLN8+fJ+r1lbW4u6urrzvmcwGIQoiv02IiIaPUadGtfPLeFcPSQbWQPPT3/6U/z+97/Hhx9+iJ/85Cd46qmn8C//8i+J5202GywWS7+fOfXYZrNd8JhTzw9k8+bNMJvNia28vHykPhIREZ2HxaRD7UwruBoFyWHEA89DDz10Tkfks7dDhw4BANavX49ly5Zh9uzZuOeee/Dss8/iV7/6FYLB4EiX1c/GjRvhcrkSW0tLy6i+HxERxU22GFEzIV/uMigDjfgF1QceeAB33XXXBY+ZMGHCgPurq6sRiURw8uRJTJ06FVarFXa7vd8xpx5brdbE7UDHnHp+IFqtFlotO9AREcmhekI+HL4QDna45S6FMsiIB57CwkIUFhZe1M/W19dDoVCgqKgIAFBTU4N//dd/RTgchlqtBgBs374dU6dORW5ubuKYnTt34v7770+8zvbt21FTU3NpH4SIiEbN8ukWuPxhtDsDcpdCGUK2Pjx1dXV47rnn8NVXX+H48eN45ZVXsG7dOtx2222JMPPd734XGo0Gd999N/bv34/XXnsNzz//PNavX594nZ/97Gd477338Oyzz+LQoUN49NFH8fnnn+Pee++V66MREdEgVEoFrptTApNeLXcplCFkCzxarRa///3vcdVVV2HmzJl48sknsW7dun5z7JjNZnzwwQc4ceIEFixYgAceeAA///nP8eMf/zhxzOLFi/Hqq69iy5YtmDNnDv73f/8Xb775JqqqquT4WERENEQGjQo3zC2BRiX7gGHKAIIkSZLcRchNFEWYzWa4XC6YTCa5yyEiyignur14u74dMX4dpS2dWok1yyaO+OsO5/ubsZqIiGQ1viALV04pkLsMSnMMPEREJLv5FbmYVWqWuwxKYww8RESUFK6ZVoSKPIPcZVCaYuAhIqKkoFAIWDW7GLkGjtyikcfAQ0RESUOnVuKGuaXQqZVyl0JphoGHiIiSSm6WBjfMLYFWza8oGjn8bSIioqRTkqPHzQvKka0d8QUBKEMx8BARUVIqNGrxTwvL2aeHRgQDDxERJS2zXo1bFlbAatbJXQqlOAYeIiJKanqNEt+eX4bKfA5Zp4vHwENERElPo1LghrmlmGY1yl0KpSgGHiIiSglKhYCVVVbMrciRuxRKQQw8RESUMgRBwNVTi3DFJK69RcPDwENERCln0fg8fH2GBQpBkLsUShEMPERElJKqSs1YNbsYKgVDDw2OgYeIiFLWpKJs3Di/lLMy06D4G0JERCmtLNfAWZlpUAw8RESU8jgrMw2GgYeIiNKCWa/GPy0sR0G2Ru5SKAkx8BARUdowaFS4YV4psrRKuUuhJMPAQ0REacWkU+P6OaVQKzl6i05j4CEiorRjNetQO9MKTtNDpzDwEBFRWppsMWIJZ2SmPgw8RESUti4bl4eqUrPcZVASYOAhIqK09rVpRajIM8hdBsmMgYeIiNKaQiFg1exi5HO4ekZj4CEiorSnUytxw9xSGDQcrp6pGHiIiCgjmPVqXD+3hIuNZigGHiIiyhjFZj1qqzhcPRMx8BARUUaZYjFi8UQOV880sgWeXbt2QRCEAbfPPvsMAHDy5MkBn//444/7vdbrr7+OadOmQafTYdasWXj33Xfl+EhERJQiFo3Pw4wSk9xl0BiSLfAsXrwYHR0d/bYf/vCHGD9+PC677LJ+x+7YsaPfcQsWLEg8t3v3btx66624++67sWfPHqxevRqrV69GQ0PDWH8kIiJKIcunW1DO4eoZQ7bAo9FoYLVaE1t+fj7eeustfP/734dw1sXV/Pz8fseq1erEc88//zxWrlyJDRs2YPr06XjiiScwf/58/PrXvx7rj0RERClEqRDwzdnFyMvicPVMkDR9eN5++2309PTg+9///jnPXX/99SgqKsKSJUvw9ttv93uurq4Oy5cv77evtrYWdXV1o1ovERGlPp1aidVzS6HncPW0lzSB58UXX0RtbS3KysoS+7Kzs/Hss8/i9ddfx7Zt27BkyRKsXr26X+ix2WywWCz9XstiscBms533vYLBIERR7LcREVFmMhvUuG4Oh6unuxEPPA899NB5OyOf2g4dOtTvZ1pbW/H+++/j7rvv7re/oKAA69evR3V1NRYuXIinn34at912G5555plLqnHz5s0wm82Jrby8/JJej4iIUltpjh4rq6xQMvSkLdVIv+ADDzyAu+6664LHTJgwod/jrVu3Ij8/H9dff/2gr19dXY3t27cnHlutVtjt9n7H2O12WK3W877Gxo0bsX79+sRjURQZeoiIMtxkixEGrQrvfNUOXygqdzk0wkY88BQWFqKwsHDIx0uShK1bt+KOO+7o1xn5fOrr61FcXJx4XFNTg507d+L+++9P7Nu+fTtqamrO+xparRZarXbINRIRUWYozdHjO4sq8HZ9G7o9IbnLoRE04oFnuP7yl7/gxIkT+OEPf3jOcy+//DI0Gg3mzZsHAHjjjTfwu9/9Dr/97W8Tx/zsZz/DVVddhWeffRarVq3C73//e3z++efYsmXLmH0GIiJKH2a9Gv+0sBx/3mfDiW6v3OXQCJE98Lz44otYvHgxpk2bNuDzTzzxBJqamqBSqTBt2jS89tpruOmmmxLPL168GK+++io2bdqEhx9+GJMnT8abb76JqqqqsfoIRESUZrQqJW6YW4K/Hu3Gl00OucuhESBIkiTJXYTcRFGE2WyGy+WCycSZN4mI6LR9rS58eLgT0VjGf11eNJ1aiTXLJo746w7n+ztphqUTERElo1llZtw4rxQ6NefqSWUMPERERIMozzPg1kXlnJU5hTHwEBERDUGOQYNbFpajgutvpSQGHiIioiHSqZW4cV4p5pSb5S6FhomBh4iIaBgUCgHXTLPg6mlFUAicmTlVMPAQERFdhLnlOVg9rwRaNb9KUwH/KxEREV2kyvwsfGdhBXINg68UQPJi4CEiIroEeVka3FpdgcmWbLlLoQtg4CEiIrpEWpUS35xdgqumFnLF9STFwENERDRC5lfk4qYFZTDqZF+5ic7CwENERDSCSnL0+F51JcYVcL6eZMLAQ0RENML0GiVWzy1FzcR8cOR6cmDgISIiGgWCIODyCfn41rwyGDRch0tuDDxERESjqCLfgO9dXonSHL3cpWQ0Bh4iIqJRlq1V4aYFZVhQmSt3KRmLgYeIiGgMKBQClk4pxHVzODuzHHjGiYiIxtCkomx8b1ElikxauUvJKAw8REREY8xsUOOWy8oxq5Srro8VBh4iIiIZqJQKLJ9hQfWEPLlLyQgMPERERDJaPLEASyYXyF1G2mPgISIiktnCcXlYNrWQkxSOIgYeIiKiJDCvIhfLp1sYekYJAw8REVGSqCo1Y2WVFQqmnhHHwENERJREpllNWDW7GEoFQ89IYuAhIiJKMpOKsnH9nBKolQw9I4WBh4iIKAmNK8jCDXNLoVHxq3ok8CwSERElqfI8A26cV8qlKEYAzyAREVESK8nR46b5ZdBrlHKXktIYeIiIiJJckUmHmxaUIUvL0HOxGHiIiIhSQEG2FjcvKIdRp5K7lJTEwENERJQicrM0uPmycuQY1HKXknJGLfA8+eSTWLx4MQwGA3JycgY8prm5GatWrYLBYEBRURE2bNiASCTS75hdu3Zh/vz50Gq1mDRpEl566aVzXuc3v/kNxo0bB51Oh+rqanz66aej8ImIiIjkZ9arcfNl5ZhQmIUikxYmvZojuYZg1NrFQqEQbr75ZtTU1ODFF1885/loNIpVq1bBarVi9+7d6OjowB133AG1Wo2nnnoKAHDixAmsWrUK99xzD1555RXs3LkTP/zhD1FcXIza2loAwGuvvYb169fjhRdeQHV1NZ577jnU1tbi8OHDKCoqGq2PR0REJJtsrQo3zC3tty8WkxCIRBEIxxAIR/u2WN++KIKn9keiaHP4EY5KMlUvD0GSpFH9xC+99BLuv/9+OJ3Ofvv//Oc/45vf/Cba29thsVgAAC+88AIefPBBdHV1QaPR4MEHH8S2bdvQ0NCQ+LnvfOc7cDqdeO+99wAA1dXVWLhwIX79618DAGKxGMrLy3HffffhoYceGlKNoijCbDbD5XLBZDKNwKcmIiJKXoFwFA1tLtS3OOEORAb/gUukUyuxZtnEEX/d4Xx/y9YGVldXh1mzZiXCDgDU1tZCFEXs378/cczy5cv7/VxtbS3q6uoAxFuRvvjii37HKBQKLF++PHEMERER9adTK3HZuDz84Irx+ObsYpTm6uUuadTJ1tXbZrP1CzsAEo9tNtsFjxFFEX6/Hw6HA9FodMBjDh06dN73DgaDCAaDiceiKF7SZyEiIkpFCoWAyRYjJluM6HQHsKfZiSM2NyKx9LvcNawWnoceegiCIFxwu1DQSBabN2+G2WxObOXl5XKXREREJKsiow61M624+8rxWDwxH9na9Br+PqxP88ADD+Cuu+664DETJkwY0mtZrdZzRlPZ7fbEc6duT+078xiTyQS9Xg+lUgmlUjngMadeYyAbN27E+vXrE49FUWToISIiAmDQqFA9IR+XjcvD0U436pud6HAF5C7rkg0r8BQWFqKwsHBE3rimpgZPPvkkOjs7E6Optm/fDpPJhBkzZiSOeffdd/v93Pbt21FTUwMA0Gg0WLBgAXbu3InVq1cDiHda3rlzJ+69997zvrdWq4VWqx2Rz0FERJSOlAoB06wmTLOaYHMFsKfZgaOdHkRT9HLXqHVabm5uRn19PZqbmxGNRlFfX4/6+np4PB4AwIoVKzBjxgzcfvvt+Oqrr/D+++9j06ZNWLt2bSKM3HPPPTh+/Dj+5V/+BYcOHcJ//Md/4A9/+APWrVuXeJ/169fjv//7v/Hyyy/j4MGDWLNmDbxeL77//e+P1kcjIiLKKFazDtfOKsaN80qhVAhyl3NRRu0C3c9//nO8/PLLicfz5s0DAHz44YdYtmwZlEol3nnnHaxZswY1NTXIysrCnXfeiccffzzxM+PHj8e2bduwbt06PP/88ygrK8Nvf/vbxBw8AHDLLbegq6sLP//5z2Gz2TB37ly8995753RkJiIioktTnmfANdOKsP2AffCDk8yoz8OTCjgPDxER0dDtOtyJPc3OIR+f0fPwEBERUWpaOrkQ4wuy5C5jWBh4iIiIaFgUCgHXzrIiP1sjdylDxsBDREREw6ZVKXHDnFLoNUq5SxkSBh4iIiK6KGaDGqtmFafEyC0GHiIiIrpop0ZuJTsGHiIiIrokVaVmzK/MlbuMC2LgISIiokt25aSCpB65xcBDRERElyzZR24x8BAREdGISOaRWww8RERENGKSdeQWAw8RERGNqGQcucXAQ0RERCMu2UZuMfAQERHRqEimkVsMPERERDQqkmnkFgMPERERjRqtSolVs4rlLoOBh4iIiEZXllYldwkMPERERJT+GHiIiIgo7THwEBERUdpj4CEiIqK0x8BDREREaY+Bh4iIiNIeAw8RERGlPQYeIiIiSnsMPERERJT2GHiIiIgo7THwEBERUdpj4CEiIqK0x8BDREREaY+Bh4iIiNKe/Ou1JwFJkgAAoijKXAkREREN1anv7VPf4xfCwAPA7XYDAMrLy2WuhIiIiIbL7XbDbDZf8BhBGkosSnOxWAzt7e0wGo0QBGFEX1sURZSXl6OlpQUmk2lEXztd8BxdGM/P4HiOBsdzNDieowtLxvMjSRLcbjdKSkqgUFy4lw5beAAoFAqUlZWN6nuYTKak+QVJVjxHF8bzMzieo8HxHA2O5+jCku38DNaycwo7LRMREVHaY+AhIiKitMfAM8q0Wi0eeeQRaLVauUtJWjxHF8bzMzieo8HxHA2O5+jCUv38sNMyERERpT228BAREVHaY+AhIiKitMfAQ0RERGmPgYeIiIjSHgPPGLrnnnsgCAKee+45uUtJCn/9619x3XXXoaSkBIIg4M0335S7pKTT1taG2267Dfn5+dDr9Zg1axY+//xzucuSzWC/M2+88QZWrFiB/Px8CIKA+vp6WeqU01D+vzp48CCuv/56mM1mZGVlYeHChWhubh77YmWwefNmLFy4EEajEUVFRVi9ejUOHz7c75gtW7Zg2bJlMJlMEAQBTqdTnmJlMpRzBAB1dXW45pprkJWVBZPJhKVLl8Lv98tQ8dAw8IyRP/7xj/j4449RUlIidylJw+v1Ys6cOfjNb34jdylJyeFw4IorroBarcaf//xnHDhwAM8++yxyc3PlLk02g/3OeL1eLFmyBP/+7/8+xpUlj8HO0bFjx7BkyRJMmzYNu3btwt69e/Fv//Zv0Ol0Y1ypPD766COsXbsWH3/8MbZv345wOIwVK1bA6/UmjvH5fFi5ciUefvhhGSuVz1DOUV1dHVauXIkVK1bg008/xWeffYZ777130OUdZCXRqGttbZVKS0ulhoYGqbKyUvrlL38pd0lJB4D0xz/+Ue4yksqDDz4oLVmyRO4yktaFfmdOnDghAZD27NkzpjUlm4HO0S233CLddttt8hSUhDo7OyUA0kcffXTOcx9++KEEQHI4HGNfWBIZ6BxVV1dLmzZtkrGq4UviKJYeYrEYbr/9dmzYsAEzZ86UuxxKIW+//TYuu+wy3HzzzSgqKsK8efPw3//933KXRSksFoth27ZtmDJlCmpra1FUVITq6uqMvpzscrkAAHl5eTJXkrzOPkednZ345JNPUFRUhMWLF8NiseCqq67C3//+dznLHBQDzyj793//d6hUKvz0pz+VuxRKMcePH8d//ud/YvLkyXj//fexZs0a/PSnP8XLL78sd2mUojo7O+HxePD0009j5cqV+OCDD3DjjTfiW9/6Fj766CO5yxtzsVgM999/P6644gpUVVXJXU5SGugcHT9+HADw6KOP4kc/+hHee+89zJ8/H1/72tdw9OhROcu9IK6WPoJeeeUV/OQnP0k83rZtG55//nl8+eWXEARBxsooFcViMVx22WV46qmnAADz5s1DQ0MDXnjhBdx5550yV0epKBaLAQBuuOEGrFu3DgAwd+5c7N69Gy+88AKuuuoqOcsbc2vXrkVDQ0PSt0zIaaBzdOr36Cc/+Qm+//3vA4j/fdq5cyd+97vfYfPmzbLUOhi28Iyg66+/HvX19Ylt9+7d6OzsREVFBVQqFVQqFZqamvDAAw9g3LhxcpdLSa64uBgzZszot2/69OkZM5qGRl5BQQFUKhV/rwDce++9eOedd/Dhhx+irKxM7nKS0vnOUXFxMQCk3O8RW3hGkNFohNFoTDz+8Y9/jOuuu67fMbW1tbj99tsTqZjofK644opzhoIeOXIElZWVMlVEqU6j0WDhwoUZ/XslSRLuu+8+/PGPf8SuXbswfvx4uUtKOoOdo3HjxqGkpGTA36Nrr712LEsdFgaeUZSfn4/8/Px++9RqNaxWK6ZOnSpTVcnD4/GgsbEx8fjEiROor69HXl4eKioqZKwsOaxbtw6LFy/GU089hX/6p3/Cp59+ii1btmDLli1ylyabwX5nent70dzcjPb2dgBI/EG2Wq2wWq2y1DzWBjtHGzZswC233IKlS5fi6quvxnvvvYc//elP2LVrl3xFj6G1a9fi1VdfxVtvvQWj0QibzQYAMJvN0Ov1AACbzQabzZY4j/v27YPRaERFRUVGdG4e7BwJgoANGzbgkUcewZw5czB37ly8/PLLOHToEP73f/9X5uovQO5hYpmGw9JPOzXk8+ztzjvvlLu0pPGnP/1JqqqqkrRarTRt2jRpy5Ytcpckq8F+Z7Zu3Trg84888oisdY+lofx/9eKLL0qTJk2SdDqdNGfOHOnNN9+Ur+AxNtC5ASBt3bo1ccwjjzwy6DHpbCjnSJIkafPmzVJZWZlkMBikmpoa6W9/+5s8BQ+RIEmSNKqJioiIiEhm7LRMREREaY+Bh4iIiNIeAw8RERGlPQYeIiIiSnsMPERERJT2GHiIiIgo7THwEBERUdpj4CEiIqK0x8BDREREaY+Bh4iIiNIeAw8RERGlPQYeIiIiSnv/P1pxrh8H+Wg3AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "\n", - "pd.Series(data[\"impact_mean\"]).plot()\n", - "plt.fill_between(\n", - " pd.Series(data[\"impact_mean\"]).index,\n", - " pd.Series(data[\"impact_mean_lower\"]).values,\n", - " pd.Series(data[\"impact_mean_upper\"]).values,\n", - " alpha=0.5,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "count 151.000000\n", - "mean 12.453919\n", - "std 106.016563\n", - "min -172.573853\n", - "25% -53.838501\n", - "50% -13.332367\n", - "75% 60.875992\n", - "max 415.842525\n", - "dtype: float64\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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GvMqnZmVrivMbMCAAW3ar91fcNq7d++4+OKLY8WKFcVtTU1NsWLFiqitrW3viwMAykyH/NplxowZMW3atLjkkkti3Lhx8dWvfjUOHjwYN910U0dcHABQRjokPq6//vr47//+77j77rtj9+7dcdFFF8XSpUtj2LBhbT6PQqEQ99xzT4tfyfDOzKw05lU6MyuNeZXOzEpXjjOrSKkt74kBAGgfPtsFAMhKfAAAWYkPACAr8QEAZNWp8bF9+/a4+eabY8yYMdG3b994z3veE/fcc08cOXKk2X7PP/98/Pqv/3r06dMnRo4cGffff3+L83rsscfivPPOiz59+sT73//+eOKJJ3Jdjez+/M//PC699NKoqqqKgQMHtrrPz3/+85gyZUpUVVXF0KFD44477og333yz2T5PP/10fPCDH4xCoRBjx46NRx55pOMX34XMmzcvRo8eHX369Inx48fHs88+29lL6hSrVq2Ka665JkaMGBEVFRWxePHiZqenlOLuu++O4cOHR9++fWPixInx0ksvNdvn9ddfj8985jNRXV0dAwcOjJtvvjkOHDiQ8Vrkc99998WHPvSh6N+/fwwdOjSuvfba2LJlS7N9Dh8+HNOnT48zzjgj+vXrF9ddd12LP7zYlsdod/Hwww/HBz7wgeIfwaqtrY0nn3yyeLp5ndjcuXOjoqIibrvttuK2sp9Zu3ygyyl68skn04033piWLVuWXn755fT444+noUOHpttvv724T11dXRo2bFj6zGc+kzZt2pQeffTR1Ldv3/SNb3yjuM9//dd/pZ49e6b7778/bd68OX3pS19KlZWV6YUXXuiMq9Xh7r777vTggw+mGTNmpAEDBrQ4/c0330wXXHBBmjhxYtqwYUN64okn0pAhQ9KsWbOK+/z0pz9NVVVVacaMGWnz5s3poYceSj179kxLly7NeE06z8KFC1Pv3r3TN7/5zfSjH/0o3XLLLWngwIFpz549nb207J544on0Z3/2Z+nf/u3fUkSkRYsWNTt97ty5acCAAWnx4sXphz/8Yfr4xz+exowZk954443iPldffXW68MIL05o1a9J//ud/prFjx6apU6dmviZ5TJo0Kc2fPz9t2rQpbdy4Mf3mb/5mGjVqVDpw4EBxn8997nNp5MiRacWKFWndunXpwx/+cLr00kuLp7flMdqd/Pu//3tasmRJ+slPfpK2bNmSvvjFL6bKysq0adOmlJJ5ncizzz6bRo8enT7wgQ+kL3zhC8Xt5T6zTo2P1tx///1pzJgxxeNf+9rX0qBBg1JDQ0Nx25/+6Z+mc889t3j8U5/6VJoyZUqz8xk/fnz6gz/4g45fcCeaP39+q/HxxBNPpB49eqTdu3cXtz388MOpurq6OMc777wznX/++c2+7/rrr0+TJk3q0DV3FePGjUvTp08vHj969GgaMWJEuu+++zpxVZ3v+PhoampKNTU16S//8i+L2/bt25cKhUJ69NFHU0opbd68OUVEeu6554r7PPnkk6mioiK9+uqr2dbeWV577bUUEWnlypUppbfmU1lZmR577LHiPi+++GKKiLR69eqUUtseo93doEGD0t///d+b1wns378/nXPOOWn58uXpN37jN4rx0R1m1uVe81FXVxeDBw8uHl+9enV89KMfjd69exe3TZo0KbZs2RL/+7//W9xn4sSJzc5n0qRJsXr16jyL7mJWr14d73//+5v9UbdJkyZFfX19/OhHPyruc7rO7MiRI7F+/fpm179Hjx4xceLE0+L6l2Lbtm2xe/fuZrMaMGBAjB8/vjir1atXx8CBA+OSSy4p7jNx4sTo0aNHrF27Nvuac6urq4uIKP7cWr9+fTQ2Njab2XnnnRejRo1qNrOTPUa7q6NHj8bChQvj4MGDUVtba14nMH369JgyZUqLn9XdYWad/qm2b7d169Z46KGH4oEHHihu2717d4wZM6bZfseGuXv37hg0aFDs3r27xV9PHTZsWOzevbvjF90FvdM8jp12on3q6+vjjTfeiL59++ZZbCf4n//5nzh69Gir1//HP/5xJ62qazp2fznR42v37t0xdOjQZqf36tUrBg8e3O0fg01NTXHbbbfFRz7ykbjgggsi4q159O7du8XrsY6f2ckeo93NCy+8ELW1tXH48OHo169fLFq0KN73vvfFxo0bzasVCxcujB/84Afx3HPPtTitO9zHOuSZj5kzZ0ZFRcUJD8f/kH/11Vfj6quvjt/5nd+JW265pSOW1aWdysyAzjV9+vTYtGlTLFy4sLOX0uWde+65sXHjxli7dm18/vOfj2nTpsXmzZs7e1ld0iuvvBJf+MIX4p//+Z+jT58+nb2cDtEhz3zcfvvtceONN55wn7PPPrv43zt37owJEybEpZdeGn/3d3/XbL+ampoWr+A9drympuaE+xw7vRyUOrMTqampafHOjbbOrLq6uls/6xERMWTIkOjZs2fZ32dyODaPPXv2xPDhw4vb9+zZExdddFFxn9dee63Z97355pvx+uuvd+t53nrrrfHtb387Vq1aFWeddVZxe01NTRw5ciT27dvX7P9M337/astjtLvp3bt3jB07NiIiLr744njuuefir//6r+P66683r+OsX78+XnvttfjgBz9Y3Hb06NFYtWpV/O3f/m0sW7as/GfW2S862bFjRzrnnHPSpz/96fTmm2+2OP3YC06PHDlS3DZr1qwWLzj9rd/6rWbfV1tbe9q/4PTt79z4xje+kaqrq9Phw4dTSm+94PSCCy5o9n1Tp049rV5weuuttxaPHz16NL3rXe/ygtN3eMHpAw88UNxWV1fX6gtO161bV9xn2bJl3fYFp01NTWn69OlpxIgR6Sc/+UmL04+9GPBf//Vfi9t+/OMft/piwBM9Rru7CRMmpGnTpplXK+rr69MLL7zQ7HDJJZek3/3d300vvPBCt5hZp8bHjh070tixY9MVV1yRduzYkXbt2lU8HLNv3740bNiw9Hu/93tp06ZNaeHChamqqqrFW2179eqVHnjggfTiiy+me+65p1u/1fZnP/tZ2rBhQ5ozZ07q169f2rBhQ9qwYUPav39/SukXb7G66qqr0saNG9PSpUvTmWee2epbbe+444704osvpnnz5p12b7UtFArpkUceSZs3b06f/exn08CBA5u9Mvx0sX///uJ9KCLSgw8+mDZs2JB+9rOfpZTeeqvtwIED0+OPP56ef/759IlPfKLVt9r+2q/9Wlq7dm36/ve/n84555xu+1bbz3/+82nAgAHp6aefbvYz69ChQ8V9Pve5z6VRo0al733ve2ndunWptrY21dbWFk9vy2O0O5k5c2ZauXJl2rZtW3r++efTzJkzU0VFRfrOd76TUjKvtnj7u11SKv+ZdWp8zJ8/P0VEq4e3++EPf5guu+yyVCgU0rve9a40d+7cFuf1L//yL+m9731v6t27dzr//PPTkiVLcl2N7KZNm9bqzJ566qniPtu3b0+TJ09Offv2TUOGDEm33357amxsbHY+Tz31VLroootS796909lnn53mz5+f94p0soceeiiNGjUq9e7dO40bNy6tWbOms5fUKZ566qlW70/Tpk1LKb31f/p33XVXGjZsWCoUCumKK65IW7ZsaXYee/fuTVOnTk39+vVL1dXV6aabbirGcHfzTj+z3v74eeONN9If/uEfpkGDBqWqqqr0yU9+stn/VKXUtsdod/H7v//76d3vfnfq3bt3OvPMM9MVV1xRDI+UzKstjo+Pcp9ZRUop5fkFDwCAz3YBADITHwBAVuIDAMhKfAAAWYkPACAr8QEAZCU+AICsxAcAkJX4AACyEh8AQFbiAwDISnwAAFn9HzUaTuf5QHzhAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "impacts__ = pd.Series(\n", - " [list(ts.values())[4 + 14] for ts in data[\"individual_impacts\"].values()]\n", - ")\n", - "print(impacts__.describe())\n", - "impacts__.hist(bins=50)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "NormaltestResult(statistic=38.361141607881784, pvalue=4.677178450886598e-09)" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from scipy.stats import normaltest\n", - "\n", - "normaltest(impacts__)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Small p-value means that it's likely not normal. (However, large p-value does not mean anything, e. g. it can be due to small sample size.)\n", - "See https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.normaltest.html." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "media-impact-monitor-rWf_1CFO-py3.10", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file