mattritchey commited on
Commit
8637b98
·
1 Parent(s): 476fe31

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +156 -0
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)