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
Amundsen is a metadata driven application for improving the productivity of data analysts, data scientists and engineers when interacting with data.

Amundsen is a metadata driven application for improving the productivity of data analysts, data scientists and engineers when interacting with data.

Amundsen 3.7k Jan 3, 2023
Produces a summary CSV report of an Amber Electric customer's energy consumption and cost data.

Amber Electric Usage Summary This is a command line tool that produces a summary CSV report of an Amber Electric customer's energy consumption and cos

Graham Lea 12 May 26, 2022
Data Intelligence Applications - Online Product Advertising and Pricing with Context Generation

Data Intelligence Applications - Online Product Advertising and Pricing with Context Generation Overview Consider the scenario in which advertisement

Manuel Bressan 2 Nov 18, 2021
Python data processing, analysis, visualization, and data operations

Python This is a Python data processing, analysis, visualization and data operations of the source code warehouse, book ISBN: 9787115527592 Descriptio

FangWei 1 Jan 16, 2022
GWpy is a collaboration-driven Python package providing tools for studying data from ground-based gravitational-wave detectors

GWpy is a collaboration-driven Python package providing tools for studying data from ground-based gravitational-wave detectors. GWpy provides a user-f

GWpy 342 Jan 7, 2023
DaDRA (day-druh) is a Python library for Data-Driven Reachability Analysis.

DaDRA (day-druh) is a Python library for Data-Driven Reachability Analysis. The main goal of the package is to accelerate the process of computing estimates of forward reachable sets for nonlinear dynamical systems.

null 2 Nov 8, 2021
Utilize data analytics skills to solve real-world business problems using Humana’s big data

Humana-Mays-2021-HealthCare-Analytics-Case-Competition- The goal of the project is to utilize data analytics skills to solve real-world business probl

Yongxian (Caroline) Lun 1 Dec 27, 2021
Project: Netflix Data Analysis and Visualization with Python

Project: Netflix Data Analysis and Visualization with Python Table of Contents General Info Installation Demo Usage and Main Functionalities Contribut

Kathrin Hälbich 2 Feb 13, 2022
A real-time financial data streaming pipeline and visualization platform using Apache Kafka, Cassandra, and Bokeh.

Realtime Financial Market Data Visualization and Analysis Introduction This repo shows my project about real-time stock data pipeline. All the code is

null 6 Sep 7, 2022
A script to "SHUA" H1-2 map of Mercenaries mode of Hearthstone

lushi_script Introduction This script is to "SHUA" H1-2 map of Mercenaries mode of Hearthstone Installation Make sure you installed python>=3.6. To in

null 210 Jan 2, 2023
ForecastGA is a Python tool to forecast Google Analytics data using several popular time series models.

ForecastGA is a tool that combines a couple of popular libraries, Atspy and googleanalytics, with a few enhancements.

JR Oakes 36 Jan 3, 2023
Hatchet is a Python-based library that allows Pandas dataframes to be indexed by structured tree and graph data.

Hatchet Hatchet is a Python-based library that allows Pandas dataframes to be indexed by structured tree and graph data. It is intended for analyzing

Lawrence Livermore National Laboratory 14 Aug 19, 2022
Mortgage-loan-prediction - Show how to perform advanced Analytics and Machine Learning in Python using a full complement of PyData utilities

Mortgage-loan-prediction - Show how to perform advanced Analytics and Machine Learning in Python using a full complement of PyData utilities. This is aimed at those looking to get into the field of Data Science or those who are already in the field and looking to solve a real-world project with python.

Joachim 1 Dec 26, 2021
A collection of robust and fast processing tools for parsing and analyzing web archive data.

ChatNoir Resiliparse A collection of robust and fast processing tools for parsing and analyzing web archive data. Resiliparse is part of the ChatNoir

ChatNoir 24 Nov 29, 2022
Tokyo 2020 Paralympics, Analytics

Tokyo 2020 Paralympics, Analytics Thanks for checking out my app! It was built entirely using matplotlib and Tokyo 2020 Paralympics data. This applica

Petro Ivaniuk 1 Nov 18, 2021
Elementary is an open-source data reliability framework for modern data teams. The first module of the framework is data lineage.

Data lineage made simple, reliable, and automated. Effortlessly track the flow of data, understand dependencies and analyze impact. Features Visualiza

null 898 Jan 9, 2023
A Streamlit web-app for a data-science project that aims to evaluate if the answer to a question is helpful.

How useful is the aswer? A Streamlit web-app for a data-science project that aims to evaluate if the answer to a question is helpful. If you want to l

null 1 Dec 17, 2021
🧪 Panel-Chemistry - exploratory data analysis and build powerful data and viz tools within the domain of Chemistry using Python and HoloViz Panel.

???? ??. The purpose of the panel-chemistry project is to make it really easy for you to do DATA ANALYSIS and build powerful DATA AND VIZ APPLICATIONS within the domain of Chemistry using using Python and HoloViz Panel.

Marc Skov Madsen 97 Dec 8, 2022
Created covid data pipeline using PySpark and MySQL that collected data stream from API and do some processing and store it into MYSQL database.

Created covid data pipeline using PySpark and MySQL that collected data stream from API and do some processing and store it into MYSQL database.

null 2 Nov 20, 2021