zipcode-features 0.1.2__py3-none-any.whl → 0.1.4__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.
@@ -1,10 +1,11 @@
1
- __version__ = '0.1.2'
1
+ __version__ = '0.1.4'
2
2
 
3
3
  import zipcodes
4
4
  from zipcode3.search import SearchEngine
5
5
  from importlib import resources
6
6
  import pandas as pd
7
7
  import json
8
+ from functools import partial
8
9
 
9
10
  zip_to_fips = {
10
11
  '00544': '36103', # Suffolk County
@@ -142,14 +143,22 @@ zip_to_fips = {
142
143
  '14925': '36015', # Chemung County
143
144
  }
144
145
 
145
- def zipcode_mapper(x):
146
- if x["ZIP_len"] == 3:
147
- return "00" + x["ZIP"]
148
- elif x["ZIP_len"] == 4:
149
- return "0" + x["ZIP"]
146
+ def code_mapper(col, x):
147
+ if x[f"{col}_len"] == 2:
148
+ return "000" + x[col]
149
+ if x[f"{col}_len"] == 3:
150
+ return "00" + x[col]
151
+ elif x[f"{col}_len"] == 4:
152
+ return "0" + x[col]
150
153
  else:
151
- return x["ZIP"]
152
-
154
+ return x[col]
155
+
156
+ def map_zip_to_cbsa(zip_to_cbsa, zip_code):
157
+ if zip_code in zip_to_cbsa:
158
+ return zip_to_cbsa[zip_code]
159
+ else:
160
+ return '00000'
161
+
153
162
  def _get_zip_to_cbsa_code() -> dict:
154
163
  """
155
164
  This method gets a mapping from zipcode to cbsa code
@@ -158,10 +167,15 @@ def _get_zip_to_cbsa_code() -> dict:
158
167
  """
159
168
  with resources.path("zipcode_features.data", "CBSA_ZIP_122025.csv") as csv_path:
160
169
  df = pd.read_csv(csv_path, dtype={'ZIP': str, "CBSA": str})
161
- df["ZIP_len"] = df["ZIP"].apply(lambda x: len(x))
162
- df["ZIP"] = df.apply(zipcode_mapper, axis=1)
163
- return df.set_index('ZIP')['CBSA'].to_dict()
170
+ df = correct_code(df, "ZIP")
171
+ mapping = df.set_index('ZIP')['CBSA'].to_dict()
172
+ return partial(map_zip_to_cbsa, mapping)
164
173
 
174
+ def map_cbsa_code_to_name(cbsa_code_to_name, cbsa_code):
175
+ if cbsa_code in cbsa_code_to_name:
176
+ return cbsa_code_to_name[cbsa_code]
177
+ else:
178
+ return 'Unknown'
165
179
 
166
180
  def _get_cbsa_code_to_cbsa_name() -> dict:
167
181
  """
@@ -170,20 +184,38 @@ def _get_cbsa_code_to_cbsa_name() -> dict:
170
184
  """
171
185
  with resources.path("zipcode_features.data", "cbsa_codes.json") as json_path:
172
186
  code_to_name = json.load(open(json_path))
173
- for code in code_to_name:
174
- value = code_to_name[code].replace(" -", "-")
175
- code_to_name[code] = " ".join([elem for elem in x.split(" ") if elem != ''])
176
- return code_to_name
187
+ df = pd.DataFrame(columns=["code", "name"])
188
+ df["name"] = code_to_name.values()
189
+ df["code"] = code_to_name.keys()
190
+ df["name"] = df["name"].str.replace(" -", "-")
191
+ df["name"] = df["name"].str.split().str.join(' ')
192
+ code_to_name = df.set_index('code')['name'].to_dict()
193
+ return partial(map_cbsa_code_to_name, code_to_name)
194
+
195
+ def correct_code(df: pd.DataFrame, col: str) -> pd.DataFrame:
196
+ df[f"{col}_len"] = df[col].apply(lambda x: len(x))
197
+ corrector = partial(code_mapper, col)
198
+ df[col] = df.apply(corrector, axis=1)
199
+ return df
200
+
201
+ def map_zip_code_to_fips_code(zip_code_to_fips_code, zip_code):
202
+ if zip_code in zip_code_to_fips_code:
203
+ return zip_code_to_fips_code[zip_code]
204
+ else:
205
+ return '000000'
206
+ #fips codes are 5 digits long, so this should always
207
+ #map to nothing
177
208
 
178
209
  def _get_zip_to_fips_code() -> dict:
179
210
  with resources.path("zipcode_features.data", "ZIP_COUNTY_122025.csv") as csv_path:
180
211
  df = pd.read_csv(csv_path, dtype={'ZIP': str, "COUNTY": str})
181
- df["ZIP_len"] = df["ZIP"].apply(lambda x: len(x))
182
- df["ZIP"] = df.apply(zipcode_mapper, axis=1)
212
+
213
+ df = correct_code(df, "ZIP")
214
+ df = correct_code(df, "COUNTY")
183
215
  df = df[["ZIP", "COUNTY"]]
184
216
  zip_to_county = df.set_index('ZIP')['COUNTY'].to_dict()
185
217
  zip_to_county.update(zip_to_fips)
186
- return zip_to_county
218
+ return partial(map_zip_code_to_fips_code, zip_to_county)
187
219
 
188
220
  def _get_bls_data() -> pd.DataFrame:
189
221
  csvs = [
@@ -234,7 +266,7 @@ def _get_bls_data() -> pd.DataFrame:
234
266
  final_df = final_df.rename({"area_fips": "fips_code"}, axis=1)
235
267
  final_df["fips_code"] = final_df["fips_code"].astype(str)
236
268
  return final_df
237
-
269
+
238
270
 
239
271
  def us_get_demographics(state: str, city: str = None, zip_list: list = None) -> pd.DataFrame:
240
272
  """
@@ -279,11 +311,11 @@ def us_get_demographics(state: str, city: str = None, zip_list: list = None) ->
279
311
  demographics.append(tmp_dict)
280
312
  df = pd.DataFrame(demographics)
281
313
  zip_to_cbsa = _get_zip_to_cbsa_code()
282
- df["cbsa"] = df["zip_code"].map(zip_to_cbsa)
314
+ df["cbsa"] = df["zip_code"].apply(zip_to_cbsa)
283
315
  cbsa_code_to_name = _get_cbsa_code_to_cbsa_name()
284
- df["cbsa_name"] = df["cbsa"].map(cbsa_code_to_name)
316
+ df["cbsa_name"] = df["cbsa"].apply(cbsa_code_to_name)
285
317
  zip_code_to_fips_code = _get_zip_to_fips_code()
286
- df["fips_code"] = df["zip_code"].map(zip_code_to_fips_code)
318
+ df["fips_code"] = df["zip_code"].apply(zip_code_to_fips_code)
287
319
  bls_data = _get_bls_data()
288
320
  return pd.merge(df, bls_data, how="inner", on="fips_code")
289
321
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zipcode-features
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: A Python package to process and extract features from zipcode data.
5
5
  Project-URL: Homepage, https://github.com/EricSchles/zipcode_features
6
6
  Author-email: Eric Schles <your.email@example.com>
@@ -1,4 +1,4 @@
1
- zipcode_features/__init__.py,sha256=Vh0uHqn66SHhsCiIK6Sf9kY3de1JezHHdSLX9W8UCq4,10421
1
+ zipcode_features/__init__.py,sha256=2jqCCbLX2QHOn1eZTBdwskqllrHqS_mP2DSsgVfthjQ,11425
2
2
  zipcode_features/data/CBSA_ZIP_122025.csv,sha256=K04cmFp6n-BnDNKBAVNlo9ZcISvNcCyi0pilx85M4uw,5184179
3
3
  zipcode_features/data/ZIP_COUNTY_122025.csv,sha256=U15HG0Vy-KFgdTBHBib77-nyBnmze3YL7jgmdjRj8hg,3649183
4
4
  zipcode_features/data/bls_2025_quarter_four.csv,sha256=K44BQUijfSKzaG1la7VpvGDa1mpoEKGRTDu9hjm0hrk,3715371
@@ -6,7 +6,7 @@ zipcode_features/data/bls_2025_quarter_one.csv,sha256=WrR9aRoqC4p0rVGmHIEV-ugLo4
6
6
  zipcode_features/data/bls_2025_quarter_three.csv,sha256=FeACbqadlOOuQvnQNCgyOKke448X_bGUuHJV7g7OW3A,3709136
7
7
  zipcode_features/data/bls_2025_quarter_two.csv,sha256=L_aIESbpSPViV4bGH82EvKLkBI_lf4BxGgoMe_wTrdc,3831843
8
8
  zipcode_features/data/cbsa_codes.json,sha256=H33pk1-12IcJreOLK3OVXhhQ7JirSqNLcZTuoY5FTFM,10324
9
- zipcode_features-0.1.2.dist-info/METADATA,sha256=D0gnFfKmSkavq8SWEPb2mHFf5nlJPv4gtkYr1Qy4YnI,5849
10
- zipcode_features-0.1.2.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
11
- zipcode_features-0.1.2.dist-info/licenses/LICENSE,sha256=HDbMJ7oItmxTn3jVtZFi6jUFAHovset5jzAPUderjOc,1073
12
- zipcode_features-0.1.2.dist-info/RECORD,,
9
+ zipcode_features-0.1.4.dist-info/METADATA,sha256=Y4oy9IG1vtrbrNa9k5ZYT3skXdu8Xq76fAkSsyhY1yI,5849
10
+ zipcode_features-0.1.4.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
11
+ zipcode_features-0.1.4.dist-info/licenses/LICENSE,sha256=HDbMJ7oItmxTn3jVtZFi6jUFAHovset5jzAPUderjOc,1073
12
+ zipcode_features-0.1.4.dist-info/RECORD,,