Spaces:
Runtime error
Runtime error
Commit
·
8637b98
1
Parent(s):
476fe31
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,156 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
from joblib import Parallel, delayed
|
4 |
+
from redfin import Redfin
|
5 |
+
import requests
|
6 |
+
requests.urllib3.disable_warnings()
|
7 |
+
|
8 |
+
@st.cache_data
|
9 |
+
def convert_df(df):
|
10 |
+
return df.to_csv()
|
11 |
+
|
12 |
+
|
13 |
+
def red_fin_api(add):
|
14 |
+
client = Redfin()
|
15 |
+
response = client.search(add)
|
16 |
+
|
17 |
+
try:
|
18 |
+
url = response['payload']['exactMatch']['url']
|
19 |
+
initial_info = client.initial_info(url)
|
20 |
+
except:
|
21 |
+
initial_info = add
|
22 |
+
|
23 |
+
try:
|
24 |
+
property_id = initial_info['payload']['propertyId']
|
25 |
+
mls_data = client.below_the_fold(property_id)
|
26 |
+
except:
|
27 |
+
mls_data = add
|
28 |
+
|
29 |
+
|
30 |
+
try:
|
31 |
+
|
32 |
+
lat,lon=initial_info['payload']['latLong'].values()
|
33 |
+
img=initial_info['payload']['preloadImageUrls'][0]
|
34 |
+
|
35 |
+
# int_group=r[1]['payload']['amenitiesInfo']['superGroups'][0]['amenityGroups']
|
36 |
+
|
37 |
+
ext_prop=mls_data['payload']['amenitiesInfo']['superGroups'][1]['amenityGroups'][0]['amenityEntries']
|
38 |
+
ext_prop=pd.DataFrame(ext_prop)
|
39 |
+
ext_prop['amenityValues']=[i[0] for i in ext_prop['amenityValues'].values]
|
40 |
+
ext_prop2=ext_prop[['referenceName','amenityValues']].T
|
41 |
+
ext_prop2.columns=ext_prop2.values[0]
|
42 |
+
ext_prop3=ext_prop2.tail(1).reset_index(drop=1)
|
43 |
+
|
44 |
+
df=pd.DataFrame(mls_data['payload']['publicRecordsInfo']['basicInfo'],index=[0]).drop(columns=['apn','propertyLastUpdatedDate','displayTimeZone'])
|
45 |
+
|
46 |
+
df['Lat']=lat
|
47 |
+
df['Lon']=lon
|
48 |
+
# df['Image']=img
|
49 |
+
df2=df.join(ext_prop3)
|
50 |
+
df2.insert(0,'url',f'https://www.redfin.com{url}')
|
51 |
+
|
52 |
+
except:
|
53 |
+
df2=pd.DataFrame({'Missing':[1]})
|
54 |
+
|
55 |
+
df2.insert(0,'Address Input',add)
|
56 |
+
|
57 |
+
|
58 |
+
return df2
|
59 |
+
|
60 |
+
|
61 |
+
|
62 |
+
def catch_errors(addresses):
|
63 |
+
try:
|
64 |
+
return red_fin_api(addresses)
|
65 |
+
except:
|
66 |
+
return pd.DataFrame({'Address Input':[addresses]})
|
67 |
+
|
68 |
+
@st.cache_data
|
69 |
+
def process_multiple_address(addresses):
|
70 |
+
results=Parallel(n_jobs=64, prefer="threads")(delayed(catch_errors)(i) for i in addresses)
|
71 |
+
return results
|
72 |
+
|
73 |
+
|
74 |
+
st.set_page_config(layout="wide")
|
75 |
+
st.header("Redfin Data")
|
76 |
+
|
77 |
+
address = st.sidebar.text_input("Single Address:", "190 Pebble Creek Dr Etna, OH 43062")
|
78 |
+
uploaded_file = st.sidebar.file_uploader("Upload Multiple Addresses:")
|
79 |
+
|
80 |
+
if uploaded_file is not None:
|
81 |
+
try:
|
82 |
+
df = pd.read_csv(uploaded_file)
|
83 |
+
except:
|
84 |
+
df = pd.read_excel(uploaded_file)
|
85 |
+
|
86 |
+
address_cols=list(df.columns[:4])
|
87 |
+
df[address_cols[-1]]=df[address_cols[-1]].astype(str).str[:5].astype(int).astype(str)
|
88 |
+
df[address_cols[-1]]=df[address_cols[-1]].apply(lambda x: x.zfill(5))
|
89 |
+
|
90 |
+
df['Address All']=df[address_cols[0]]+', '+df[address_cols[1]]+', '+df[address_cols[2]]+' '+df[address_cols[3]]
|
91 |
+
|
92 |
+
results= process_multiple_address(df['Address All'].values)
|
93 |
+
results=pd.concat(results).reset_index(drop=1)
|
94 |
+
results.index=results.index+1
|
95 |
+
|
96 |
+
else:
|
97 |
+
results=red_fin_api(address).reset_index(drop=1)
|
98 |
+
results.index=results.index+1
|
99 |
+
|
100 |
+
|
101 |
+
cols_order=['Address Input', 'sqFtFinished', 'totalSqFt', 'yearBuilt', 'propertyTypeName', 'beds', 'baths', 'numStories',
|
102 |
+
'url',
|
103 |
+
'Lat', 'Lon']
|
104 |
+
cols_other=[i for i in results.columns if i not in cols_order ]
|
105 |
+
|
106 |
+
|
107 |
+
try:
|
108 |
+
missing=results.query("Missing==Missing")[['Address Input']].reset_index()
|
109 |
+
missing.index=missing.index+1
|
110 |
+
missing['index']=missing['index']+1
|
111 |
+
missing.columns=['Input Position','Address Input']
|
112 |
+
results=results.query("Missing!=Missing")[cols_order+cols_other].drop(columns=['Missing'])
|
113 |
+
except:
|
114 |
+
results=results[cols_order+cols_other]
|
115 |
+
|
116 |
+
|
117 |
+
results['yearBuilt']=results['yearBuilt'].fillna(0).astype(int).astype(str).replace('0','')
|
118 |
+
|
119 |
+
|
120 |
+
with st.container():
|
121 |
+
st.write("Redfin Results")
|
122 |
+
st.dataframe(
|
123 |
+
results,
|
124 |
+
column_config={
|
125 |
+
|
126 |
+
"url": st.column_config.LinkColumn("url"),
|
127 |
+
"Image": st.column_config.LinkColumn("Image"),
|
128 |
+
|
129 |
+
},
|
130 |
+
hide_index=False,
|
131 |
+
|
132 |
+
)
|
133 |
+
|
134 |
+
csv = convert_df(results)
|
135 |
+
st.download_button(
|
136 |
+
label="Download Results as CSV",
|
137 |
+
data=csv,
|
138 |
+
file_name=f'Redfin Results.csv',
|
139 |
+
mime='text/csv')
|
140 |
+
|
141 |
+
try:
|
142 |
+
csv2 = convert_df(missing)
|
143 |
+
st.write("Missing Addresses")
|
144 |
+
st.dataframe(missing)
|
145 |
+
st.download_button(
|
146 |
+
label="Download Missing Data as CSV",
|
147 |
+
data=csv2,
|
148 |
+
file_name=f'Redfin missing.csv',
|
149 |
+
mime='text/csv')
|
150 |
+
except:
|
151 |
+
pass
|
152 |
+
|
153 |
+
st.markdown(""" <style>
|
154 |
+
#MainMenu {visibility: hidden;}
|
155 |
+
footer {visibility: hidden;}
|
156 |
+
</style> """, unsafe_allow_html=True)
|