Pricing_map2.2 / app.py
Vadim-Voronin's picture
Create app.py
f2dde7a
raw
history blame
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)