Spaces:
Runtime error
Runtime error
# -*- coding: utf-8 -*- | |
""" | |
Created on Fri Nov 11 07:26:42 2022 | |
@author: mritchey | |
""" | |
# streamlit run "C:\Users\mritchey\.spyder-py3\Python Scripts\streamlit projects\quick address\quick_address.py" | |
import streamlit as st | |
from streamlit_folium import st_folium | |
import pandas as pd | |
import numpy as np | |
import folium | |
from joblib import Parallel, delayed | |
def convert_df(df): | |
return df.to_csv(index=0).encode('utf-8') | |
def map_results(results): | |
for index, row in results.iterrows(): | |
address, sq_ft = results.loc[index, | |
'Address'], results.loc[index, 'Total Area'] | |
html = f"""<p style="arial"><p style="font-size:14px"> | |
{address} | |
<br> Square Footage: {sq_ft}""" | |
iframe = folium.IFrame(html) | |
popup = folium.Popup(iframe, | |
min_width=140, | |
max_width=140) | |
folium.Marker(location=[results.loc[index, 'Lat'], | |
results.loc[index, 'Lon']], | |
fill_color='#43d9de', | |
popup=popup, | |
radius=8).add_to(m) | |
return folium | |
# @st.cache | |
def get_housing_data(address_input): | |
address = address_input.replace( | |
' ', '+').replace(',', '').replace('#+', '').upper() | |
try: | |
census = pd.read_json( | |
f"https://geocoding.geo.census.gov/geocoder/geographies/onelineaddress?address={address}&benchmark=2020&vintage=2020&format=json") | |
results = census.iloc[:1, 0][0] | |
matchedAddress_first = results[0]['matchedAddress'] | |
matchedAddress_last = results[-1]['matchedAddress'] | |
lat, lon = results[0]['coordinates']['y'], results[0]['coordinates']['x'] | |
# lat2, lon2 = results[-1]['coordinates']['y'], results[-1]['coordinates']['x'] | |
censusb = pd.DataFrame({'Description': ['Address Input', 'Census Matched Address: First', | |
'Census Matched Address: Last', 'Lat', 'Lon'], | |
'Values': [address_input, matchedAddress_first, matchedAddress_last, lat, lon]}) | |
#Property Records | |
url = f'https://www.countyoffice.org/property-records-search/?q={address}' | |
county_office_list = pd.read_html(url) | |
if county_office_list[1].shape[1] == 2: | |
df2 = pd.concat([county_office_list[0], county_office_list[1]]) | |
else: | |
df2 = county_office_list[0] | |
df2.columns = ['Description', 'Values'] | |
final = censusb.append(df2) | |
#Transpose | |
final2 = final.T | |
final2.columns = final2.loc['Description'] | |
final2 = final2.loc[['Values']].set_index('Address Input') | |
# final2['County Office Url']=url | |
except: | |
final2 = address_input | |
return final2 | |
# @st.cache(allow_output_mutation=True) | |
def address_quick(df, n_jobs=24): | |
if isinstance(df, pd.DataFrame): | |
df = df.drop_duplicates() | |
df['address_input'] = df.iloc[:, 0]+', '+df.iloc[:, 1] + \ | |
', '+df.iloc[:, 2]+' '+df.iloc[:, 3].astype(str).str[:5] | |
df['address'] = df['address_input'].replace( | |
{' ': '+', ',': ''}, regex=True).str.upper() | |
df['address'] = df['address'].replace({'#+': ''}, regex=True) | |
# addresses=df['address'].values | |
addresses_input = df['address_input'].values | |
else: | |
addresses_input = [df] | |
results = Parallel(n_jobs=n_jobs, prefer="threads")( | |
delayed(get_housing_data)(i) for i in addresses_input) | |
results_df = [i for i in results if isinstance(i, pd.DataFrame)] | |
results_errors = [i for i in results if not isinstance(i, pd.DataFrame)] | |
errors = pd.DataFrame({'Error Addresses': results_errors}) | |
final_results = pd.concat(results_df) | |
final_results = final_results[final_results.columns[2:]].copy() | |
return final_results, errors | |
st.set_page_config(layout="wide") | |
col1, col2 = st.columns((2)) | |
address = st.sidebar.text_input( | |
"Address", "1500 MOHICAN DR, FORESTDALE, AL, 35214") | |
uploaded_file = st.sidebar.file_uploader("Choose a file") | |
uploaded_file = 'C:/Users/mritchey/addresses_sample.csv' | |
address_file = st.sidebar.radio('Choose', | |
('Single Address', 'Addresses (Geocode: Will take a bit)')) | |
if address_file == 'Addresses (Geocode: Will take a bit)': | |
try: | |
df = pd.read_csv(uploaded_file) | |
cols = df.columns.to_list()[:4] | |
with st.spinner("Getting Data: Hang On..."): | |
results, errors = address_quick(df[cols]) | |
except: | |
st.header('Make Sure File is Loaded First and then hit "Addresses"') | |
else: | |
results, errors = address_quick(address) | |
m = folium.Map(location=[39.50, -98.35], zoom_start=3) | |
with col1: | |
st.title('Addresses') | |
map_results(results) | |
st_folium(m, height=500, width=500) | |
with col2: | |
st.title('Results') | |
results.index = np.arange(1, len(results) + 1) | |
st.dataframe(results) | |
csv = convert_df(results) | |
st.download_button( | |
label="Download data as CSV", | |
data=csv, | |
file_name='Results.csv', | |
mime='text/csv') | |
try: | |
if errors.shape[0] > 0: | |
st.header('Errors') | |
errors.index = np.arange(1, len(errors) + 1) | |
st.dataframe(errors) | |
# st.table(errors.assign(hack='').set_index('hack')) | |
csv2 = convert_df(errors) | |
st.download_button( | |
label="Download Errors as CSV", | |
data=csv2, | |
file_name='Errors.csv', | |
mime='text/csv') | |
except: | |
pass | |
st.markdown(""" <style> | |
#MainMenu {visibility: hidden;} | |
footer {visibility: hidden;} | |
</style> """, unsafe_allow_html=True) | |