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
Udacity-api-reporting-pipeline - Udacity api reporting pipeline

udacity-api-reporting-pipeline In this exercise, you'll use portions of each of

Fabio Barbazza 1 Feb 15, 2022
TextDescriptives - A Python library for calculating a large variety of statistics from text

A Python library for calculating a large variety of statistics from text(s) using spaCy v.3 pipeline components and extensions. TextDescriptives can be used to calculate several descriptive statistic

150 Dec 30, 2022
Data-sets from the survey and analysis

bachelor-thesis "Umfragewerte.xlsx" contains the orginal survey results. "umfrage_alle.csv" contains the survey results but one participant is cancele

1 Jan 26, 2022
PyIOmica (pyiomica) is a Python package for omics analyses.

PyIOmica (pyiomica) This repository contains PyIOmica, a Python package that provides bioinformatics utilities for analyzing (dynamic) omics datasets.

G. Mias Lab 13 Jun 29, 2022
VHub - An API that permits uploading of vulnerability datasets and return of the serialized data

VHub - An API that permits uploading of vulnerability datasets and return of the serialized data

André Rodrigues 2 Feb 14, 2022
WAL enables programmable waveform analysis.

This repro introcudes the Waveform Analysis Language (WAL). The initial paper on WAL will appear at ASPDAC'22 and can be downloaded here: https://www.

Institute for Complex Systems (ICS), Johannes Kepler University Linz 40 Dec 13, 2022
TE-dependent analysis (tedana) is a Python library for denoising multi-echo functional magnetic resonance imaging (fMRI) data

tedana: TE Dependent ANAlysis TE-dependent analysis (tedana) is a Python library for denoising multi-echo functional magnetic resonance imaging (fMRI)

136 Dec 22, 2022
X-news - Pipeline data use scrapy, kafka, spark streaming, spark ML and elasticsearch, Kibana

X-news - Pipeline data use scrapy, kafka, spark streaming, spark ML and elasticsearch, Kibana

Nguyễn Quang Huy 5 Sep 28, 2022
A distributed block-based data storage and compute engine

Nebula is an extremely-fast end-to-end interactive big data analytics solution. Nebula is designed as a high-performance columnar data storage and tabular OLAP engine.

Columns AI 131 Dec 26, 2022
Employee Turnover Analysis

Employee Turnover Analysis Submission to the DataCamp competition "Can you help reduce employee turnover?"

Jannik Wiedenhaupt 1 Feb 13, 2022
Intercepting proxy + analysis toolkit for Second Life compatible virtual worlds

Hippolyzer Hippolyzer is a revival of Linden Lab's PyOGP library targeting modern Python 3, with a focus on debugging issues in Second Life-compatible

Salad Dais 6 Sep 01, 2022
An easy-to-use feature store

A feature store is a data storage system for data science and machine-learning. It can store raw data and also transformed features, which can be fed straight into an ML model or training script.

ByteHub AI 48 Dec 09, 2022
Important dataframe statistics with a single command

quick_eda Receiving dataframe statistics with one command Project description A python package for Data Scientists, Students, ML Engineers and anyone

Sven Eschlbeck 2 Dec 19, 2021
This mini project showcase how to build and debug Apache Spark application using Python

Spark app can't be debugged using normal procedure. This mini project showcase how to build and debug Apache Spark application using Python programming language. There are also options to run Spark a

Denny Imanuel 1 Dec 29, 2021
Pip install minimal-pandas-api-for-polars

Minimal Pandas API for Polars Install From PyPI: pip install minimal-pandas-api-for-polars Example Usage (see tests/test_minimal_pandas_api_for_polars

Austin Ray 6 Oct 16, 2022
PyChemia, Python Framework for Materials Discovery and Design

PyChemia, Python Framework for Materials Discovery and Design PyChemia is an open-source Python Library for materials structural search. The purpose o

Materials Discovery Group 61 Oct 02, 2022
Pypeln is a simple yet powerful Python library for creating concurrent data pipelines.

Pypeln Pypeln (pronounced as "pypeline") is a simple yet powerful Python library for creating concurrent data pipelines. Main Features Simple: Pypeln

Cristian Garcia 1.4k Dec 31, 2022
Spectacular AI SDK fuses data from cameras and IMU sensors and outputs an accurate 6-degree-of-freedom pose of a device.

Spectacular AI SDK examples Spectacular AI SDK fuses data from cameras and IMU sensors (accelerometer and gyroscope) and outputs an accurate 6-degree-

Spectacular AI 94 Jan 04, 2023
Example Of Splunk Search Query With Python And Splunk Python SDK

SSQAuto (Splunk Search Query Automation) Example Of Splunk Search Query With Python And Splunk Python SDK installation: ➜ ~ git clone https://github.c

AmirHoseinTangsiriNET 1 Nov 14, 2021
This tool parses log data and allows to define analysis pipelines for anomaly detection.

logdata-anomaly-miner This tool parses log data and allows to define analysis pipelines for anomaly detection. It was designed to run the analysis wit

AECID 32 Nov 27, 2022