Pricing_map_2.0 / app.py
Vadim-Voronin's picture
Update app.py
903b4bc
raw
history blame contribute delete
No virus
4.5 kB
import streamlit as st
import numpy as np
import pandas as pd
import gspread
import folium
import requests as r
from datetime import datetime
from datetime import date
from bs4 import BeautifulSoup as bs
from shapely.geometry import Point
from google.oauth2.service_account import Credentials
from streamlit_folium import folium_static
import pickle
import os
#API='80ccf867-5353-4474-a01c-d1299496eca7'
API='deb65d93-a965-4d1f-a09e-5a047ea959d7'
@st.cache
def make_date(a):
try:
return datetime.strptime(a, "%d.%m.%Y").date()
except:
return date(2000, 3, 14)
@st.cache
def GET_COORDS_YANDEX(adress):
ADRESS=adress.replace(' ', '+')
result=r.get(f'https://geocode-maps.yandex.ru/1.x/?apikey={API}&geocode={ADRESS}&results=1')
res_b_xml=bs(result.content, "lxml")
try:
coords=res_b_xml.find('pos').text.split()
res=[float(a) for a in coords]
return Point(res)
except:
return None
def first_try(data):
old_data=[data[0]]
len_old_data=1
return old_data, len_old_data
def import_data():
scopes = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
credentials = Credentials.from_service_account_file(
'test-project-for-telegram-bot-bcb5e887f016.json',
scopes=scopes
)
gc = gspread.authorize(credentials)
spr = gc.open_by_url("https://docs.google.com/spreadsheets/d/1Ol9039HJ99Q8xVVp1Wwz5iBdURxEKHLIcEvyqUc2pZM/edit#gid=642560994")
wks=spr.worksheet('Консолидированный список')
new_data=wks.get_all_values()
new_data[0].pop(-1)
new_data[0].pop(-1)
with open('old_data.pickle', 'rb') as f:
if os.stat('old_data.pickle').st_size == 0:
old_data, len_old_data=first_try(new_data)
else:
old_data=pickle.load(f)
len_old_data=len(old_data)
list_to_geocode=new_data[len_old_data::]
for lead in list_to_geocode:
lead.pop(-1)
lead.pop(-1)
lead.append(GET_COORDS_YANDEX(lead[8]))
#lead.append('thee must be coords')
lead.append(make_date(lead[3]))
for lead in list_to_geocode:
old_data.append(lead)
if len(old_data[0])!=len(old_data[1]):
old_data[0].append('coords1')
old_data[0].append('date1')
with open('old_data.pickle', 'wb') as f:
pickle.dump(old_data, f)
DD=pd.DataFrame(old_data[1::], columns=old_data[0])
return DD
OBJECTS=import_data()
OBJECTS=pd.DataFrame(
{
'комнатность':OBJECTS['Кол-во комнат'].values,
'этаж':OBJECTS['Этаж'].values,
'площадь':OBJECTS['Площадь '].values,
'ремонт':OBJECTS['Ремонт'].values,
'Диапазон предварительной оценки':OBJECTS['Предварительная оценка (рынок / выкуп) '].values,
'Дата оценки':OBJECTS['date1'].values,
'geometry':OBJECTS['coords1'].values
}
)
st.write(OBJECTS.head(3))
GEO_OBJECTS=gpd.GeoDataFrame(OBJECTS)
with st.sidebar:
st.header('Введите параметры оценок')
min_date = st.date_input("введите минимальную дату оценки", date(2019, 7, 6))
max_date = st.date_input("введите максимальную дату оценки", date(2019, 7, 6))
rooms = st.multiselect('комантность', ['ст', '1', '2', '3', '4'], ['1', '2'])
areamin, areamax = st.slider('Select a range of values', 0.0 , 200.0, (25.0, 75.0))
start_adress = st.text_input("адресс текущей оценки")
#Data_to_plot=GEO_OBJECTS.loc[(GEO_OBJECTS['Дата оценки']>min_date)&(GEO_OBJECTS['Дата оценки']<min_date)&(GEO_OBJECTS['комнатность'] in rooms)&(GEO_OBJECTS['площадь']>areamin)&(GEO_OBJECTS['площадь']<areamax)]
st.subheader('Карта оценок')
m = folium.Map(location=[55.87890, 37.71943], zoom_start=10, tiles='CartoDB positron')
#for A in Data_to_plot.values:
# tag=''
# lat=A[5].y
# log=A[5].x
# for feature in A[:-2]:
# tag+=feature.replace('\"', '').replace("'","").replace("/"," ")+' '
#if len(tag)>40:
# tag=tag[5:]
#tag=f'хуувая квартира №{i}'
# tag+=str(A[-1])
# folium.Marker(location=[lat, log],
# popup = tag).add_to(m)
folium_static(m)