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
Pandas on AWS - Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretManager, PostgreSQL, MySQL, SQLServer and S3 (Parquet, CSV, JSON and EXCEL).

AWS Data Wrangler Pandas on AWS Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretMana

Amazon Web Services - Labs 3.3k Jan 04, 2023
A columnar data container that can be compressed.

Unmaintained Package Notice Unfortunately, and due to lack of resources, the Blosc Development Team is unable to maintain this package anymore. During

944 Dec 09, 2022
Demonstrate a Dataflow pipeline that saves data from an API into BigQuery table

Overview dataflow-mvp provides a basic example pipeline that pulls data from an API and writes it to a BigQuery table using GCP's Dataflow (i.e., Apac

Chris Carbonell 1 Dec 03, 2021
Tkinter Izhikevich Neuron Model With Python

TKINTER IZHIKEVICH NEURON MODEL WITH PYTHON Hodgkin-Huxley Model It is a mathematical model for the generation and transmission of action potentials i

Rabia KOÇ 8 Jul 16, 2022
Modular analysis tools for neurophysiology data

Neuroanalysis Modular and interactive tools for analysis of neurophysiology data, with emphasis on patch-clamp electrophysiology. Functions for runnin

Allen Institute 5 Dec 22, 2021
A pipeline that creates consensus sequences from a Nanopore reads. I

A pipeline that creates consensus sequences from a Nanopore reads. It clusters reads that are similar to each other and creates a consensus that is then identified using BLAST.

Ada Madejska 2 May 15, 2022
Projects that implement various aspects of Data Engineering.

DATAWAREHOUSE ON AWS The purpose of this project is to build a datawarehouse to accomodate data of active user activity for music streaming applicatio

2 Oct 14, 2021
A Python adaption of Augur to prioritize cell types in perturbation analysis.

A Python adaption of Augur to prioritize cell types in perturbation analysis.

Theis Lab 2 Mar 29, 2022
Exploratory Data Analysis of the 2019 Indian General Elections using a dataset from Kaggle.

2019-indian-election-eda Exploratory Data Analysis of the 2019 Indian General Elections using a dataset from Kaggle. This project is a part of the Cou

Souradeep Banerjee 5 Oct 10, 2022
Finding project directories in Python (data science) projects, just like there R rprojroot and here packages

Find relative paths from a project root directory Finding project directories in Python (data science) projects, just like there R here and rprojroot

Daniel Chen 102 Nov 16, 2022
COVID-19 deaths statistics around the world

COVID-19-Deaths-Dataset COVID-19 deaths statistics around the world This is a daily updated dataset of COVID-19 deaths around the world. The dataset c

Nisa Efendioğlu 4 Jul 10, 2022
Python scripts aim to use a Random Forest machine learning algorithm to predict the water affinity of Metal-Organic Frameworks

The following Python scripts aim to use a Random Forest machine learning algorithm to predict the water affinity of Metal-Organic Frameworks (MOFs). The training set is extracted from the Cambridge S

1 Jan 09, 2022
DaCe is a parallel programming framework that takes code in Python/NumPy and other programming languages

aCe - Data-Centric Parallel Programming Decoupling domain science from performance optimization. DaCe is a parallel programming framework that takes c

SPCL 330 Dec 30, 2022
PostQF is a user-friendly Postfix queue data filter which operates on data produced by postqueue -j.

PostQF Copyright © 2022 Ralph Seichter PostQF is a user-friendly Postfix queue data filter which operates on data produced by postqueue -j. See the ma

Ralph Seichter 11 Nov 24, 2022
A Numba-based two-point correlation function calculator using a grid decomposition

A Numba-based two-point correlation function (2PCF) calculator using a grid decomposition. Like Corrfunc, but written in Numba, with simplicity and hackability in mind.

Lehman Garrison 3 Aug 24, 2022
a tool that compiles a csv of all h1 program stats

h1stats - h1 Program Stats Scraper This python3 script will call out to HackerOne's graphql API and scrape all currently active programs for informati

Evan 40 Oct 27, 2022
A program that uses an API and a AI model to get info of sotcks

Stock-Market-AI-Analysis I dont mind anyone using this code but please give me credit A program that uses an API and a AI model to get info of stocks

1 Dec 17, 2021
Reading streams of Twitter data, save them to Kafka, then process with Kafka Stream API and Spark Streaming

Using Streaming Twitter Data with Kafka and Spark Reading streams of Twitter data, publishing them to Kafka topic, process message using Kafka Stream

Rustam Zokirov 1 Dec 06, 2021
Maximum Covariance Analysis in Python

xMCA | Maximum Covariance Analysis in Python The aim of this package is to provide a flexible tool for the climate science community to perform Maximu

Niclas Rieger 39 Jan 03, 2023
A Pythonic introduction to methods for scaling your data science and machine learning work to larger datasets and larger models, using the tools and APIs you know and love from the PyData stack (such as numpy, pandas, and scikit-learn).

This tutorial's purpose is to introduce Pythonistas to methods for scaling their data science and machine learning work to larger datasets and larger models, using the tools and APIs they know and lo

Coiled 102 Nov 10, 2022