openretailscience 0.45.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. openretailscience/__init__.py +3 -0
  2. openretailscience/analysis/__init__.py +0 -0
  3. openretailscience/analysis/cohort.py +185 -0
  4. openretailscience/analysis/composite_rank.py +372 -0
  5. openretailscience/analysis/cross_shop.py +354 -0
  6. openretailscience/analysis/customer.py +459 -0
  7. openretailscience/analysis/customer_decision_hierarchy.py +359 -0
  8. openretailscience/analysis/gain_loss.py +340 -0
  9. openretailscience/analysis/haversine.py +50 -0
  10. openretailscience/analysis/product_association.py +418 -0
  11. openretailscience/analysis/revenue_tree.py +553 -0
  12. openretailscience/assets/fonts/Poppins-Bold.ttf +0 -0
  13. openretailscience/assets/fonts/Poppins-LightItalic.ttf +0 -0
  14. openretailscience/assets/fonts/Poppins-Medium.ttf +0 -0
  15. openretailscience/assets/fonts/Poppins-Regular.ttf +0 -0
  16. openretailscience/assets/fonts/Poppins-SemiBold.ttf +0 -0
  17. openretailscience/constants.py +295 -0
  18. openretailscience/metrics/__init__.py +0 -0
  19. openretailscience/metrics/base.py +29 -0
  20. openretailscience/metrics/distribution/__init__.py +0 -0
  21. openretailscience/metrics/distribution/acv.py +81 -0
  22. openretailscience/metrics/distribution/pct_of_stores.py +118 -0
  23. openretailscience/options.py +842 -0
  24. openretailscience/plots/__init__.py +0 -0
  25. openretailscience/plots/area.py +114 -0
  26. openretailscience/plots/bar.py +375 -0
  27. openretailscience/plots/broken_timeline.py +197 -0
  28. openretailscience/plots/cohort.py +94 -0
  29. openretailscience/plots/heatmap.py +134 -0
  30. openretailscience/plots/histogram.py +276 -0
  31. openretailscience/plots/index.py +505 -0
  32. openretailscience/plots/line.py +379 -0
  33. openretailscience/plots/period_on_period.py +144 -0
  34. openretailscience/plots/price.py +275 -0
  35. openretailscience/plots/scatter.py +382 -0
  36. openretailscience/plots/styles/__init__.py +1 -0
  37. openretailscience/plots/styles/colors.py +215 -0
  38. openretailscience/plots/styles/font_utils.py +62 -0
  39. openretailscience/plots/styles/graph_utils.py +834 -0
  40. openretailscience/plots/styles/styling_helpers.py +155 -0
  41. openretailscience/plots/time.py +160 -0
  42. openretailscience/plots/tree_diagram.py +813 -0
  43. openretailscience/plots/venn.py +127 -0
  44. openretailscience/plots/waterfall.py +217 -0
  45. openretailscience/plugin.py +238 -0
  46. openretailscience/segmentation/__init__.py +0 -0
  47. openretailscience/segmentation/hml.py +97 -0
  48. openretailscience/segmentation/nlr.py +218 -0
  49. openretailscience/segmentation/rfm.py +307 -0
  50. openretailscience/segmentation/segstats.py +1177 -0
  51. openretailscience/segmentation/threshold.py +165 -0
  52. openretailscience/utils/__init__.py +0 -0
  53. openretailscience/utils/date.py +226 -0
  54. openretailscience/utils/filter_and_label.py +52 -0
  55. openretailscience/utils/label.py +79 -0
  56. openretailscience/utils/validation.py +45 -0
  57. openretailscience-0.45.0.dist-info/METADATA +364 -0
  58. openretailscience-0.45.0.dist-info/RECORD +60 -0
  59. openretailscience-0.45.0.dist-info/WHEEL +4 -0
  60. openretailscience-0.45.0.dist-info/licenses/LICENSE +93 -0
@@ -0,0 +1,364 @@
1
+ Metadata-Version: 2.4
2
+ Name: openretailscience
3
+ Version: 0.45.0
4
+ Summary: Retail Data Science Tools
5
+ Author-email: Murray Vanwyk <2493311+mvanwyk@users.noreply.github.com>
6
+ License-Expression: Elastic-2.0
7
+ License-File: LICENSE
8
+ Classifier: License :: Other/Proprietary License
9
+ Classifier: Operating System :: OS Independent
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Requires-Python: <3.14,>=3.10
16
+ Requires-Dist: duckdb<1.4,>=1.1.0
17
+ Requires-Dist: ibis-framework[duckdb]<11,>=10.0.0
18
+ Requires-Dist: matplotlib-set-diagrams<0.3.0,>=0.0.2
19
+ Requires-Dist: matplotlib<4,>=3.9.1
20
+ Requires-Dist: numpy<3,>=1.26.3
21
+ Requires-Dist: pandas<3,>=2.2.3
22
+ Requires-Dist: pyarrow<24,>=18.0.0
23
+ Requires-Dist: scikit-learn<2,>=1.4.2
24
+ Requires-Dist: scipy<2,>=1.14.1
25
+ Requires-Dist: textalloc>=1.2.1
26
+ Requires-Dist: toml<0.11,>=0.10.2
27
+ Requires-Dist: tqdm<5,>=4.66.1
28
+ Description-Content-Type: text/markdown
29
+
30
+ <!-- README.md -->
31
+ ![OpenRetailScience Logo](https://raw.githubusercontent.com/Data-Simply/openretailscience/main/readme_assets/logo.png)
32
+
33
+ # OpenRetailScience
34
+
35
+ ⚡ Rapid bespoke and deep dive retail analytics ⚡
36
+
37
+ OpenRetailScience equips you with a wide array of retail analytical capabilities,
38
+ from segmentations to gain-loss analysis. Leave the mundane to us and elevate your role
39
+ from data janitor to insights virtuoso.
40
+
41
+ ## Installation
42
+
43
+ To get the latest release:
44
+
45
+ ```bash
46
+ pip install openretailscience
47
+ ```
48
+
49
+ Alternatively, if you want the very latest version of the package you can install it from GitHub:
50
+
51
+ ```bash
52
+ pip install git+https://github.com/Data-Simply/openretailscience.git
53
+ ```
54
+
55
+ ## Features
56
+
57
+ - **Tailored for Retail**: Leverage pre-built functions designed specifically for retail analytics. From customer
58
+ segmentations to gains loss analysis, OpenRetailScience provides over a dozen building blocks you need to tackle
59
+ retail-specific challenges efficiently and effectively.
60
+
61
+ ![New Store Cannibalization Analysis](https://raw.githubusercontent.com/Data-Simply/openretailscience/main/readme_assets/new_store_cannibalization.png)
62
+
63
+ - **Reliable Results**: Built with extensive unit testing and best practices, OpenRetailScience ensures the accuracy
64
+ and reliability of your analyses. Confidently present your findings, knowing they're backed by a robust,
65
+ well-tested framework.
66
+
67
+ - **Professional Charts**: Say goodbye to hours of tweaking chart styles. OpenRetailScience delivers beautifully
68
+ standardized visualizations that are presentation-ready with just a few lines of code. Impress stakeholders and
69
+ save time with our pre-built, customizable chart templates.
70
+
71
+ ![Cross Shop Analysis Chart](https://raw.githubusercontent.com/Data-Simply/openretailscience/main/readme_assets/cross_shop_chart.png)
72
+
73
+ - **Workflow Automation**: OpenRetailScience streamlines your workflow by automating common retail analytics tasks.
74
+ Easily loop analyses over different dimensions like product categories or countries, and seamlessly use the output
75
+ of one analysis as input for another. Spend less time on data manipulation and more on generating valuable insights.
76
+
77
+ ## Examples
78
+
79
+ ### Gains Loss Analysis
80
+
81
+ Here is an excerpt from the gain loss analysis example [notebook](https://openretailscience.datasimply.co/examples/gain_loss/)
82
+
83
+ ```python
84
+ from openretailscience.analysis.gain_loss import GainLoss
85
+
86
+ gl = GainLoss(
87
+ df,
88
+ # Flag the rows of period 1
89
+ p1_index=time_period_1,
90
+ # Flag the rows of period 2
91
+ p2_index=time_period_2,
92
+ # Flag which rows are part of the focus group.
93
+ # Namely, which rows are Calvin Klein sales
94
+ focus_group_index=df["brand_name"] == "Calvin Klein",
95
+ focus_group_name="Calvin Klein",
96
+ # Flag which rows are part of the comparison group.
97
+ # Namely, which rows are Diesel sales
98
+ comparison_group_index=df["brand_name"] == "Diesel",
99
+ comparison_group_name="Diesel",
100
+ # Finally we specifiy that we want to calculate
101
+ # the gain/loss in total revenue
102
+ value_col="total_price",
103
+ )
104
+ # Ok now let's plot the result
105
+ gl.plot(
106
+ x_label="Revenue Change",
107
+ source_text="Transactions 2023-01-01 to 2023-12-31",
108
+ move_legend_outside=True,
109
+ )
110
+ plt.show()
111
+ ```
112
+
113
+ ![Cross Shop Analysis Chart](https://raw.githubusercontent.com/Data-Simply/openretailscience/main/readme_assets/gain_loss_chart.png)
114
+
115
+ ### Cross Shop Analysis
116
+
117
+ Here is an excerpt from the cross shop analysis example [notebook](https://openretailscience.datasimply.co/examples/cross_shop/)
118
+
119
+ ```python
120
+ from openretailscience.analysis import cross_shop
121
+
122
+ cs = cross_shop.CrossShop(
123
+ df,
124
+ group_1_col="category_name",
125
+ group_1_val="Jeans",
126
+ group_2_col="category_name",
127
+ group_2_val="Shoes",
128
+ group_3_col="category_name",
129
+ group_3_val="Dresses",
130
+ labels=["Jeans", "Shoes", "Dresses"],
131
+ )
132
+ cs.plot(
133
+ title="Jeans are a popular cross-shopping category with dresses",
134
+ source_text="Source: Transactions 2023-01-01 to 2023-12-31",
135
+ figsize=(6, 6),
136
+ )
137
+ plt.show()
138
+ # Let's see which customers were in which groups
139
+ display(cs.cross_shop_df.head())
140
+ # And the totals for all groups
141
+ display(cs.cross_shop_table_df)
142
+ ```
143
+
144
+ ![Cross Shop Analysis Chart](https://raw.githubusercontent.com/Data-Simply/openretailscience/main/readme_assets/cross_shop_chart.png)
145
+
146
+ ### Customer Retention Analysis
147
+
148
+ Here is an excerpt from the customer retention analysis example [notebook](https://openretailscience.datasimply.co/examples/retention/)
149
+
150
+ ```python
151
+ ax = dbp.plot(
152
+ figsize=(10, 5),
153
+ bins=20,
154
+ cumulative=True,
155
+ draw_percentile_line=True,
156
+ percentile_line=0.8,
157
+ source_text="Source: Transactions in 2023",
158
+ title="When Do Customers Make Their Next Purchase?",
159
+ )
160
+
161
+ # Let's dress up the chart a bit of text and get rid of the legend
162
+ churn_period = dbp.purchases_percentile(0.8)
163
+ ax.annotate(
164
+ f"80% of customers made\nanother purchase within\n{round(churn_period)} days",
165
+ xy=(churn_period, 0.81),
166
+ xytext=(dbp.purchase_dist_s.min(), 0.8),
167
+ fontsize=15,
168
+ ha="left",
169
+ va="center",
170
+ arrowprops=dict(facecolor="black", arrowstyle="-|>", connectionstyle="arc3,rad=-0.25", mutation_scale=25),
171
+ )
172
+ ax.legend().set_visible(False)
173
+ plt.show()
174
+ ```
175
+
176
+ ![Cumulative Next Purchase Chart](https://raw.githubusercontent.com/Data-Simply/openretailscience/main/readme_assets/days_until_next_purchase.png)
177
+
178
+ ## Documentation
179
+
180
+ Please see [this site](https://openretailscience.datasimply.co/) for full documentation, which includes:
181
+
182
+ - [Analysis Modules](https://openretailscience.datasimply.co/analysis_modules/): Overview of the framework and the
183
+ structure of the docs.
184
+ - [Examples](https://openretailscience.datasimply.co/examples/retention/): If you're looking to build something
185
+ specific or are more of a hands-on learner, check out our examples. This is the best place to get started.
186
+ - [API Reference](https://openretailscience.datasimply.co/api/gain_loss/): Thorough documentation of every class
187
+ and method.
188
+
189
+ ## Contributing
190
+
191
+ We welcome contributions from the community to enhance and improve OpenRetailScience. To contribute,
192
+ please follow these steps:
193
+
194
+ 1. Fork the repository.
195
+ 2. Create a new branch for your feature or bug fix.
196
+ 3. Make your changes and commit them with clear messages.
197
+ 4. Push your changes to your fork.
198
+ 5. Open a pull request to the main repository's `main` branch.
199
+
200
+ Please make sure to follow the existing coding style and provide unit tests for new features.
201
+
202
+ ## Contact / Support
203
+
204
+ This repository is supported by Data simply.
205
+
206
+ If you are interested in seeing what Data Simply can do for you, then please email
207
+ [email us](mailto:murray@datasimply.co). We work with companies at a variety of scales and with varying levels of
208
+ data and retail analytics sophistication, to help them build, scale or streamline their analysis capabilities.
209
+
210
+ ## Contributors
211
+
212
+ <a href="https://github.com/Data-Simply/openretailscience/graphs/contributors">
213
+ <img src="https://contrib.rocks/image?repo=Data-Simply/openretailscience" alt="Contributors" />
214
+ </a>
215
+
216
+ Made with [contrib.rocks](https://contrib.rocks).
217
+
218
+ ## Acknowledgements
219
+
220
+ Built with expertise doing analytics and data science for scale-ups to multi-nationals, including:
221
+
222
+ - Loblaws
223
+ - Dominos
224
+ - Sainbury's
225
+ - IKI
226
+ - Migros
227
+ - Sephora
228
+ - Nectar
229
+ - Metro
230
+ - Coles
231
+ - GANNI
232
+ - Mindful Chef
233
+ - Auchan
234
+ - Attraction Tickets Direct
235
+ - Roman Originals
236
+
237
+ ## Testing
238
+
239
+ OpenRetailScience includes comprehensive unit and integration tests to ensure reliability across different backends.
240
+
241
+ ### Unit Tests
242
+
243
+ Run unit tests using pytest:
244
+
245
+ ```bash
246
+ # Install dependencies
247
+ uv sync
248
+
249
+ # Run all unit tests
250
+ uv run pytest
251
+
252
+ # Run specific test file
253
+ uv run pytest tests/test_file.py
254
+
255
+ # Run with coverage
256
+ uv run pytest --cov=openretailscience
257
+ ```
258
+
259
+ ### Multi-Python Version Testing
260
+
261
+ OpenRetailScience supports Python 3.10, 3.11, 3.12, and 3.13. You can test across all supported versions locally using tox:
262
+
263
+ ```bash
264
+ # Test all supported Python versions
265
+ tox -e py310,py311,py312,py313
266
+
267
+ # Test specific Python version
268
+ tox -e py313
269
+
270
+ # Run tests in parallel across versions
271
+ tox -p auto
272
+ ```
273
+
274
+ **Prerequisites:**
275
+
276
+ - Multiple Python versions installed on your system
277
+ - tox installed (`uv sync` installs it automatically)
278
+
279
+ ### Integration Tests
280
+
281
+ Integration tests verify that all analysis modules work correctly with distributed computing engines (PySpark,
282
+ BigQuery, and Snowflake). These tests ensure the Ibis-based code paths function properly across different execution
283
+ environments.
284
+
285
+ #### PySpark Integration Tests
286
+
287
+ The PySpark integration tests run locally using the same pytest framework as other tests.
288
+
289
+ **Prerequisites:**
290
+
291
+ - Python environment with dependencies installed (`uv sync`)
292
+
293
+ **Running locally:**
294
+
295
+ ```bash
296
+ # Run all PySpark tests
297
+ uv run pytest tests/integration -k "pyspark" -v
298
+
299
+ # Run specific PySpark test
300
+ uv run pytest tests/integration/test_cohort_analysis.py -k "pyspark" -v
301
+ ```
302
+
303
+ #### BigQuery Integration Tests
304
+
305
+ The BigQuery integration tests verify compatibility with Google BigQuery as a backend.
306
+
307
+ **Prerequisites:**
308
+
309
+ - Access to a Google Cloud Platform account
310
+ - A service account with BigQuery permissions
311
+ - The service account key JSON file
312
+ - The test dataset loaded in BigQuery (dataset: `test_data`, table: `transactions`)
313
+
314
+ **Running locally:**
315
+
316
+ ```bash
317
+ # Set up authentication
318
+ export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/service-account-key.json
319
+ export GCP_PROJECT_ID=your-project-id
320
+
321
+ # Install dependencies
322
+ uv sync
323
+
324
+ # Run all BigQuery tests
325
+ uv run pytest tests/integration -k "bigquery" -v
326
+
327
+ # Run specific test module
328
+ uv run pytest tests/integration/bigquery/test_cohort_analysis.py -v
329
+ ```
330
+
331
+ #### Snowflake Integration Tests
332
+
333
+ The Snowflake integration tests verify compatibility with Snowflake as a backend.
334
+
335
+ **Prerequisites:**
336
+
337
+ - Access to a Snowflake account with a warehouse, database, and schema configured
338
+ - A key-pair authentication private key (PEM format) for the Snowflake user
339
+ - The test dataset loaded in Snowflake (table: `TRANSACTIONS`)
340
+
341
+ **Running locally:**
342
+
343
+ ```bash
344
+ # Set up Snowflake connection
345
+ export SNOWFLAKE_CI_ACCOUNT=your-account-identifier
346
+ export SNOWFLAKE_CI_USER=your-username
347
+ export SNOWFLAKE_CI_WAREHOUSE=your-warehouse
348
+ export SNOWFLAKE_CI_DATABASE=your-database
349
+ export SNOWFLAKE_CI_SCHEMA=your-schema
350
+ export SNOWFLAKE_CI_PRIVATE_KEY_PATH=/path/to/your/private-key.p8
351
+
352
+ # Install dependencies
353
+ uv sync
354
+
355
+ # Run all Snowflake tests
356
+ uv run pytest tests/integration -k "snowflake" -v
357
+
358
+ # Run specific test module
359
+ uv run pytest tests/integration/test_cohort_analysis.py -k "snowflake" -v
360
+ ```
361
+
362
+ ## License
363
+
364
+ This project is licensed under the Elastic License 2.0 - see the [LICENSE](LICENSE) file for details.
@@ -0,0 +1,60 @@
1
+ openretailscience/__init__.py,sha256=27Jl2goYYpCHzIMhvgR5PM-HeyO4iHTEYVkk2bB5Cwc,82
2
+ openretailscience/constants.py,sha256=jjwi0VPijLmEuhgEhshACQEMK22UvI2Keqr0uL3IkbU,6573
3
+ openretailscience/options.py,sha256=_Z3iLqe8Da754w9I6AQEU7bcm4VrtxpIOTLI-5m1i5U,36682
4
+ openretailscience/plugin.py,sha256=oLGhDArdd-cLogQZ3MNqH8NosWZQ7buZO3cyikZbgHY,9404
5
+ openretailscience/analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ openretailscience/analysis/cohort.py,sha256=fceC_hfjBnmZ8iehWFQy_yCIB8MCoWAZ-i_ZqXZJ2_g,8044
7
+ openretailscience/analysis/composite_rank.py,sha256=Cc5w81jArle4p3AJsrjQ4XHNxXLNR8mJlxqStdtdfGc,16465
8
+ openretailscience/analysis/cross_shop.py,sha256=0Fcya5bEN1LQ-scHje9grI29FTJpBtuT5yFYMLB69rU,14891
9
+ openretailscience/analysis/customer.py,sha256=8UFUhY4XFiFruTJ5F4GUifxteh87wVhHitW-Y5vdMKE,18824
10
+ openretailscience/analysis/customer_decision_hierarchy.py,sha256=ds83Vp_1gh4CNXOmsXRDayotZQ-tRFsHPIXAbKV38m8,15202
11
+ openretailscience/analysis/gain_loss.py,sha256=WQ03nOIc9nB9q9lNS6hoR47dtRTPzs7HZd5MirMG_wI,14086
12
+ openretailscience/analysis/haversine.py,sha256=yF4YCEqwDiy0Ja_K6RKYbcFZcTZb0H6NVObKE4BVVXU,1922
13
+ openretailscience/analysis/product_association.py,sha256=_-cuDNChCtUlzTynFwwz7WpCzHJuKNogg9jqFrF-NHA,18928
14
+ openretailscience/analysis/revenue_tree.py,sha256=HmAyC_0RyY_SN1qX6QiMy4yzoRHIhZEUkxyr6fYa4oo,24541
15
+ openretailscience/assets/fonts/Poppins-Bold.ttf,sha256=chlUfuJTNMusD-SzrPC_Yx5I67YixxrwOO2qplLGCHU,153944
16
+ openretailscience/assets/fonts/Poppins-LightItalic.ttf,sha256=bQCqVTHIuLoJNN55JZhcZjbJn7yJtMn3lin7SpBnZU8,184460
17
+ openretailscience/assets/fonts/Poppins-Medium.ttf,sha256=jZCYg96BNE4PvP7zDpMYcuktmu7N-Fttz24LKMB46Y4,156520
18
+ openretailscience/assets/fonts/Poppins-Regular.ttf,sha256=cH_cXIurV6kAYcao7Xtw1f-4L8gQ6ZTnn5C6zokMJVo,158240
19
+ openretailscience/assets/fonts/Poppins-SemiBold.ttf,sha256=JIwCRLNQ7GiICZaqa-bXeWJ0tJmS1fy77-JRkGqk6jY,155232
20
+ openretailscience/metrics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ openretailscience/metrics/base.py,sha256=rMI9sWeZM1AeL4iy8C0enK1TTvIJn1UzGvaEjRZXJAM,892
22
+ openretailscience/metrics/distribution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ openretailscience/metrics/distribution/acv.py,sha256=z_fcfQmMN65PUhelW1WLqh9FxAgoZv8XEoBEHzuCEwE,2591
24
+ openretailscience/metrics/distribution/pct_of_stores.py,sha256=Hyargq8_bzTJYzqMGxbl1sel_QlMfNH4YCLadM2FKkM,4522
25
+ openretailscience/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ openretailscience/plots/area.py,sha256=1I8GA928Tfo0pGKEVK-UqUQSXqnc4hQKckci0ZAcSXE,4683
27
+ openretailscience/plots/bar.py,sha256=NQtvWUnE42bpY2li_OjHTbdLNYhzTE1YIYGfe4bFIJI,15788
28
+ openretailscience/plots/broken_timeline.py,sha256=I7W3IBE2Co_m8NIuir6Sl19iUtE766Rud0vhPehenQ8,7624
29
+ openretailscience/plots/cohort.py,sha256=112dyuRmBShTKX70SesyE-2vcagdU2XEKzHrUkmD-_8,3318
30
+ openretailscience/plots/heatmap.py,sha256=VFBRhd39fHYwdu-dLP5pOJA8HxO5rX26e9Q6TevAzHk,5426
31
+ openretailscience/plots/histogram.py,sha256=myCuHvjC_qSWM2ZhwwZ407ffMRBAW42AU6cXuwihFCU,10902
32
+ openretailscience/plots/index.py,sha256=AwFBRXXZZvVIw0g1WuONRy9d3pKXH0pLqYrWzklrZGA,22029
33
+ openretailscience/plots/line.py,sha256=b2ahk0GQqps8mIZZMMKrbdAOPY1U7o0QgmcMq1eNZTw,15453
34
+ openretailscience/plots/period_on_period.py,sha256=r1yVWMND3qAwduF3fySR8TAFbVK4ZQId9TgN4ACfrtw,5239
35
+ openretailscience/plots/price.py,sha256=MHbuVEQzJ3rjFfNl6d8Coedm6sKdkz1J6Tzxa0AwiWY,10644
36
+ openretailscience/plots/scatter.py,sha256=CbUGfcu9lAMIs6nNrUOk89v_-Jxzg84Yp0u3wePcq5w,14955
37
+ openretailscience/plots/time.py,sha256=ggNSZqqK0Rhi2cLSdF9rJSa4Q33ix76EKXuomV6uwcg,7260
38
+ openretailscience/plots/tree_diagram.py,sha256=OsK3dHHL3m5zrTUGkYXzfv1ORhyewnYUUG3Lw4-v3-U,28509
39
+ openretailscience/plots/venn.py,sha256=P9eptzx638I6elgbXZkt00n7AtMR-FgXQ3yOADZJVf8,5160
40
+ openretailscience/plots/waterfall.py,sha256=6f7ZC4iH9vgA6yKtf5LOh-29oxUXYhnWOvfUWBb40yA,8356
41
+ openretailscience/plots/styles/__init__.py,sha256=jiDjp9iBbMBGN94XUj_op79R5elclijpLckpO8f-S-E,53
42
+ openretailscience/plots/styles/colors.py,sha256=BSYF5K2MkN2svtHVc6hno49FNxtRoifGXqhvVFUVv2s,7136
43
+ openretailscience/plots/styles/font_utils.py,sha256=wFsSkqM0BScZBmKn6sCjV4LyZuNkqkc-ly0K7NvX0PY,2287
44
+ openretailscience/plots/styles/graph_utils.py,sha256=qkEQi8UeGB7vCwbACf7px7p_piYfQ8mSlqV-Cbak0mw,31688
45
+ openretailscience/plots/styles/styling_helpers.py,sha256=XfAfqalEZI2aFBXiEvZWvn-kzTu_UwzOq7C7EK5cMsI,6402
46
+ openretailscience/segmentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
+ openretailscience/segmentation/hml.py,sha256=xWMUjafCUyutocLxE1qiXMg5-DwLmtmtGQm1tp02wig,4380
48
+ openretailscience/segmentation/nlr.py,sha256=nrUw5tVEocLAbAA6uTHUanEoMhOYKvBylhCU2Z7ci_Q,9542
49
+ openretailscience/segmentation/rfm.py,sha256=68LUzfdFISf_6m1gWAQNmk6vK96Itu5lW_JJMpfVsSs,13915
50
+ openretailscience/segmentation/segstats.py,sha256=mROHGW75JrJRUpgFpeQjYu5dDt9-0_geV3CWvRSRj4M,53668
51
+ openretailscience/segmentation/threshold.py,sha256=3P5Q5eX8qtpUzbzTPHzIx3aY1npg8vDjQx9iS-7xw0U,7032
52
+ openretailscience/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ openretailscience/utils/date.py,sha256=6k2jgOLkWEoMIhYV8rimvZo2Ho-CI4D3Up564NKBGVs,9018
54
+ openretailscience/utils/filter_and_label.py,sha256=0AQemPxJBdRWEwuq85HCC5nMGIJegTIODbbhT3PudWY,2160
55
+ openretailscience/utils/label.py,sha256=5YsoJldhFEw_yznEMNC1pOGDqK5Owp3S3sS0Ms26KlY,3497
56
+ openretailscience/utils/validation.py,sha256=cc604ZIc2PWcrNq87C6gcPA0Qkux4YEx4FH-j8zPBw0,1536
57
+ openretailscience-0.45.0.dist-info/METADATA,sha256=QDqhpKD2O4m-1hjXvbGTrVTqMzNocJAh2wkvGB6QYik,11715
58
+ openretailscience-0.45.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
59
+ openretailscience-0.45.0.dist-info/licenses/LICENSE,sha256=SCVQGLQfwOllsRFa9-Z3m8IYu4pnR9Vh2oANUCJiKqI,3860
60
+ openretailscience-0.45.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,93 @@
1
+ Elastic License 2.0
2
+
3
+ URL: https://www.elastic.co/licensing/elastic-license
4
+
5
+ ## Acceptance
6
+
7
+ By using the software, you agree to all of the terms and conditions below.
8
+
9
+ ## Copyright License
10
+
11
+ The licensor grants you a non-exclusive, royalty-free, worldwide,
12
+ non-sublicensable, non-transferable license to use, copy, distribute, make
13
+ available, and prepare derivative works of the software, in each case subject to
14
+ the limitations and conditions below.
15
+
16
+ ## Limitations
17
+
18
+ You may not provide the software to third parties as a hosted or managed
19
+ service, where the service provides users with access to any substantial set of
20
+ the features or functionality of the software.
21
+
22
+ You may not move, change, disable, or circumvent the license key functionality
23
+ in the software, and you may not remove or obscure any functionality in the
24
+ software that is protected by the license key.
25
+
26
+ You may not alter, remove, or obscure any licensing, copyright, or other notices
27
+ of the licensor in the software. Any use of the licensor’s trademarks is subject
28
+ to applicable law.
29
+
30
+ ## Patents
31
+
32
+ The licensor grants you a license, under any patent claims the licensor can
33
+ license, or becomes able to license, to make, have made, use, sell, offer for
34
+ sale, import and have imported the software, in each case subject to the
35
+ limitations and conditions in this license. This license does not cover any
36
+ patent claims that you cause to be infringed by modifications or additions to
37
+ the software. If you or your company make any written claim that the software
38
+ infringes or contributes to infringement of any patent, your patent license for
39
+ the software granted under these terms ends immediately. If your company makes
40
+ such a claim, your patent license ends immediately for work on behalf of your
41
+ company.
42
+
43
+ ## Notices
44
+
45
+ You must ensure that anyone who gets a copy of any part of the software from you
46
+ also gets a copy of these terms.
47
+
48
+ If you modify the software, you must include in any modified copies of the
49
+ software prominent notices stating that you have modified the software.
50
+
51
+ ## No Other Rights
52
+
53
+ These terms do not imply any licenses other than those expressly granted in
54
+ these terms.
55
+
56
+ ## Termination
57
+
58
+ If you use the software in violation of these terms, such use is not licensed,
59
+ and your licenses will automatically terminate. If the licensor provides you
60
+ with a notice of your violation, and you cease all violation of this license no
61
+ later than 30 days after you receive that notice, your licenses will be
62
+ reinstated retroactively. However, if you violate these terms after such
63
+ reinstatement, any additional violation of these terms will cause your licenses
64
+ to terminate automatically and permanently.
65
+
66
+ ## No Liability
67
+
68
+ *As far as the law allows, the software comes as is, without any warranty or
69
+ condition, and the licensor will not be liable to you for any damages arising
70
+ out of these terms or the use or nature of the software, under any kind of
71
+ legal claim.*
72
+
73
+ ## Definitions
74
+
75
+ The **licensor** is the entity offering these terms, and the **software** is the
76
+ software the licensor makes available under these terms, including any portion
77
+ of it.
78
+
79
+ **you** refers to the individual or entity agreeing to these terms.
80
+
81
+ **your company** is any legal entity, sole proprietorship, or other kind of
82
+ organization that you work for, plus all organizations that have control over,
83
+ are under the control of, or are under common control with that
84
+ organization. **control** means ownership of substantially all the assets of an
85
+ entity, or the power to direct its management and policies by vote, contract, or
86
+ otherwise. Control can be direct or indirect.
87
+
88
+ **your licenses** are all the licenses granted to you for the software under
89
+ these terms.
90
+
91
+ **use** means anything you do with the software requiring one of your licenses.
92
+
93
+ **trademark** means trademarks, service marks, and similar rights.