Pricing_map2.2 / app.py
Vadim-Voronin's picture
Update app.py
aae7077
import streamlit as st
import numpy as np
import pandas as pd
import geopandas as gpd
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
import re
#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 make_date_new(a):
if type(a)==date:
return a
try:
return datetime.strptime(a, "%Y-%m-%d").date()
except:
return date(2000, 3, 14)
def make_area(a):
try:
return float(a)
except:
return 0.0
def make_point(a):
try:
return Point(a)
except:
try:
coordss=re.findall("\d+\.\d+", a)
to_point=[]
for i in coordss:
to_point.append(float(i))
return Point(to_point)
except:
return a
@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)
if os.stat('old_data.csv').st_size == 0:
old_data, len_old_data=first_try(new_data)
else:
DD=pd.read_csv('old_data.csv')
old_data=[DD.columns]
for a in DD.values:
old_data.append(a)
len_old_data=len(old_data)
list_to_geocode=new_data[len_old_data::]
i=0
for lead in list_to_geocode:
lead.pop(-1)
lead.pop(-1)
lead.append(GET_COORDS_YANDEX(lead[8]))
#lead.append([55.87890+i, 37.71943-i])
lead.append(make_date(lead[3]))
#i+=.00001
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')
DD=pd.DataFrame(old_data[1::], columns=old_data[0])
DD.to_csv('old_data.csv')
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
}
)
OBJECTS['Дата оценки']=OBJECTS['Дата оценки'].apply(make_date_new)
OBJECTS['площадь']=OBJECTS['площадь'].apply(make_area)
OBJECTS['geometry']=OBJECTS['geometry'].apply(make_point)
#st.write(OBJECTS.head(3))
#GEO_OBJECTS=gpd.GeoDataFrame(OBJECTS)
with st.sidebar:
st.header('Введите параметры оценок')
min_date = st.date_input("введите минимальную дату оценки", date(2022, 10, 6))
max_date = st.date_input("введите максимальную дату оценки", date(2023, 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=[]
for A in OBJECTS.values:
if (A[5]>min_date) and (A[5]<max_date) and (A[0] in rooms) and (A[2]>areamin) and (A[2]<areamax):
data.append(A)
Data_to_plot=gpd.GeoDataFrame(data, columns=['комнатность',
'этаж',
'площадь',
'ремонт',
'Диапазон предварительной оценки',
'Дата оценки',
'geometry'])
st.write(Data_to_plot.head(3))
#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')
fg4 = folium.map.FeatureGroup(name='pricing').add_to(m)
st.write(Data_to_plot.values[10][6])
if len(Data_to_plot)<500:
for A in Data_to_plot.values:
tag=''
try:
lat=A[6].y
log=A[6].x
except:
continue
for feature in A[:-2]:
tag+=str(feature).replace('\"', '').replace("'","").replace("/"," ")+' '
if len(tag)>40:
tag=tag[5:]
# tag=f'хуувая квартира №{i}'
# tag+=str(A[-1])
iframe = folium.IFrame(tag)
popup = folium.Popup(iframe, min_width=100, max_width=100)
Z=folium.Marker(location=[log,lat],
popup = popup, icon=folium.Icon(color='red', icon=''))
#folium.Marker(location=[lat, log], popup = tag).add_to(m)
fg4.add_child(Z)
folium_static(m)
else:
st.write('Слишком много оценок, поправьте параметры')