Retentioneering: product analytics, data-driven customer journey map optimization, marketing analytics, web analytics, transaction analytics, graph visualization, and behavioral segmentation with customer segments in Python.

Overview

Rete logo

Pipi version Telegram Python version Downloads Travis Build Status

Language grade: JavaScript Language grade: Python

What is Retentioneering?

Retentioneering is a Python framework and library to assist product analysts and marketing analysts as it makes it easier to process and analyze clickstreams, event streams, trajectories, and event logs. You can segment users, clients (agents), build ML pipelines to predict agent category or probability of target event based on historical data.

In a common scenario you can use raw data from Google Analytics BigQuery stream or any other silimal streams in form of events and their timestamps for users, and Retentioneering is all you need to explore the user behavior from that data, it can reveal much more isights than funnel analytics, as it will automatically build the behavioral segments and their patterns, highlighting what events and pattern impact your conversion rates, retention and revenue.

Retentioneering extends Pandas, NetworkX, Scikit-learn for in-depth processing of event sequences data, specifically Retentioneering provides a powerful environment to perform an in-depth analysis of customer journey maps, bringing behavior-driven segmentation of users and machine learning pipelines to product analytics.

Most recent is Retentioneering 2.0.0, this version has major updates from 1.0.x and it is not reverse compatible with previous releases due to major syntax changes. With significant improvements we now provided architecture and the solid ground for farther updates and rapid development of analytical tools. Please update, leave your feedback and stay tuned.

intro 0

Changelog

This is new major release Retentioneering 2.0. Change log is available here.

Complete documentation is available here.

Installation

Option 1. Run directly from google.colab. Open google.colab and click File-> “new notebook”. In the code cell run following to install Retentioneering (same command will install directly from Jupyter notebook):

!pip3 install retentioneering

Option 2. Install Retentioneering from PyPI:

pip3 install retentioneering

Option 3. Install Retentioneering directly from the source:

git clone https://github.com/retentioneering/retentioneering-tools
cd retentioneering-tools
python3 setup.py install

Quick start

Start using Retentioneering for clickstream analysis

Or directly open this notebook in Google Colab to run with sample data.

Suggested first steps:

import retentioneering

# load sample user behavior data as a pandas dataframe: 
data = retentioneering.datasets.load_simple_shop()

# update config to pass columns names:
retentioneering.config.update({
    'user_col': 'user_id',
    'event_col':'event',
    'event_time_col':'timestamp',
})

Above we imported sample dataset, which is regular pandas dataframe containing raw user behavior data from hypothetical web-site or app in form of sequence of records {'user_id', 'event', 'timestamp'}, and pass those column names to retentioneering.config. Now, let's plot the graph to visualize user behaviour from the dataset (read more about graphs here):

data.rete.plot_graph(norm_type='node',
                     weight_col='user_id',
                     thresh=0.2,
                     targets = {'payment_done':'green',
                                'lost':'red'})

intro 1

Here we obtain the high-level graph of user activity where edge A --> B weight shows percent of users transitioning to event B from all users reached event A (note, edges with small weighs are thresholded to avoid visual clutter, read more in the documentation)

To automatically find distinct behavioral patterns we can cluster users from the dataset based on their behavior (read more about behavioral clustering here):

data.rete.get_clusters(method='kmeans',
                       n_clusters=8,
                       ngram_range=(1,2),
                       plot_type='cluster_bar',
                       targets=['payment_done','cart']);

intro 1

Users with similar behavior grouped in the same cluster. Clusters with low conversion rate can represent systematic problem in the product: specific behavior pattern which does not lead to product goals. Obtained user segments can be explored deeper to understand problematic behavior pattern. In the example above for instance, cluster 4 has low conversion rate to purchase but high conversion rate to cart visit.

clus_4 = data.rete.filter_cluster(4)
clus_4.rete.plot_graph(thresh=0.1,
                        weight_col='user_id',
                        targets = {'lost':'red',
                                   'payment_done':'green'})

intro 1

To explore more features please see the documentation

Step-by-step guides

Contributing

This is community-driven open source project in active development. Any contributions, new ideas, bug reports, bug fixes, documentation improvements are very welcome.

Retentioneering now provides several opensource solutions for data-driven product analytics and web analytics. Please checkout this repository for JS library to track the mutations of the website elements: https://github.com/retentioneering/retentioneering-dom-observer

Apps are better with math!:) Retentioneering is a research laboratory, analytics methodology and opensource tools founded by Maxim Godzi and Anatoly Zaytsev in 2015. Please feel free to contact us at [email protected] if you have any questions regarding this repo.

Comments
  • ImportError: cannot import name 'img_as_float32'

    ImportError: cannot import name 'img_as_float32'

    Hi guys

    I tried to get through your "first steps" guide but it raised an error on the start

    from retentioneering import init_config
    import pandas as pd
    
    ---------------------------------------------------------------------------
    ImportError                               Traceback (most recent call last)
    <ipython-input-21-fe4dd999c90a> in <module>()
    ----> 1 from retentioneering import init_config
          2 import pandas as pd
    
    /anaconda3/lib/python3.6/site-packages/retentioneering/__init__.py in <module>()
    ----> 1 from retentioneering.core.utils import init_config
          2 from retentioneering.core.simulator import Simulator
    
    /anaconda3/lib/python3.6/site-packages/retentioneering/core/utils.py in <module>()
         14 from retentioneering.visualization import plot
         15 from sklearn.linear_model import LogisticRegression
    ---> 16 from retentioneering.core.model import ModelDescriptor
         17 from retentioneering.core import node_metrics
         18 from retentioneering.core import preprocessing
    
    /anaconda3/lib/python3.6/site-packages/retentioneering/core/model.py in <module>()
          5 
          6 
    ----> 7 import shap
          8 import eli5
          9 from eli5.sklearn import PermutationImportance
    
    /anaconda3/lib/python3.6/site-packages/shap/__init__.py in <module>()
         10 from .explainers.linear import LinearExplainer
         11 from .explainers.partition import PartitionExplainer
    ---> 12 from .plots.summary import summary_plot
         13 from .plots.decision import decision_plot, multioutput_decision_plot
         14 from .plots.dependence import dependence_plot
    
    /anaconda3/lib/python3.6/site-packages/shap/plots/summary.py in <module>()
         13     pass
         14 from . import labels
    ---> 15 from . import colors
         16 
         17 # TODO: remove unused title argument / use title argument
    
    /anaconda3/lib/python3.6/site-packages/shap/plots/colors.py in <module>()
          5 
          6 import numpy as np
    ----> 7 import skimage.color
          8 
          9 try:
    
    /anaconda3/lib/python3.6/site-packages/skimage/color/__init__.py in <module>()
    ----> 1 from .colorconv import (convert_colorspace,
          2                         guess_spatial_dimensions,
          3                         rgba2rgb,
          4                         rgb2hsv,
          5                         hsv2rgb,
    
    /anaconda3/lib/python3.6/site-packages/skimage/color/colorconv.py in <module>()
         54 import numpy as np
         55 from scipy import linalg
    ---> 56 from ..util import dtype, dtype_limits
         57 
         58 
    
    /anaconda3/lib/python3.6/site-packages/skimage/util/__init__.py in <module>()
    ----> 1 from .dtype import (img_as_float32, img_as_float64, img_as_float,
          2                     img_as_int, img_as_uint, img_as_ubyte,
          3                     img_as_bool, dtype_limits)
          4 from .shape import view_as_blocks, view_as_windows
          5 from .noise import random_noise
    
    ImportError: cannot import name 'img_as_float32'
    

    skimage version: 0.15.0

    opened by mingghan 5
  • 'ValueError: too many values to unpack (expected 2)' in early steps tutorial

    'ValueError: too many values to unpack (expected 2)' in early steps tutorial

    I am getting this error on

    data.retention.get_clusters(plot_type='cluster_heatmap')

    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-47-ea4770463931> in <module>()
    ----> 1 data.retention.get_clusters(plot_type='cluster_heatmap')
    
    /anaconda3/lib/python3.6/site-packages/retentioneering/core/utils.py in get_clusters(self, plot_type, refit_cluster, method, **kwargs)
        450         if not hasattr(self, 'clusters') or refit_cluster:
        451             clusterer = getattr(clustering, method)
    --> 452             self.clusters, self._metrics = clusterer(features, **kwargs)
        453             self._create_cluster_mapping(features.index.values)
        454 
    
    ValueError: too many values to unpack (expected 2)
    

    Same on

    data.retention.get_clusters(n_clusters=8, plot_type='cluster_tsne', refit_cluster=True);

    opened by mingghan 4
  • Dev2

    Dev2

    Update to 2.0.3 Minor technical pre-release before the major update in October 2021

    New in this minor version:

    • updated lib dependencies
    • added support for another config init

    Upcoming in 2.1 in October 2021:

    • Important: Deep redesign of graph editor, including interactive node list editing (excluding and merging nodes by deleting or grouping), live recalculation of raw clickstream from the graph view
    • New preprocessing tools
    • More tools to work with cohorts and segments
    • Sequence exploration tools: search for loops, cycles, n-grams, and their product metrics influence
    • New prediction pipeline
    • Important: new norms for graph, edgelists, and adjacency matrix based of group-averaged user transition probabilities
    • Tools for automated sampling by users and event filtering based on event importance
    • New clustering and vectorizing techniques specific for product science
    opened by godzi 2
  • Error after installing via miniconda3

    Error after installing via miniconda3

    1. Created new enviroment using miniconda3
    2. pip3 install retentioneering
    3. Got an error while starting python3 kernel «ImportError: DLL load failed while importing win32api»

    Fixed it by:

    pip install pywin32
    python path\to\python\Scripts\pywin32_postinstall.py -install
    
    opened by ivan-toriya 2
  • Your starred Github rep for analytics is moved

    Your starred Github rep for analytics is moved

    Hi,

    Python tools for user trajectories analysis Retentioneering are now moved. Previously started in App in the Air (https://github.com/appintheair/retentioneering-framework) it is now rebuilt, redeveloped and actively maintained by independent Retentioneering team at https://github.com/retentioneering/retentioneering-tools

    Please join for best latest updates and new features, like better graph visualization in Python.

    Watch, Star, Fork

    Thanks, Retentioneering team

    opened by danlenny 1
  • ModuleNotFoundError: No module named 'itermplot'

    ModuleNotFoundError: No module named 'itermplot'

    Hi,

    importing retentioneering causes this error:

    Python 3.8.12 (default, Mar 15 2022, 12:23:51)
    [Clang 12.0.5 (clang-1205.0.22.11)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import retentioneering
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/__init__.py", line 30, in <module>
        from retentioneering.core.config import config, init_config
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/core/config.py", line 9, in <module>
        from .core_functions.base_dataset import BaseDataset
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/core/core_functions/__init__.py", line 10, in <module>
        from .step_matrix import step_matrix
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/core/core_functions/step_matrix.py", line 9, in <module>
        from retentioneering.visualization import plot_step_matrix
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/visualization/plot_step_matrix.py", line 10, in <module>
        import matplotlib.pyplot as plt
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/matplotlib/pyplot.py", line 2230, in <module>
        switch_backend(rcParams["backend"])
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/matplotlib/pyplot.py", line 267, in switch_backend
        class backend_mod(matplotlib.backend_bases._Backend):
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/matplotlib/pyplot.py", line 268, in backend_mod
        locals().update(vars(importlib.import_module(backend_name)))
      File "/Users/katya/.pyenv/versions/3.8.12/lib/python3.8/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
    ModuleNotFoundError: No module named 'itermplot'
    >>>
    
    opened by demidovakatya 0
  • Origin/loops&cycles

    Origin/loops&cycles

    Added a new functional to the utils.py, fixed some minor bugs.

    List of changes: Fixed _make_target Fixed insert_sleep_events Added matplotlib import

    New functions: get_negative_users import matplotlib Is_cycle Is_loop get_fraction sequence_search Find_sequences Loop_search Find_loops Find_cycles

    opened by SynthaxWarrior 0
  • ValueError on seaborn==0.11.2

    ValueError on seaborn==0.11.2

    Cell

    data.rete.compare(groups=(test, control),
                      function=conversion,
                      test='mannwhitneyu',
                      group_names=('test','control'))'
    

    in tutorial doesn't work and fails with ValueError: cannot reindex on an axis with duplicate labels error. After downgrading to seaborn==0.11.1 error dissapear.

    opened by SvetoforColumb 0
  • The telegram link on the official website is broken

    The telegram link on the official website is broken

    Hey folks, Sorry if that is not the right place for raising such kinds of issues. I was trying to navigate the community in telegram but noticed the link https://t.me/retentioneering_meetups is no longer active. Can you navigate me to the right one, please?

    opened by zkid18 0
  • ERROR: Could not build wheels for numpy

    ERROR: Could not build wheels for numpy

    Got troubles with installation on macbook air m1.

    python -V
    Python 3.9.5
    

    Part of the trace:

    Building wheels for collected packages: numpy, llvmlite
      Building wheel for numpy (pyproject.toml) ... error
      error: subprocess-exited-with-error
      
      × Building wheel for numpy (pyproject.toml) did not run successfully.
      │ exit code: 1
      ╰─> [893 lines of output]
          Running from numpy source directory.
          numpy/random/_bounded_integers.pxd.in has not changed
          numpy/random/_philox.pyx has not changed
          numpy/random/_bounded_integers.pyx.in has not changed
          numpy/random/_sfc64.pyx has not changed
          numpy/random/_mt19937.pyx has not changed
          numpy/random/bit_generator.pyx has not changed
          Processing numpy/random/_bounded_integers.pyx
          numpy/random/mtrand.pyx has not changed
          numpy/random/_generator.pyx has not changed
          numpy/random/_pcg64.pyx has not changed
          numpy/random/_common.pyx has not changed
          Cythonizing sources
          blas_opt_info:
          blas_mkl_info:
          customize UnixCCompiler
            libraries mkl_rt not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          blis_info:
            libraries blis not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          openblas_info:
            libraries openblas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_3_10_blas_threads_info:
          Setting PTATLAS=ATLAS
            libraries tatlas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_3_10_blas_info:
            libraries satlas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_blas_threads_info:
          Setting PTATLAS=ATLAS
            libraries ptf77blas,ptcblas,atlas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_blas_info:
            libraries f77blas,cblas,atlas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          accelerate_info:
            libraries accelerate not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
          Library accelerate was not found. Ignoring
            libraries veclib not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
          Library veclib was not found. Ignoring
            FOUND:
              extra_compile_args = ['-faltivec', '-I/System/Library/Frameworks/vecLib.framework/Headers']
              extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
              define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
          
            FOUND:
              extra_compile_args = ['-faltivec', '-I/System/Library/Frameworks/vecLib.framework/Headers']
              extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
              define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
          
          non-existing path in 'numpy/distutils': 'site.cfg'
          lapack_opt_info:
          lapack_mkl_info:
            libraries mkl_rt not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          openblas_lapack_info:
            libraries openblas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          openblas_clapack_info:
            libraries openblas,lapack not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          flame_info:
            libraries flame not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_3_10_threads_info:
          Setting PTATLAS=ATLAS
            libraries lapack_atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries tatlas,tatlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries lapack_atlas not found in /usr/local/lib
            libraries tatlas,tatlas not found in /usr/local/lib
            libraries lapack_atlas not found in /usr/lib
            libraries tatlas,tatlas not found in /usr/lib
          <class 'numpy.distutils.system_info.atlas_3_10_threads_info'>
            NOT AVAILABLE
          
          atlas_3_10_info:
            libraries lapack_atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries satlas,satlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries lapack_atlas not found in /usr/local/lib
            libraries satlas,satlas not found in /usr/local/lib
            libraries lapack_atlas not found in /usr/lib
            libraries satlas,satlas not found in /usr/lib
          <class 'numpy.distutils.system_info.atlas_3_10_info'>
            NOT AVAILABLE
          
          atlas_threads_info:
          Setting PTATLAS=ATLAS
            libraries lapack_atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries ptf77blas,ptcblas,atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries lapack_atlas not found in /usr/local/lib
            libraries ptf77blas,ptcblas,atlas not found in /usr/local/lib
            libraries lapack_atlas not found in /usr/lib
            libraries ptf77blas,ptcblas,atlas not found in /usr/lib
          <class 'numpy.distutils.system_info.atlas_threads_info'>
            NOT AVAILABLE
          
          atlas_info:
            libraries lapack_atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries f77blas,cblas,atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries lapack_atlas not found in /usr/local/lib
            libraries f77blas,cblas,atlas not found in /usr/local/lib
            libraries lapack_atlas not found in /usr/lib
            libraries f77blas,cblas,atlas not found in /usr/lib
          <class 'numpy.distutils.system_info.atlas_info'>
            NOT AVAILABLE
          
            FOUND:
              extra_compile_args = ['-faltivec', '-I/System/Library/Frameworks/vecLib.framework/Headers']
              extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
              define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
          
          /private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-build-env-cxkr50mv/overlay/lib/python3.9/site-packages/setuptools/_distutils/dist.py:275: UserWarning: Unknown distribution option: 'define_macros'
            warnings.warn(msg)
          running bdist_wheel
          running build
          running config_cc
          unifing config_cc, config, build_clib, build_ext, build commands --compiler options
          running config_fc
          unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
          running build_src
          build_src
          building py_modules sources
          building library "npymath" sources
          Could not locate executable gfortran
          Could not locate executable f95
          Could not locate executable f90
          Could not locate executable f77
          Could not locate executable xlf90
          Could not locate executable xlf
          Could not locate executable ifort
          Could not locate executable ifc
          Could not locate executable g77
          Could not locate executable g95
          Could not locate executable pgfortran
          don't know how to compile Fortran code on platform 'posix'
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath' to include_dirs.
          None - nothing done with h_files = ['build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/npy_math_internal.h']
          building library "npysort" sources
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common' to include_dirs.
          None - nothing done with h_files = ['build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/npy_sort.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/npy_partition.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/npy_binsearch.h']
          building library "npyrandom" sources
          building extension "numpy.core._multiarray_tests" sources
          building extension "numpy.core._multiarray_umath" sources
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath' to include_dirs.
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath' to include_dirs.
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common' to include_dirs.
          numpy.core - nothing done with h_files = ['build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/funcs.inc', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/simd.inc', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/loops.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/matmul.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/clip.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/npy_math_internal.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/templ_common.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy/config.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy/_numpyconfig.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy/__multiarray_api.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy/__ufunc_api.h']
          
         ...
    
    
          copying numpy/tests/test_scripts.py -> build/lib.macosx-12.1-arm64-3.9/numpy/tests
          running build_clib
          customize UnixCCompiler
          customize UnixCCompiler using new_build_clib
          building 'npymath' library
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9
          creating build/temp.macosx-12.1-arm64-3.9/numpy
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src/npymath
          creating build/temp.macosx-12.1-arm64-3.9/build
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath
          compile options: '-Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          clang: numpy/core/src/npymath/npy_math.c
          clang: numpy/core/src/npymath/halffloat.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/ieee754.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/npy_math_complex.c
          In file included from numpy/core/src/npymath/npy_math.c:9:
          numpy/core/src/npymath/npy_math_internal.h.src:490:21: warning: incompatible pointer types passing 'npy_longdouble *' (aka 'double *') to parameter of type 'long double *' [-Wincompatible-pointer-types]
              return modfl(x, iptr);
                              ^~~~
          /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include/math.h:394:52: note: passing argument to parameter here
          extern long double modfl(long double, long double *);
                                                             ^
          1 warning generated.
          ar: adding 4 object files to build/temp.macosx-12.1-arm64-3.9/libnpymath.a
          ranlib:@ build/temp.macosx-12.1-arm64-3.9/libnpymath.a
          building 'npysort' library
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort
          compile options: '-Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/quicksort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/mergesort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/timsort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/heapsort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/radixsort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/selection.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/binsearch.c
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          22 warnings generated.
          ar: adding 7 object files to build/temp.macosx-12.1-arm64-3.9/libnpysort.a
          ranlib:@ build/temp.macosx-12.1-arm64-3.9/libnpysort.a
          building 'npyrandom' library
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9/numpy/random
          creating build/temp.macosx-12.1-arm64-3.9/numpy/random/src
          creating build/temp.macosx-12.1-arm64-3.9/numpy/random/src/distributions
          compile options: '-Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          clang: numpy/random/src/distributions/logfactorial.c
          clang: numpy/random/src/distributions/distributions.c
          clang: numpy/random/src/distributions/random_mvhg_marginals.c
          clang: numpy/random/src/distributions/random_mvhg_count.c
          clang: numpy/random/src/distributions/random_hypergeometric.c
          ar: adding 5 object files to build/temp.macosx-12.1-arm64-3.9/libnpyrandom.a
          ranlib:@ build/temp.macosx-12.1-arm64-3.9/libnpyrandom.a
          running build_ext
          customize UnixCCompiler
          customize UnixCCompiler using new_build_ext
          building 'numpy.core._multiarray_tests' extension
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src/common
          compile options: '-DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/_multiarray_tests.c
          clang: numpy/core/src/common/mem_overlap.c
          In file included from numpy/core/src/multiarray/_multiarray_tests.c.src:7:
          In file included from numpy/core/include/numpy/npy_math.h:596:
          numpy/core/src/npymath/npy_math_internal.h.src:490:21: warning: incompatible pointer types passing 'npy_longdouble *' (aka 'double *') to parameter of type 'long double *' [-Wincompatible-pointer-types]
              return modfl(x, iptr);
                              ^~~~
          /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include/math.h:394:52: note: passing argument to parameter here
          extern long double modfl(long double, long double *);
                                                             ^
          numpy/core/src/multiarray/_multiarray_tests.c.src:1895:61: warning: format specifies type 'long double' but the argument has type 'npy_longdouble' (aka 'double') [-Wformat]
                  PyOS_snprintf(str, sizeof(str), "%.*Lg", precision, x);
                                                   ~~~~~              ^
                                                   %.*g
          2 warnings generated.
          clang -bundle -undefined dynamic_lookup -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/knodl/.pyenv/versions/3.9.5/lib -L/opt/homebrew/lib -L/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/knodl/.pyenv/versions/3.9.5/lib -L/opt/homebrew/lib -L/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/lib build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/_multiarray_tests.o build/temp.macosx-12.1-arm64-3.9/numpy/core/src/common/mem_overlap.o -Lbuild/temp.macosx-12.1-arm64-3.9 -lnpymath -o build/lib.macosx-12.1-arm64-3.9/numpy/core/_multiarray_tests.cpython-39-darwin.so
          building 'numpy.core._multiarray_umath' extension
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src/multiarray
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src/umath
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/common
          creating build/temp.macosx-12.1-arm64-3.9/private
          creating build/temp.macosx-12.1-arm64-3.9/private/var
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d/numpy
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d/numpy/_build_utils
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d/numpy/_build_utils/src
          compile options: '-DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -DNO_ATLAS_INFO=3 -DHAVE_CBLAS -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/umath -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          extra options: '-faltivec -I/System/Library/Frameworks/vecLib.framework/Headers'
          clang: numpy/core/src/multiarray/alloc.c
          clang: numpy/core/src/multiarray/array_assign_scalar.c
          clang: numpy/core/src/multiarray/buffer.c
          clang: numpy/core/src/multiarray/datetime_strings.c
          clang: numpy/core/src/multiarray/conversion_utils.c
          clang: numpy/core/src/multiarray/common.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/einsum.c
          clang: numpy/core/src/multiarray/descriptor.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/multiarray/hashdescr.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/lowlevel_strided_loops.c
          clang: numpy/core/src/multiarray/multiarraymodule.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/multiarray/nditer_constr.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/multiarray/refcount.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/multiarray/temp_elide.c
          clang: numpy/core/src/multiarray/vdot.c
          clang: numpy/core/src/multiarray/scalarapi.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/loops.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/umath/ufunc_type_resolution.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/umath/ufunc_object.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/common/array_assign.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/ieee754.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/npy_cpu_features.c
          clang: numpy/core/src/common/ucsnarrow.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: /private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d/numpy/_build_utils/src/apple_sgemv_fix.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          error: Command "clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -DNO_ATLAS_INFO=3 -DHAVE_CBLAS -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/umath -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c numpy/core/src/multiarray/alloc.c -o build/temp.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/alloc.o -MMD -MF build/temp.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/alloc.o.d -faltivec -I/System/Library/Frameworks/vecLib.framework/Headers" failed with exit status 1
          [end of output]
      
      note: This error originates from a subprocess, and is likely not a problem with pip.
      ERROR: Failed building wheel for numpy
    
      Building wheel for llvmlite (setup.py) ... error
      error: subprocess-exited-with-error
      
      × python setup.py bdist_wheel did not run successfully.
      │ exit code: 1
      ╰─> [11 lines of output]
          running bdist_wheel
          /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/bin/python3.9 /private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/llvmlite_008ed1517dfb4868be790fe2deeb4363/ffi/build.py
          LLVM version... Traceback (most recent call last):
            File "/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/llvmlite_008ed1517dfb4868be790fe2deeb4363/ffi/build.py", line 220, in <module>
              main()
            File "/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/llvmlite_008ed1517dfb4868be790fe2deeb4363/ffi/build.py", line 214, in main
              main_posix('osx', '.dylib')
            File "/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/llvmlite_008ed1517dfb4868be790fe2deeb4363/ffi/build.py", line 134, in main_posix
              raise RuntimeError(msg) from None
          RuntimeError: Could not find a `llvm-config` binary. There are a number of reasons this could occur, please see: https://llvmlite.readthedocs.io/en/latest/admin-guide/install.html#using-pip for help.
          error: command '/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/bin/python3.9' failed with exit code 1
          [end of output]
      
      note: This error originates from a subprocess, and is likely not a problem with pip.
      ERROR: Failed building wheel for llvmlite
      Running setup.py clean for llvmlite
    Failed to build numpy llvmlite
    ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects
    
    opened by knodl 0
  • AttributeError: 'RetentioneeringDataset' object has no attribute 'plot_graph'

    AttributeError: 'RetentioneeringDataset' object has no attribute 'plot_graph'

    The tutorial notebook (Google Colab) returns the error above when running the following code:

    data.rete.plot_graph(norm_type=None,
                         weight_col=None,
                         thresh=250)
    
    opened by StijnVanRijssel 6
Releases(2.0.1)
  • 2.0.1(Oct 8, 2020)

    Completely reworked Retentioneering workflow: functions init_config() and retention.prepare() are removed. In 2.0 it is not required to initialize “positive” and “negative” events before the analysis. You can start exploring your user behavior data first and define targets when needed as optional parameters. To access all Retentioneering tools attribute “.retention” was renamed to “.rete”. To get started with an updated workflow refer to this guide.

    plot_step_matrix() function was significantly reworked and renamed to step_matrix(). To read more about new step_matrix() functionality refer to this description

    get_edgelist(), get_adjacency() and plot_graph() functions now have customizable weighting options (total nuber of events, normalized by full dataset, normalized by nodes, etc.). To learn more please fere to this description

    new function compare() was added to compare two segments of users or test/control groups in AB test based on defined metrics. Read more about compare function in this description

    Users' behavior segmentation was reworked and now works significantly faster and updated with new functionality. For more information refer to this description

    Tools to plot user conversion funnels were reworked and improved. To learn more about new features read this description

    Source code(tar.gz)
    Source code(zip)
Owner
Retentioneering
Retentioneering RnD: Python and JS Tools to Automate Web, Mobile and other Event-based Analytics and Online Business Optimal Control
Retentioneering
Sensitivity Analysis Library in Python (Numpy). Contains Sobol, Morris, Fractional Factorial and FAST methods.

Sensitivity Analysis Library (SALib) Python implementations of commonly used sensitivity analysis methods. Useful in systems modeling to calculate the

SALib 663 Jan 05, 2023
Program that predicts the NBA mvp based on data from previous years.

NBA MVP Predictor A machine learning model using RandomForest Regression that predicts NBA MVP's using player data. Explore the docs » View Demo · Rep

Muhammad Rabee 1 Jan 21, 2022
Cold Brew: Distilling Graph Node Representations with Incomplete or Missing Neighborhoods

Cold Brew: Distilling Graph Node Representations with Incomplete or Missing Neighborhoods Introduction Graph Neural Networks (GNNs) have demonstrated

37 Dec 15, 2022
Validated, scalable, community developed variant calling, RNA-seq and small RNA analysis

Validated, scalable, community developed variant calling, RNA-seq and small RNA analysis. You write a high level configuration file specifying your in

Blue Collar Bioinformatics 917 Jan 03, 2023
EOD Historical Data Python Library (Unofficial)

EOD Historical Data Python Library (Unofficial) https://eodhistoricaldata.com Installation python3 -m pip install eodhistoricaldata Note Demo API key

Michael Whittle 20 Dec 22, 2022
Basis Set Format Converter

Basis Set Format Converter Repository for the online tool that allows you to enter a basis set in the form of text input for a variety of Quantum Chem

Manas Sharma 3 Jun 27, 2022
Extract data from a wide range of Internet sources into a pandas DataFrame.

pandas-datareader Up to date remote data access for pandas, works for multiple versions of pandas. Installation Install using pip pip install pandas-d

Python for Data 2.5k Jan 09, 2023
Churn prediction with PySpark

It is expected to develop a machine learning model that can predict customers who will leave the company.

3 Aug 13, 2021
Bearsql allows you to query pandas dataframe with sql syntax.

Bearsql adds sql syntax on pandas dataframe. It uses duckdb to speedup the pandas processing and as the sql engine

14 Jun 22, 2022
PyNHD is a part of HyRiver software stack that is designed to aid in watershed analysis through web services.

A part of HyRiver software stack that provides access to NHD+ V2 data through NLDI and WaterData web services

Taher Chegini 23 Dec 14, 2022
Python Practicum - prepare for your Data Science interview or get a refresher.

Python-Practicum Python Practicum - prepare for your Data Science interview or get a refresher. Data Data visualization using data on births from the

Jovan Trajceski 1 Jul 27, 2021
collect training and calibration data for gaze tracking

Collect Training and Calibration Data for Gaze Tracking This tool allows collecting gaze data necessary for personal calibration or training of eye-tr

Pascal 5 Dec 17, 2022
This program analyzes a DNA sequence and outputs snippets of DNA that are likely to be protein-coding genes.

This program analyzes a DNA sequence and outputs snippets of DNA that are likely to be protein-coding genes.

1 Dec 28, 2021
Lale is a Python library for semi-automated data science.

Lale is a Python library for semi-automated data science. Lale makes it easy to automatically select algorithms and tune hyperparameters of pipelines that are compatible with scikit-learn, in a type-

International Business Machines 293 Dec 29, 2022
Open source platform for Data Science Management automation

Hydrosphere examples This repo contains demo scenarios and pre-trained models to show Hydrosphere capabilities. Data and artifacts management Some mod

hydrosphere.io 6 Aug 10, 2021
Pipeline and Dataset helpers for complex algorithm evaluation.

tpcp - Tiny Pipelines for Complex Problems A generic way to build object-oriented datasets and algorithm pipelines and tools to evaluate them pip inst

Machine Learning and Data Analytics Lab FAU 3 Dec 07, 2022
Office365 (Microsoft365) audit log analysis tool

Office365 (Microsoft365) audit log analysis tool The header describes it all WHY?? The first line of code was written long time before other colleague

Anatoly 1 Jul 27, 2022
CSV database for chihuahua (HUAHUA) blockchain transactions

super-fiesta Shamelessly ripped components from https://github.com/hodgerpodger/staketaxcsv - Thanks for doing all the hard work. This code does only

Arlene Macciaveli 1 Jan 07, 2022
An Indexer that works out-of-the-box when you have less than 100K stored Documents

U100KIndexer An Indexer that works out-of-the-box when you have less than 100K stored Documents. U100K means under 100K. At 100K stored Documents with

Jina AI 7 Mar 15, 2022