huff 1.1.0__tar.gz → 1.1.1__tar.gz

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 (31) hide show
  1. huff-1.1.1/PKG-INFO +49 -0
  2. huff-1.1.1/README.md +41 -0
  3. {huff-1.1.0 → huff-1.1.1}/huff/gistools.py +2 -2
  4. {huff-1.1.0 → huff-1.1.1}/huff/models.py +134 -5
  5. {huff-1.1.0 → huff-1.1.1}/huff/ors.py +21 -20
  6. {huff-1.1.0 → huff-1.1.1}/huff/tests/tests_huff.py +8 -2
  7. huff-1.1.1/huff.egg-info/PKG-INFO +49 -0
  8. {huff-1.1.0 → huff-1.1.1}/setup.py +1 -1
  9. huff-1.1.0/PKG-INFO +0 -23
  10. huff-1.1.0/README.md +0 -15
  11. huff-1.1.0/huff.egg-info/PKG-INFO +0 -23
  12. {huff-1.1.0 → huff-1.1.1}/MANIFEST.in +0 -0
  13. {huff-1.1.0 → huff-1.1.1}/huff/__init__.py +0 -0
  14. {huff-1.1.0 → huff-1.1.1}/huff/tests/__init__.py +0 -0
  15. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach.cpg +0 -0
  16. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach.dbf +0 -0
  17. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach.prj +0 -0
  18. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach.qmd +0 -0
  19. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach.shp +0 -0
  20. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach.shx +0 -0
  21. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach_supermarkets.cpg +0 -0
  22. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach_supermarkets.dbf +0 -0
  23. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach_supermarkets.prj +0 -0
  24. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach_supermarkets.qmd +0 -0
  25. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach_supermarkets.shp +0 -0
  26. {huff-1.1.0 → huff-1.1.1}/huff/tests/data/Haslach_supermarkets.shx +0 -0
  27. {huff-1.1.0 → huff-1.1.1}/huff.egg-info/SOURCES.txt +0 -0
  28. {huff-1.1.0 → huff-1.1.1}/huff.egg-info/dependency_links.txt +0 -0
  29. {huff-1.1.0 → huff-1.1.1}/huff.egg-info/requires.txt +0 -0
  30. {huff-1.1.0 → huff-1.1.1}/huff.egg-info/top_level.txt +0 -0
  31. {huff-1.1.0 → huff-1.1.1}/setup.cfg +0 -0
huff-1.1.1/PKG-INFO ADDED
@@ -0,0 +1,49 @@
1
+ Metadata-Version: 2.1
2
+ Name: huff
3
+ Version: 1.1.1
4
+ Summary: huff: Huff Model Market Area Analysis
5
+ Author: Thomas Wieland
6
+ Author-email: geowieland@googlemail.com
7
+ Description-Content-Type: text/markdown
8
+
9
+ # huff: Huff Model Market Area Analysis
10
+
11
+ ## Author
12
+
13
+ Thomas Wieland [ORCID](https://orcid.org/0000-0001-5168-9846) [EMail](mailto:geowieland@googlemail.com)
14
+
15
+ See the /tests directory for usage examples of most of the included functions.
16
+
17
+
18
+ ## Features
19
+
20
+ - **Huff Model**:
21
+ - Defining origins and destinations with weightings
22
+ - Creating interaction matrix from origins and destinations
23
+ - Calculating basic Huff Model
24
+ - **Multiplicative Competitive Interaction Model**:
25
+ - Log-centering transformation
26
+ - **OpenRouteService Client** (Tools via API):
27
+ - Creating transport costs matrix from origins and destinations
28
+ - Creating isochrones from destinations
29
+
30
+ Attribution of OpenRouteService:
31
+ © openrouteservice.org by HeiGIT | Map data © OpenStreetMap contributors
32
+ Visit https://openrouteservice.org/
33
+
34
+ ## Literature
35
+ - Huff DL (1962) *Determination of Intra-Urban Retail Trade Areas*.
36
+ - Huff DL (1964) Defining and estimating a trading area. *Journal of Marketing* 28(4): 34–38. [10.2307/1249154](https://doi.org/10.2307/1249154)
37
+ - Huff DL, McCallum BM (2008) Calibrating the Huff Model using ArcGIS Business Analyst. ESRI White Paper, September 2008. https://www.esri.com/library/whitepapers/pdfs/calibrating-huff-model.pdf.
38
+ - De Beule M, Van den Poel D, Van de Weghe N (2014) An extended Huff-model for robustly benchmarking and predicting retail network performance. *Applied Geography*,* 46(1): 80–89. [10.1016/j.apgeog.2013.09.026](https://doi.org/10.1016/j.apgeog.2013.09.026)
39
+ - Nakanishi M, Cooper LG (1974) Parameter estimation for a Multiplicative Competitive Interaction Model: Least squares approach. *Journal of Marketing Research* 11(3): 303–311. [10.2307/3151146](https://doi.org/10.2307/3151146).
40
+ - Wieland T (2017) Market Area Analysis for Retail and Service Locations with MCI. *R Journal* 9(1): 298-323. [10.32614/RJ-2017-020](https://doi.org/10.32614/RJ-2017-020)
41
+ - Wieland T (2018) A Hurdle Model Approach of Store Choice and Market Area Analysis in Grocery Retailing. *Papers in Applied Geography* 4(4): 370-389. [10.1080/23754931.2018.1519458](https://doi.org/10.1080/23754931.2018.1519458)
42
+
43
+
44
+ ## Installation
45
+
46
+ To install the package, use `pip`:
47
+
48
+ ```bash
49
+ pip install huff
huff-1.1.1/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # huff: Huff Model Market Area Analysis
2
+
3
+ ## Author
4
+
5
+ Thomas Wieland [ORCID](https://orcid.org/0000-0001-5168-9846) [EMail](mailto:geowieland@googlemail.com)
6
+
7
+ See the /tests directory for usage examples of most of the included functions.
8
+
9
+
10
+ ## Features
11
+
12
+ - **Huff Model**:
13
+ - Defining origins and destinations with weightings
14
+ - Creating interaction matrix from origins and destinations
15
+ - Calculating basic Huff Model
16
+ - **Multiplicative Competitive Interaction Model**:
17
+ - Log-centering transformation
18
+ - **OpenRouteService Client** (Tools via API):
19
+ - Creating transport costs matrix from origins and destinations
20
+ - Creating isochrones from destinations
21
+
22
+ Attribution of OpenRouteService:
23
+ © openrouteservice.org by HeiGIT | Map data © OpenStreetMap contributors
24
+ Visit https://openrouteservice.org/
25
+
26
+ ## Literature
27
+ - Huff DL (1962) *Determination of Intra-Urban Retail Trade Areas*.
28
+ - Huff DL (1964) Defining and estimating a trading area. *Journal of Marketing* 28(4): 34–38. [10.2307/1249154](https://doi.org/10.2307/1249154)
29
+ - Huff DL, McCallum BM (2008) Calibrating the Huff Model using ArcGIS Business Analyst. ESRI White Paper, September 2008. https://www.esri.com/library/whitepapers/pdfs/calibrating-huff-model.pdf.
30
+ - De Beule M, Van den Poel D, Van de Weghe N (2014) An extended Huff-model for robustly benchmarking and predicting retail network performance. *Applied Geography*,* 46(1): 80–89. [10.1016/j.apgeog.2013.09.026](https://doi.org/10.1016/j.apgeog.2013.09.026)
31
+ - Nakanishi M, Cooper LG (1974) Parameter estimation for a Multiplicative Competitive Interaction Model: Least squares approach. *Journal of Marketing Research* 11(3): 303–311. [10.2307/3151146](https://doi.org/10.2307/3151146).
32
+ - Wieland T (2017) Market Area Analysis for Retail and Service Locations with MCI. *R Journal* 9(1): 298-323. [10.32614/RJ-2017-020](https://doi.org/10.32614/RJ-2017-020)
33
+ - Wieland T (2018) A Hurdle Model Approach of Store Choice and Market Area Analysis in Grocery Retailing. *Papers in Applied Geography* 4(4): 370-389. [10.1080/23754931.2018.1519458](https://doi.org/10.1080/23754931.2018.1519458)
34
+
35
+
36
+ ## Installation
37
+
38
+ To install the package, use `pip`:
39
+
40
+ ```bash
41
+ pip install huff
@@ -4,8 +4,8 @@
4
4
  # Author: Thomas Wieland
5
5
  # ORCID: 0000-0001-5168-9846
6
6
  # mail: geowieland@googlemail.com
7
- # Version: 1.1.0
8
- # Last update: 2025-04-28 19:36
7
+ # Version: 1.1.1
8
+ # Last update: 2025-04-29 18:12
9
9
  # Copyright (c) 2025 Thomas Wieland
10
10
  #-----------------------------------------------------------------------
11
11
 
@@ -4,8 +4,8 @@
4
4
  # Author: Thomas Wieland
5
5
  # ORCID: 0000-0001-5168-9846
6
6
  # mail: geowieland@googlemail.com
7
- # Version: 1.1.0
8
- # Last update: 2025-04-28 19:35
7
+ # Version: 1.1.1
8
+ # Last update: 2025-04-29 18:12
9
9
  # Copyright (c) 2025 Thomas Wieland
10
10
  #-----------------------------------------------------------------------
11
11
 
@@ -13,7 +13,9 @@
13
13
  import pandas as pd
14
14
  import geopandas as gp
15
15
  import numpy as np
16
- from huff.ors import Client
16
+ import time
17
+ from huff.ors import Client, TimeDistanceMatrix, Isochrone
18
+ from huff.gistools import overlay_difference
17
19
 
18
20
 
19
21
  class CustomerOrigins:
@@ -212,6 +214,11 @@ class SupplyLocations:
212
214
  new_destinations_gpd = new_destinations.get_geodata_gpd()
213
215
  new_destinations_metadata = new_destinations.get_metadata()
214
216
 
217
+ if list(new_destinations_gpd_original.columns) != list(geodata_gpd_original.columns):
218
+ raise KeyError("Supply locations and new destinations data have different column names.")
219
+ if list(new_destinations_gpd.columns) != list(geodata_gpd.columns):
220
+ raise KeyError("Supply locations and new destinations data have different column names.")
221
+
215
222
  geodata_gpd_original = geodata_gpd_original.append(
216
223
  new_destinations_gpd_original,
217
224
  ignore_index=True
@@ -229,6 +236,89 @@ class SupplyLocations:
229
236
  self.metadata = metadata
230
237
 
231
238
  return self
239
+
240
+ def isochrones(
241
+ self,
242
+ segments: list = [900, 600, 300],
243
+ range_type: str = "time",
244
+ intersections: str = "true",
245
+ profile: str = "driving-car",
246
+ donut: bool = True,
247
+ ors_server: str = "https://api.openrouteservice.org/v2/",
248
+ ors_auth: str = None,
249
+ timeout = 10,
250
+ delay = 1,
251
+ save_output: bool = True,
252
+ output_filepath: str = "isochrones.shp",
253
+ output_crs: str = "EPSG:4326"
254
+ ):
255
+
256
+ geodata_gpd = self.get_geodata_gpd()
257
+ metadata = self.get_metadata()
258
+
259
+ coords = [(point.x, point.y) for point in geodata_gpd.geometry]
260
+
261
+ unique_id_col = metadata["unique_id"]
262
+ unique_id_values = geodata_gpd[unique_id_col].values
263
+
264
+ ors_client = Client(
265
+ server = ors_server,
266
+ auth = ors_auth
267
+ )
268
+
269
+ isochrones_gdf = gp.GeoDataFrame(columns=[unique_id_col, "geometry"])
270
+
271
+ i = 0
272
+
273
+ for x, y in coords:
274
+
275
+ isochrone_output = ors_client.isochrone(
276
+ locations = [[x, y]],
277
+ segments = segments,
278
+ range_type = range_type,
279
+ intersections = intersections,
280
+ profile = profile,
281
+ timeout = timeout,
282
+ save_output = False,
283
+ output_crs = output_crs
284
+ )
285
+
286
+ if isochrone_output.status_code != 200:
287
+ continue
288
+
289
+ isochrone_gdf = isochrone_output.get_isochrones_gdf()
290
+
291
+ if donut:
292
+ isochrone_gdf = overlay_difference(
293
+ polygon_gdf = isochrone_gdf,
294
+ sort_col = "segment"
295
+ )
296
+
297
+ time.sleep(delay)
298
+
299
+ isochrone_gdf[unique_id_col] = unique_id_values[i]
300
+
301
+ isochrones_gdf = pd.concat(
302
+ [
303
+ isochrones_gdf,
304
+ isochrone_gdf
305
+ ],
306
+ ignore_index=True
307
+ )
308
+
309
+ i = i+1
310
+
311
+ isochrones_gdf.set_crs(
312
+ output_crs,
313
+ allow_override=True,
314
+ inplace=True
315
+ )
316
+
317
+ if save_output:
318
+
319
+ isochrones_gdf.to_file(filename = output_filepath)
320
+
321
+ return isochrones_gdf
232
322
 
233
323
  class InteractionMatrix:
234
324
 
@@ -372,6 +462,11 @@ class InteractionMatrix:
372
462
  if interaction_matrix_df["A_j"].isna().all():
373
463
  raise ValueError ("Attraction variable is not defined")
374
464
 
465
+ check_vars(
466
+ df = interaction_matrix_df,
467
+ cols = ["A_j", "t_ij"]
468
+ )
469
+
375
470
  customer_origins = self.customer_origins
376
471
  customer_origins_metadata = customer_origins.get_metadata()
377
472
  tc_weighting = customer_origins_metadata["weighting"][0]
@@ -433,6 +528,11 @@ class InteractionMatrix:
433
528
  if interaction_matrix_df["C_i"].isna().all():
434
529
  raise ValueError ("Market size column in customer origins not defined. Use CustomerOrigins.define_marketsize()")
435
530
 
531
+ check_vars(
532
+ df = interaction_matrix_df,
533
+ cols = ["C_i"]
534
+ )
535
+
436
536
  if interaction_matrix_df["p_ij"].isna().all():
437
537
  self.probabilities()
438
538
  interaction_matrix_df = self.interaction_matrix_df
@@ -446,7 +546,12 @@ class InteractionMatrix:
446
546
  def marketareas (self):
447
547
 
448
548
  interaction_matrix_df = self.interaction_matrix_df
449
-
549
+
550
+ check_vars(
551
+ df = interaction_matrix_df,
552
+ cols = ["E_ij"]
553
+ )
554
+
450
555
  market_areas_df = pd.DataFrame(interaction_matrix_df.groupby("j")["E_ij"].sum())
451
556
  market_areas_df = market_areas_df.reset_index(drop=False)
452
557
  market_areas_df = market_areas_df.rename(columns={"E_ij": "T_j"})
@@ -460,8 +565,10 @@ class InteractionMatrix:
460
565
 
461
566
  def mci_transformation(
462
567
  self,
463
- cols = ["A_j", "t_ij"]
568
+ cols: list = ["A_j", "t_ij"]
464
569
  ):
570
+
571
+ """ MCI model log-centering transformation """
465
572
 
466
573
  cols = cols + ["p_ij"]
467
574
 
@@ -700,12 +807,34 @@ def create_interaction_matrix(
700
807
 
701
808
  return interaction_matrix
702
809
 
810
+ def check_vars(
811
+ df: pd.DataFrame,
812
+ cols: list
813
+ ):
814
+
815
+ for col in cols:
816
+ if col not in df.columns:
817
+ raise KeyError(f"Column '{col}' not in dataframe.")
818
+
819
+ for col in cols:
820
+ if not pd.api.types.is_numeric_dtype(df[col]):
821
+ raise ValueError(f"Column '{col}' is not numeric. All columns must be numeric.")
822
+
823
+ for col in cols:
824
+ if (df[col] <= 0).any():
825
+ raise ValueError(f"Column '{col}' includes values <= 0. All values must be numeric and positive.")
826
+
703
827
  def mci_transformation(
704
828
  df: pd.DataFrame,
705
829
  ref_col: str,
706
830
  cols: list
707
831
  ):
708
832
 
833
+ check_vars(
834
+ df = df,
835
+ cols = cols + [ref_col]
836
+ )
837
+
709
838
  def lct (x):
710
839
 
711
840
  x_geom = np.exp(np.log(x).mean())
@@ -4,8 +4,8 @@
4
4
  # Author: Thomas Wieland
5
5
  # ORCID: 0000-0001-5168-9846
6
6
  # mail: geowieland@googlemail.com
7
- # Version: 1.1.0
8
- # Last update: 2025-04-26 19:35
7
+ # Version: 1.1.1
8
+ # Last update: 2025-04-29 18:12
9
9
  # Copyright (c) 2025 Thomas Wieland
10
10
  #-----------------------------------------------------------------------
11
11
 
@@ -32,6 +32,11 @@ class Isochrone:
32
32
  self.status_code = status_code
33
33
  self.save_config = save_config
34
34
 
35
+ def get_isochrones_gdf(self):
36
+
37
+ isochrones_gdf = self.isochrones_gdf
38
+ return isochrones_gdf
39
+
35
40
  def summary(self):
36
41
 
37
42
  metadata = self.metadata
@@ -119,10 +124,10 @@ class Client:
119
124
  range_type: str = "time",
120
125
  intersections: str = "true",
121
126
  profile: str = "driving-car",
127
+ timeout = 10,
122
128
  save_output: bool = True,
123
129
  output_filepath: str = "isochrones.shp",
124
- output_crs: str = "EPSG:2056",
125
- verbose: bool = True
130
+ output_crs: str = "EPSG:4326"
126
131
  ):
127
132
 
128
133
  ors_url = self.server + "isochrones/" + profile
@@ -153,13 +158,13 @@ class Client:
153
158
  response = requests.post(
154
159
  ors_url,
155
160
  headers=headers,
156
- json=body
161
+ json=body,
162
+ timeout=timeout
157
163
  )
158
164
 
159
165
  except:
160
166
 
161
- if verbose is True:
162
- print ("Unknown error while accessing ORS server")
167
+ print ("Unknown error while accessing ORS server")
163
168
 
164
169
  status_code = 99999
165
170
  isochrones_gdf = None
@@ -178,8 +183,7 @@ class Client:
178
183
 
179
184
  if status_code == 200:
180
185
 
181
- if verbose is True:
182
- print ("Accessing ORS server successful")
186
+ print ("Accessing ORS server successful")
183
187
 
184
188
  response_json = response.json()
185
189
 
@@ -209,8 +213,7 @@ class Client:
209
213
 
210
214
  else:
211
215
 
212
- if verbose is True:
213
- print ("Error while accessing ORS server. Status Code: " + str(status_code))
216
+ print ("Error while accessing ORS server. Status Code: " + str(status_code))
214
217
 
215
218
  isochrones_gdf = None
216
219
  metadata = None
@@ -235,12 +238,12 @@ class Client:
235
238
  metrics: list = [],
236
239
  resolve_locations: bool = False,
237
240
  units: str = "mi",
241
+ timeout = 10,
238
242
  save_output = False,
239
243
  output_filepath = "matrix.csv",
240
244
  csv_sep = ";",
241
245
  csv_decimal = ",",
242
- csv_encoding = None,
243
- verbose = True
246
+ csv_encoding = None
244
247
  ):
245
248
 
246
249
  ors_url = self.server + "matrix/" + profile
@@ -278,13 +281,13 @@ class Client:
278
281
  response = requests.post(
279
282
  ors_url,
280
283
  headers=headers,
281
- json=body
284
+ json=body,
285
+ timeout=timeout
282
286
  )
283
287
 
284
288
  except:
285
289
 
286
- if verbose is True:
287
- print ("Unknown error while accessing ORS server")
290
+ print ("Unknown error while accessing ORS server")
288
291
 
289
292
  status_code = 99999
290
293
  matrix_df = None
@@ -303,8 +306,7 @@ class Client:
303
306
 
304
307
  if status_code == 200:
305
308
 
306
- if verbose is True:
307
- print ("Accessing ORS server successful")
309
+ print ("Accessing ORS server successful")
308
310
 
309
311
  response_json = response.json()
310
312
 
@@ -366,8 +368,7 @@ class Client:
366
368
 
367
369
  else:
368
370
 
369
- if verbose is True:
370
- print ("Error in accessing ORS server. Status Code: " + str(status_code))
371
+ print ("Error in accessing ORS server. Status Code: " + str(status_code))
371
372
 
372
373
  matrix_df = None
373
374
  metadata = None
@@ -4,8 +4,8 @@
4
4
  # Author: Thomas Wieland
5
5
  # ORCID: 0000-0001-5168-9846
6
6
  # mail: geowieland@googlemail.com
7
- # Version: 1.1.0
8
- # Last update: 2025-04-28 19:36
7
+ # Version: 1.1.1
8
+ # Last update: 2025-04-29 18:12
9
9
  # Copyright (c) 2025 Thomas Wieland
10
10
  #-----------------------------------------------------------------------
11
11
 
@@ -69,6 +69,12 @@ Haslach_supermarkets = load_geodata(
69
69
 
70
70
  Haslach_supermarkets.summary()
71
71
 
72
+ Haslach_supermarkets.isochrones(
73
+ save_output=True,
74
+ ors_auth = "5b3ce3597851110001cf62480a15aafdb5a64f4d91805929f8af6abd",
75
+ output_filepath="Haslach_supermarkets_iso.shp"
76
+ )
77
+
72
78
  Haslach_supermarkets.define_attraction("VKF_qm")
73
79
 
74
80
  Haslach_supermarkets.define_attraction_weighting(
@@ -0,0 +1,49 @@
1
+ Metadata-Version: 2.1
2
+ Name: huff
3
+ Version: 1.1.1
4
+ Summary: huff: Huff Model Market Area Analysis
5
+ Author: Thomas Wieland
6
+ Author-email: geowieland@googlemail.com
7
+ Description-Content-Type: text/markdown
8
+
9
+ # huff: Huff Model Market Area Analysis
10
+
11
+ ## Author
12
+
13
+ Thomas Wieland [ORCID](https://orcid.org/0000-0001-5168-9846) [EMail](mailto:geowieland@googlemail.com)
14
+
15
+ See the /tests directory for usage examples of most of the included functions.
16
+
17
+
18
+ ## Features
19
+
20
+ - **Huff Model**:
21
+ - Defining origins and destinations with weightings
22
+ - Creating interaction matrix from origins and destinations
23
+ - Calculating basic Huff Model
24
+ - **Multiplicative Competitive Interaction Model**:
25
+ - Log-centering transformation
26
+ - **OpenRouteService Client** (Tools via API):
27
+ - Creating transport costs matrix from origins and destinations
28
+ - Creating isochrones from destinations
29
+
30
+ Attribution of OpenRouteService:
31
+ © openrouteservice.org by HeiGIT | Map data © OpenStreetMap contributors
32
+ Visit https://openrouteservice.org/
33
+
34
+ ## Literature
35
+ - Huff DL (1962) *Determination of Intra-Urban Retail Trade Areas*.
36
+ - Huff DL (1964) Defining and estimating a trading area. *Journal of Marketing* 28(4): 34–38. [10.2307/1249154](https://doi.org/10.2307/1249154)
37
+ - Huff DL, McCallum BM (2008) Calibrating the Huff Model using ArcGIS Business Analyst. ESRI White Paper, September 2008. https://www.esri.com/library/whitepapers/pdfs/calibrating-huff-model.pdf.
38
+ - De Beule M, Van den Poel D, Van de Weghe N (2014) An extended Huff-model for robustly benchmarking and predicting retail network performance. *Applied Geography*,* 46(1): 80–89. [10.1016/j.apgeog.2013.09.026](https://doi.org/10.1016/j.apgeog.2013.09.026)
39
+ - Nakanishi M, Cooper LG (1974) Parameter estimation for a Multiplicative Competitive Interaction Model: Least squares approach. *Journal of Marketing Research* 11(3): 303–311. [10.2307/3151146](https://doi.org/10.2307/3151146).
40
+ - Wieland T (2017) Market Area Analysis for Retail and Service Locations with MCI. *R Journal* 9(1): 298-323. [10.32614/RJ-2017-020](https://doi.org/10.32614/RJ-2017-020)
41
+ - Wieland T (2018) A Hurdle Model Approach of Store Choice and Market Area Analysis in Grocery Retailing. *Papers in Applied Geography* 4(4): 370-389. [10.1080/23754931.2018.1519458](https://doi.org/10.1080/23754931.2018.1519458)
42
+
43
+
44
+ ## Installation
45
+
46
+ To install the package, use `pip`:
47
+
48
+ ```bash
49
+ pip install huff
@@ -7,7 +7,7 @@ def read_README():
7
7
 
8
8
  setup(
9
9
  name='huff',
10
- version='1.1.0',
10
+ version='1.1.1',
11
11
  description='huff: Huff Model Market Area Analysis',
12
12
  packages=find_packages(include=["huff", "huff.tests"]),
13
13
  include_package_data=True,
huff-1.1.0/PKG-INFO DELETED
@@ -1,23 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: huff
3
- Version: 1.1.0
4
- Summary: huff: Huff Model Market Area Analysis
5
- Author: Thomas Wieland
6
- Author-email: geowieland@googlemail.com
7
- Description-Content-Type: text/markdown
8
-
9
- # huff: Huff Model Market Area Analysis
10
-
11
- ## Author
12
-
13
- Thomas Wieland [ORCID](https://orcid.org/0000-0001-5168-9846) [EMail](mailto:geowieland@googlemail.com)
14
-
15
- See the /tests directory for usage examples of most of the included functions.
16
-
17
-
18
- ## Installation
19
-
20
- To install the package, use `pip`:
21
-
22
- ```bash
23
- pip install huff
huff-1.1.0/README.md DELETED
@@ -1,15 +0,0 @@
1
- # huff: Huff Model Market Area Analysis
2
-
3
- ## Author
4
-
5
- Thomas Wieland [ORCID](https://orcid.org/0000-0001-5168-9846) [EMail](mailto:geowieland@googlemail.com)
6
-
7
- See the /tests directory for usage examples of most of the included functions.
8
-
9
-
10
- ## Installation
11
-
12
- To install the package, use `pip`:
13
-
14
- ```bash
15
- pip install huff
@@ -1,23 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: huff
3
- Version: 1.1.0
4
- Summary: huff: Huff Model Market Area Analysis
5
- Author: Thomas Wieland
6
- Author-email: geowieland@googlemail.com
7
- Description-Content-Type: text/markdown
8
-
9
- # huff: Huff Model Market Area Analysis
10
-
11
- ## Author
12
-
13
- Thomas Wieland [ORCID](https://orcid.org/0000-0001-5168-9846) [EMail](mailto:geowieland@googlemail.com)
14
-
15
- See the /tests directory for usage examples of most of the included functions.
16
-
17
-
18
- ## Installation
19
-
20
- To install the package, use `pip`:
21
-
22
- ```bash
23
- pip install huff
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes