Package: upgini
Upgini • Intelligent data search & enrichment for Machine Learning and AIEasily find and add relevant features to your ML & AI pipeline fromhundreds of public, community and premium external data sources,including open & commercial LLMsQuick Start in Colab »|Register / Sign In|Slack Community|Propose new Data source❔ OverviewUpginiis an intelligent data search engine with a Python library that helps you find and add relevant features to your ML pipeline from hundreds of public, community, and premium external data sources. Under the hood, Upgini automatically optimizes all connected data sources bygenerating an optimal set of machine ML features using large language models (LLMs), GraphNNs and recurrent neural networks (RNNs).Motivation:for most supervised ML models external data & features boost accuracy significantly better than any hyperparameters tuning. But lack of automated and time-efficient enrichment tools for external data blocks massive adoption of external features in ML pipelines. We want radically simplify features search and enrichment to make external data a standard approach. Like a hyperparameter tuning for machine learning nowadays.Mission:Democratize access to data sources for data science community.🚀 Awesome features⭐️ Automatically find only relevant features thatgive accuracy improvement for ML model. Not just correlated with target variable, what 9 out of 10 cases gives zero accuracy improvement⭐️ Automated feature generation from the sources: feature generation with Large Language Models' data augmentation, RNNs, GraphNN; multiple data source ensembling⭐️ Automatic search key augmentation from all connected sources. If you do not have all search keys in your search request, such as postal/zip code, Upgini will try to add those keys based on the provided set of search keys. This will broaden the search across all available data sources⭐️ Calculate accuracy metrics and uplifts after enrichment existing ML model with external features⭐️ Check the stability of accuracy gain from external data on out-of-time intervals and verification datasets. Mitigate risks of unstable external data dependencies in ML pipeline⭐️ Easy to use - single request to enrich training dataset withall of the keys at once:date / datetimephone numberpostal / ZIP codehashed email / HEMcountryIP-address⭐️ Scikit-learn compatible interface for quick data integration with existing ML pipelines⭐️ Support for most common supervised ML tasks on tabular data:☑️ binary classification☑️ multiclass classification☑️ regression☑️ time series prediction⭐️Simple Drag & Drop Search UI:🌎 Connected data sources and coveragePublic data: public sector, academic institutions, other sources through open data portals. Curated and updated by the Upgini teamCommunity shared data: royalty / license free datasets or features from Data science community (our users). It's both a public and a scraped dataPremium data providers: commercial data sources verified by the Upgini team in real-world use cases👉Details on  datasets and features📊 Total:239 countriesandup to 41 yearsof historyData sourcesCountriesHistory, years# sources for ensembleUpdateSearch keysAPI Key requiredHistorical weather & Climate normals6822-Monthlydate, country, postal/ZIP codeNoLocation/Places/POI/Area/Proximity information from OpenStreetMap2212-Monthlydate, country, postal/ZIP codeNoInternational holidays & events, Workweek calendar23222-Monthlydate, countryNoConsumer Confidence index4422-Monthlydate, countryNoWorld economic indicators19141-Monthlydate, countryNoMarkets data-17-Monthlydate, datetimeNoWorld mobile & fixed broadband network coverage and perfomance167-3Monthlycountry, postal/ZIP codeNoWorld demographic data90-2Annualcountry, postal/ZIP codeNoWorld house prices44-3Annualcountry, postal/ZIP codeNoPublic social media profile data104--Monthlydate, email/HEM, phoneYesCar ownership data and Parking statistics3--Annualcountry, postal/ZIP code, email/HEM, phoneYesGeolocation profile for phone & IPv4 & email239-6Monthlydate, email/HEM, phone, IPv4Yes🔜 Email/WWW domain profile----❓Know other useful data sources for machine learning?Give us a hint and we'll add it for free.💼 TutorialsSearch of relevant external features & Automated feature generation for Salary predicton task (use as a template)The goal is to predict salary for data science job postning based on information about employer and job description.Following this guide, you'll learn how tosearch & auto generate new relevant features with Upgini libraryThe evaluation metric isMean Absolute Error (MAE).RunFeature search & generation notebookinside your browser:❓Simple sales prediction for retail storesThe goal is topredict future sales of different goods in storesbased on a 5-year history of sales.Kaggle CompetitionStore Item Demand Forecasting Challengeis a product sales forecasting. The evaluation metric isSMAPE.❓How to boost ML model accuracy for Kaggle TOP1 Leaderboard in 10 minutesThe goal isaccuracy improvement for TOP1 winning Kaggle solutionfrom new relevant external features & data.Kaggle Competitionis a product sales forecasting, evaluation metric isSMAPE.❓How to do low-code feature engineering for AutoML toolsSave time on feature search and engineering. Use ready-to-use external features and data sources to maximize overall AutoML accuracy, right out of the box.Kaggle Competitionis a product sales forecasting, evaluation metric isSMAPE.Low-code AutoML tools:UpginiandPyCaret❓How to improve accuracy of Multivariate Time Series forecast from external features & dataThe goal isaccuracy improvement of Multivariate Time Series predictionfrom new relevant external features & data.  The main challenge here is a strategy of data & feature enrichment, when a component of Multivariate TS depends not only on its past values but also hassome dependency on other components.Kaggle Competitionis a product sales forecasting, evaluation metric isRMSLE.❓How to speed up feature engineering hypothesis tests with ready-to-use external featuresSave time on external data wrangling and feature calculation codefor hypothesis tests. The key challenge here is a time-dependent representation of information in a training dataset, which is uncommon for credit default prediction tasks. As a result, special data enrichment strategy is used.Kaggle Competitionis a credit default prediction, evaluation metric isnormalized Gini coefficient.🏁 Quick start1. Install from PyPI%pipinstallupgini🐳Docker-wayClone$ git clone https://github.com/upgini/upginior download upgini git repo locallyand follow steps below to build docker container 👇1. Build docker image from cloned git repo:cd upginidocker build -t upgini ....or directly from GitHub:DOCKER_BUILDKIT=0 docker build -t upginigit@github.com:upgini/upgini.git#main2. Run docker image:docker run -p 8888:8888 upgini3. Open http://localhost:8888?token="<"your_token_from_console_output">" in your browser2. 💡 Use your labeled training dataset for searchYou can use your labeled training datasets "as is" to initiate the search. Under the hood, we'll search for relevant data using:search keysfrom training dataset to match records from potential data sources with a new featureslabelsfrom training dataset to estimate relevancy of feature or dataset for your ML task and calculate feature importance metricsyour featuresfrom training dataset to find external datasets and features which only give accuracy improvement to your existing data and estimate accuracy uplift (optional)Load training dataset into pandas dataframe and separate features' columns from label column in a Scikit-learn way:importpandasaspd# labeled training dataset - customer_churn_prediction_train.csvtrain_df=pd.read_csv("customer_churn_prediction_train.csv")X=train_df.drop(columns="churn_flag")y=train_df["churn_flag"]⚠️Requirements for search initialization datasetWe do dataset verification and cleaning under the hood, but still there are some requirements to follow:1.pandas.DataFrame,pandas.Seriesornumpy.ndarrayrepresentation;2. correct label column types: boolean/integers/strings for binary and multiclass labels, floats for regression;3. at least one column selected as asearch key;4. min size after deduplication by search key column and NaNs removal:100 records3. 🔦 Choose one or multiple columns as a search keysSearch keyscolumns will be used to match records from all potential external data sources / features.Define one or multiple columns as a search keys withFeaturesEnricherclass initialization.fromupginiimportFeaturesEnricher,SearchKeyenricher=FeaturesEnricher(search_keys={"subscription_activation_date":SearchKey.DATE,"country":SearchKey.COUNTRY,"zip_code":SearchKey.POSTAL_CODE,"hashed_email":SearchKey.HEM,"last_visit_ip_address":SearchKey.IP,"registered_with_phone":SearchKey.PHONE})✨ Search key types we support (more to come!)Search KeyMeaning TypeDescriptionAllowed pandas dtypes (python types)ExampleSearchKey.EMAILe-mailobject(str)stringsupport@upgini.comSearchKey.HEMsha256(lowercase(email))object(str)string0e2dfefcddc929933dcec9a5c7db7b172482814e63c80b8460b36a791384e955SearchKey.IPIP address (version 4)object(str, ipaddress.IPv4Address)stringint64192.168.0.1SearchKey.PHONEphone number,E.164 standardobject(str)stringint64float64443451925138SearchKey.DATEdateobject(str)stringdatetime64[ns]period[D]2020-02-12(ISO-8601 standard)12.02.2020(non standard notation)SearchKey.DATETIMEdatetimeobject(str)stringdatetime64[ns]period[D]2020-02-12 12:46:1812:46:18 12.02.2020SearchKey.COUNTRYCountry ISO-3166 code, Country nameobject(str)stringGBUSINSearchKey.POSTAL_CODEPostal code a.k.a. ZIP code. Could be used only with SearchKey.COUNTRYobject(str)string21174061107SE-999-99For the meaning typesSearchKey.DATE/SearchKey.DATETIMEwith dtypesobjectorstringyou have to clarify date/datetime format by passingdate_formatparameter toFeaturesEnricher. For example:fromupginiimportFeaturesEnricher,SearchKeyenricher=FeaturesEnricher(search_keys={"subscription_activation_date":SearchKey.DATE,"country":SearchKey.COUNTRY,"zip_code":SearchKey.POSTAL_CODE,"hashed_email":SearchKey.HEM,"last_visit_ip_address":SearchKey.IP,"registered_with_phone":SearchKey.PHONE},date_format="%Y-%d-%m")To use datetime not in UTC timezone, you can cast datetime column explicitly to your timezone (example for Warsaw):df["date"]=df.date.astype("datetime64").dt.tz_localize("Europe/Warsaw")Single country for the whole training dataset can be passed withcountry_codeparameter:fromupginiimportFeaturesEnricher,SearchKeyenricher=FeaturesEnricher(search_keys={"subscription_activation_date":SearchKey.DATE,"zip_code":SearchKey.POSTAL_CODE,},country_code="US",date_format="%Y-%d-%m")4. 🔍 Start your first feature search!The main abstraction you interact isFeaturesEnricher, a Scikit-learn compatible estimator.  You can easily add it into your existing ML pipelines.
Create instance of theFeaturesEnricherclass and call:fitto search relevant datasets & featuresthantransformto enrich your dataset with features from search resultLet's try it out!importpandasaspdfromupginiimportFeaturesEnricher,SearchKey# load labeled training dataset to initiate searchtrain_df=pd.read_csv("customer_churn_prediction_train.csv")X=train_df.drop(columns="churn_flag")y=train_df["churn_flag"]# now we're going to create `FeaturesEnricher` classenricher=FeaturesEnricher(search_keys={"subscription_activation_date":SearchKey.DATE,"country":SearchKey.COUNTRY,"zip_code":SearchKey.POSTAL_CODE})# everything is ready to fit! For 200к records fitting should take around 10 minutes,# we send email notification, just register on profile.upgini.comenricher.fit(X,y)That's all). We've fittedFeaturesEnricher.5. 📈 Evaluate feature importances (SHAP values) from the search resultFeaturesEnricherclass has two properties for feature importances, which will be filled after fit -feature_names_andfeature_importances_:feature_names_-  feature names from the search result, and if parameterkeep_input=Truewas used, initial columns from search dataset as wellfeature_importances_- SHAP values for features from the search result, same order as infeature_names_Methodget_features_info()returns pandas dataframe with features and full statistics after fit, including SHAP values and match rates:enricher.get_features_info()Get more details aboutFeaturesEnricherat runtime using docstrings viahelp(FeaturesEnricher)orhelp(FeaturesEnricher.fit).6. 🏭 Enrich Production ML pipeline with relevant external featuresFeaturesEnricheris a Scikit-learn compatible estimator, so any pandas dataframe can be enriched with external features from a search result (afterfit).Usetransformmethod ofFeaturesEnricher, and let magic to do the rest 🪄# load dataset for enrichmenttest_x=pd.read_csv("test.csv")# enrich it!enriched_test_features=enricher.transform(test_x)6.1 Reuse completed search for enrichment without 'fit' runFeaturesEnrichercan be initiated with asearch_idparameter from completed search after fit method call.Just useenricher.get_search_id()or copy search id string from thefit()output.Search keys and features in X should be the same as forfit()enricher=FeaturesEnricher(#same set of a search keys as for the fit stepsearch_keys={"date":SearchKey.DATE},api_key="<YOUR API_KEY>",# if you fit enricher with api_key then you should use it heresearch_id="abcdef00-0000-0000-0000-999999999999")enriched_prod_dataframe=enricher.transform(input_dataframe)6.2 Enrichment with an updated external data sources and featuresFor most of the ML cases, training step requires labeled dataset with a historical observations from the past. But for production step you'll need an updated and actual data sources and features for the present time, to calculate a prediction.FeaturesEnricher, when initiated with set of search keys which includesSearchKey.DATE, will match records from all potential external data sourcesexactly on a the specific date/datetimebased onSearchKey.DATE. To avoid enrichment with features "form the future" for thefitstep.And then, fortransformin a production ML pipeline, you'll get enrichment with relevant features, actual for the present date.⚠️ InitiateFeaturesEnricherwithSearchKey.DATEsearch key in a key set to get actual features for production and avoid features from the future for the training:enricher=FeaturesEnricher(search_keys={"subscription_activation_date":SearchKey.DATE,"country":SearchKey.COUNTRY,"zip_code":SearchKey.POSTAL_CODE,},)💻 How it works?🧹 Search dataset validationWe validate and clean search initialization dataset under the hood:сheck yousearch keyscolumns format;check zero variance for label column;check dataset for full row duplicates. If we find any, we remove duplicated rows and make a note on share of row duplicates;check inconsistent labels  - rows with the same features and keys but different labels, we remove them and make a note on share of row duplicates;remove columns with zero variance  - we treat any nonsearch keycolumn in search dataset as a feature, so columns with zero variance will be removed❔ Supervised ML tasks detectionWe detect ML task under the hood based on label column values. Currently we support:ModelTaskType.BINARYModelTaskType.MULTICLASSModelTaskType.REGRESSIONBut for certain search datasets you can pass parameter toFeaturesEnricherwith correct ML taks type:fromupginiimportModelTaskTypeenricher=FeaturesEnricher(search_keys={"subscription_activation_date":SearchKey.DATE},model_task_type=ModelTaskType.REGRESSION)⏰ Time Series prediction supportTime series predictionsupported asModelTaskType.REGRESSIONorModelTaskType.BINARYtasks with time series specific cross-validation split:Scikit-learn time series cross-validation-CVType.time_seriesparameterBlocked time series cross-validation-CVType.blocked_time_seriesparameterTo initiate feature search you can pass cross-validation type parameter toFeaturesEnricherwith time series specific CV type:fromupgini.metadataimportCVTypeenricher=FeaturesEnricher(search_keys={"sales_date":SearchKey.DATE},cv=CVType.time_series)⚠️Pre-process search datasetin case of time series prediction:sort rows in dataset according to observation order, in most cases - ascending order by date/datetime.🆙 Accuracy and uplift metrics calculationsFeaturesEnricherautomaticaly calculates model metrics and uplift from new relevant features either usingcalculate_metrics()method orcalculate_metrics=Trueparameter infitorfit_transformmethods (example below).You can use any model estimator with scikit-learn compartible interface, some examples are:All Scikit-Learn supervised modelsXgboostLightGBMCatBoost👈 Evaluation metric should be passed tocalculate_metrics()byscoringparameter,out-of-the box Upgini supportsMetricDescriptionexplained_varianceExplained variance regression score functionr2R2(coefficient of determination) regression score functionmax_errorCalculates the maximum residual error (negative - greater is better)median_absolute_errorMedian absolute error regression lossmean_absolute_errorMean absolute error regression lossmean_absolute_percentage_errorMean absolute percentage error regression lossmean_squared_errorMean squared error regression lossmean_squared_log_error(or aliases:msle,MSLE)Mean squared logarithmic error regression lossroot_mean_squared_log_error(or aliases:rmsle,RMSLE)Root mean squared logarithmic error regression lossroot_mean_squared_errorRoot mean squared error regression lossmean_poisson_devianceMean Poisson deviance regression lossmean_gamma_devianceMean Gamma deviance regression lossaccuracyAccuracy classification scoretop_k_accuracyTop-k Accuracy classification scoreroc_aucArea Under the Receiver Operating Characteristic Curve (ROC AUC)
    from prediction scoresroc_auc_ovrArea Under the Receiver Operating Characteristic Curve (ROC AUC)
    from prediction scores (multi_class="ovr")roc_auc_ovoArea Under the Receiver Operating Characteristic Curve (ROC AUC)
    from prediction scores (multi_class="ovo")roc_auc_ovr_weightedArea Under the Receiver Operating Characteristic Curve (ROC AUC)
    from prediction scores (multi_class="ovr", average="weighted")roc_auc_ovo_weightedArea Under the Receiver Operating Characteristic Curve (ROC AUC)
    from prediction scores (multi_class="ovo", average="weighted")balanced_accuracyCompute the balanced accuracyaverage_precisionCompute average precision (AP) from prediction scoreslog_lossLog loss, aka logistic loss or cross-entropy lossbrier_scoreCompute the Brier score lossIn addition to that list, you can define custom evaluation metric function usingscikit-learn make_scorer, for exampleSMAPE.By default,calculate_metrics()method calculates evaluation metric with the same cross-validation split as selected forFeaturesEnricher.fit()by parametercv = CVType.<cross-validation-split>.But you can easily define new split by passing child of BaseCrossValidator to parametercvincalculate_metrics().Example with more tips-and-tricks:fromupginiimportFeaturesEnricher,SearchKeyenricher=FeaturesEnricher(search_keys={"registration_date":SearchKey.DATE})# Fit with default setup for metrics calculation# CatBoost will be usedenricher.fit(X,y,eval_set=eval_set,calculate_metrics=True)# LightGBM estimator for metricscustom_estimator=LGBMRegressor()enricher.calculate_metrics(estimator=custom_estimator)# Custom metric function to scoring param (callable or name)custom_scoring="RMSLE"enricher.calculate_metrics(scoring=custom_scoring)# Custom cross validatorcustom_cv=TimeSeriesSplit(n_splits=5)enricher.calculate_metrics(cv=custom_cv)# All this custom parameters could be combined in both methods: fit, fit_transform and calculate_metrics:enricher.fit(X,y,eval_set,calculate_metrics=True,estimator=custom_estimator,scoring=custom_scoring,cv=custom_cv)✅ More tips-and-tricks🤖 Automated feature generation from columns in a search datasetIf a training dataset has a text column, you can generate additional embeddings from it using instructed embeddings generation with LLMs and data augmentation from external sources, just like Upgini does for all records from connected data sources.For most cases, this gives better results than direct embeddings generation from a text field. Currently, Upgini has two LLMs connected to a search engine - GPT-3.5 from OpenAI and GPT-J.To use this feature, pass the column names as arguments to thegenerate_featuresparameter. You can use up to 2 columns.Here's an example for generating features from the "description" and "summary" columns:enricher=FeaturesEnricher(search_keys={"date":SearchKey.DATE},generate_features=["description","summary"])With this code, Upgini will generate LLM embeddings from text columns and then check them for predictive power for your ML task.Finally, Upgini will return a dataset enriched by only relevant components of LLM embeddings.Find features only give accuracy gain to existing data in the ML modelIf you already have features or other external data sources, you can specifically search new datasets & features only give accuracy gain "on top" of them.Just leave all these existing features in the labeled training dataset and Upgini library automatically use them during feature search process and as a baseline ML model to calculate accuracy metric uplift. Only features which improve accuracy will return.Check robustness of accuracy improvement from external featuresYou can validate external features robustness on out-of-time dataset usingeval_setparameter:# load train datasettrain_df=pd.read_csv("train.csv")train_ids_and_features=train_df.drop(columns="label")train_label=train_df["label"]# load out-of-time validation dataseteval_df=pd.read_csv("validation.csv")eval_ids_and_features=eval_df.drop(columns="label")eval_label=eval_df["label"]# create FeaturesEnricherenricher=FeaturesEnricher(search_keys={"registration_date":SearchKey.DATE})# now we fit WITH eval_set parameter to calculate accuracy metrics on Out-of-time dataset.# the output will contain quality metrics for both the training data set and# the eval set (validation OOT data set)enricher.fit(train_ids_and_features,train_label,eval_set=[(eval_ids_and_features,eval_label)])⚠️ Requirements for out-of-time datasetSame data schema as for search initialization datasetPandas dataframe representationUse custom loss function in feature selection & metrics calculationFeaturesEnrichercan be initialized with additional string parameterloss.
Depending on ML-task, you can use the following loss functions:regression: regression, regression_l1, huber, poisson, quantile, mape, gamma, tweedie;binary: binary;multiclass: multiclass, multiclassova.For instance, if your target variable has a Poisson distribution (count of events, number of customers in the shop and so on), you should try to useloss="poisson"to improve quality of feature selection and get better evaluation metrics.Usage example:enricher=FeaturesEnricher(search_keys={"date":SearchKey.DATE},loss="poisson",model_task_type=ModelTaskType.REGRESSION)enriched_dataframe.fit(X,y)Return initial dataframe enriched with TOP external features by importancetransformandfit_transformmethods ofFeaturesEnrichercan be used with two additional parameters:importance_threshold: float = 0 - only features withimportance >= thresholdwill be added to the output dataframemax_features: int  - only first TOP N features by importance will be returned, whereN = max_featuresAndkeep_input=Truewill keep all initial columns from search dataset X:enricher=FeaturesEnricher(search_keys={"subscription_activation_date":SearchKey.DATE})enriched_dataframe.fit_transform(X,y,keep_input=True,max_features=2)Exclude premium data sources from fit, transform and metrics calculationfit,fit_transform,transformandcalculate_metricsmethods ofFeaturesEnrichercan be used with parameterexclude_features_sourcesthat allows to exclude Trial or Paid features from Premium data sources:enricher=FeaturesEnricher(search_keys={"subscription_activation_date":SearchKey.DATE})enricher.fit(X,y,calculate_metrics=False)trial_features=enricher.get_features_info()[enricher.get_features_info()["Feature type"]=="Trial"]["Feature name"].values.tolist()paid_features=enricher.get_features_info()[enricher.get_features_info()["Feature type"]=="Paid"]["Feature name"].values.tolist()enricher.calculate_metrics(exclude_features_sources=(trial_features+paid_features))enricher.transform(X,exclude_features_sources=(trial_features+paid_features))Turn off autodetection for search key columnsUpgini has autodetection of search keys on by default.
To turn off usedetect_missing_search_keys=False:enricher=FeaturesEnricher(search_keys={"date":SearchKey.DATE},detect_missing_search_keys=False,)enricher.fit(X,y)Turn off removing of target outliersUpgini detect rows with target outlier for regression tasks. By default such rows are dropped on metrics calculation. To turn off removing of target outlier rows use parameterremove_outliers_calc_metrics=Falsein fit, fit_transform or calculate_metrics methods:enricher=FeaturesEnricher(search_keys={"date":SearchKey.DATE},)enricher.fit(X,y,remove_outliers_calc_metrics=False)🔑 Open up all capabilities of UpginiRegisterand get a free API key for exclusive data sources and features: 600 mln+ phone numbers, 350 mln+ emails, 2^32 IP addressesBenefitNo Sign-upRegistered userEnrichment withdate/datetime, postal/ZIP code and country keysYesYesEnrichment withphone number, hashed email/HEM and IP-address keysNoYesEmail notification onsearch task completionNoYesAutomatedfeature generation with LLMsfrom columns in a search datasetYes,till 12/05/23YesEmail notification onnew data source activation🔜NoYes👩🏻‍💻 How to share data/features with a community ?You may publish ANY data which you consider as royalty / license free (Open Data) and potentially valuable for ML applications forcommunity usage:Please Sign UphereCopyUpgini API keyfrom profile and upload your data from Upgini python library with this key:importpandasaspdfromupginiimportSearchKeyfromupgini.adsimportupload_user_adsimportosos.environ["UPGINI_API_KEY"]="your_long_string_api_key_goes_here"#you can define custom search key which might not be supported yet, just use SearchKey.CUSTOM_KEY typesample_df=pd.read_csv("path_to_data_sample_file")upload_user_ads("test",sample_df,{"city":SearchKey.CUSTOM_KEY,"stats_date":SearchKey.DATE})After data verification, search results on community data will be available usual way.🛠 Getting Help & CommunityPlease note, that we are still in a beta stage.
Requests and support, in preferred order❗Please try to create bug reports that are:reproducible- include steps to reproduce the problem.specific- include as much detail as possible: which Python version, what environment, etc.unique- do not duplicate existing opened issues.scoped to a Single Bug- one bug per report.🧩 ContributingWe are not a large team, so we probably won't be able to:implement smooth integration with most common low-code ML libraries and platforms (PyCaret,H2O AutoML, etc. )implement all possible data verification and normalization capabilities for different types of search keys
And we need some help from the community!So, we'll be happy about everypull requestyou open andissueyou find to make this librarymore incredible. Please note that it might sometimes take us a while to get back to you.For major changes, please open an issue first to discuss what you would like to changeDevelopingSome convenient ways to start contributing are:⚙️Open in Visual Studio CodeYou can remotely open this repo in VS Code without cloning or automatically clone and open it inside a docker container.⚙️GitpodYou can use Gitpod to launch a fully functional development environment right in your browser.🔗 Useful linksSimple sales predictions as a template notebookFull list of Kaggle Guides & ExamplesProject on PyPIMore perks for registered users😔 Found mistype or a bug in code snippet? Our bad!Please report it here.