рдЕрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЬреАрд╡рди рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЧрд╣рд░рд╛ рдФрд░ рдЧрд╣рд░рд╛ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИред рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рдЕрдм рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдмрди рдЧрдпрд╛ред рдпрджрд┐ 5 рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдкреВрд░реЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛: C # рдЙрддрд╛рд░рдиреЗ (рдпрд╛ рдкреЗрди), рдПрдХреНрд╕реЗрд▓, рдореИрдЯрд▓реИрдм, рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╡рд╣рд╛рдВ рд▓рдЧрд╛рддрд╛рд░ "рдХреВрдж" рдХрд░реЗрдВ, рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдлрд╝, рд╕рддреНрдпрд╛рдкрд┐рдд рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред рдЕрдм рдЕрдЬрдЧрд░, рдЙрддреНрдХреГрд╖реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ рдЗрди рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, "рдкрд╣рд╛рдбрд╝реЛрдВ рдХреЛ рд▓реБрдврд╝рдХрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ"редрддреЛ рдореИрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЕрдЬрдЧрд░ рдХреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реБрдИред рдФрд░ рдХреБрдЫ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрднреНрдпрд╛рд╕ рд╣реИред рдФрд░ рдореБрдЭреЗ рд░рд┐рдпрд▓ рдПрд╕реНрдЯреЗрдЯ рдореЗрдВ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдФрд░ рдореБрдЭреЗ рдореЙрд╕реНрдХреЛ рдореЗрдВ рдЕрдЪрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛ рд╕рд╛рдордиреЗ рдЖрдИ: рдорд╛рд╕реНрдХреЛ рдЬрд┐рд▓реЛрдВ рдХреЛ рдФрд╕рдд рдУрдбрдиреБрд╖реНрдХрд╛ рдХреЗ рдХрд┐рд░рд╛рдпреЗ рдХреА рдФрд╕рдд рд▓рд╛рдЧрдд рд╕реЗ рд░реИрдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рдкрд┐рддрд╛, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛, рдпрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрд┐рдпреЛрд▓реЛрдХреЗрд╢рди рд╣реИ, рдФрд░ рд╕рд╛рдЗрдЯ рд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг - рдПрдХ рдорд╣рд╛рди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдп рд╣реИредрд╣реИрдмреЗ рдкрд░ рдЕрджреНрднреБрдд рд▓реЗрдЦреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░ (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдореИрдВ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реВрдВрдЧрд╛), рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдЕрдЬрдЧрд░ рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрджрд╛ рд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реИ, рддрдХрдиреАрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ рдФрд░ рдЖрдирдВрдж рдХреЗ рд╕рд╛рде рд╕рдордп рдмрд┐рддрд╛рдПрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рд▓рд╛рдн рдХреЗ рд╕рд╛рдеред- рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рд╕рд┐рдпрд╛рди
- рдПрдХрд▓ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо
- рдбрд╛рдЯрд╛ рдлреНрд░реЗрдо рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
- рдкрд░рд┐рдгрд╛рдо
- рдЬрд┐рдпреЛрдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛
рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рд╕рд┐рдпрд╛рди
рдорд╛рд░реНрдЪ 2020 рдХреЗ рдордзреНрдп рдореЗрдВ, рд╕рд┐рдпрд╛рди рдкрд░ рдореЙрд╕реНрдХреЛ рдореЗрдВ 1-рдХрдорд░реЗ рд╡рд╛рд▓реЗ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЛ рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 9 рд╣рдЬрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рд╕рд╛рдЗрдЯ рдХреБрдЫ рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рд╣рдо рдЬреНрдпреВрдкрд┐рдЯрд░-рдиреЛрдЯрдмреБрдХ 6.0.1, рдкрд╛рдпрдерди 3.7 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд╣рдо рд╕рд╛рдЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрд░реЛрдз рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ редрддрд╛рдХрд┐ рд╕рд╛рдЗрдЯ рд╣рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рди рдХрд░реЗ, рд╣рдо рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рджреЗрд░реА рдЬреЛрдбрд╝рдХрд░ рдФрд░ рдПрдХ рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдЦреБрдж рдХреЛ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдЪреНрдЫрдиреНрди рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╕рд╛рдЗрдЯ рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рд╣рдо рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реНрдорд╛рд░реНрдЯ рд╡реНрдпрдХреНрддрд┐ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдВ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рд╕рд╛рдЗрдЯ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЕрдЪрд╛рдирдХ рдЦреЛрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИрдВред рдЖрдк рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ: рдЕрдЬрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдм рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ редрд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХреА рдЧрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕реЗрдЯрд┐рдВрдЧ рд╕реНрддрд░ = logging.INFO рдЖрдкрдХреЛ рд▓реЙрдЧ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдХрд┐рд╕реА рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИредрдХреЛрдбdef timer(f):
def wrap_timer(*args, **kwargs):
start = time.time()
result = f(*args, **kwargs)
delta = time.time() - start
print (f' {f.__name__} {delta} ')
return result
return wrap_timer
def log(f):
def wrap_log(*args, **kwargs):
logging.info(f" {f.__doc__}")
result = f(*args, **kwargs)
logging.info(f": {result}")
return result
return wrap_log
logging.basicConfig(level=logging.INFO)
@timer
@log
def requests_site(N):
headers = ({'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15'})
pages = [106 + i for i in range(N)]
n = 0
for i in pages:
s = f"https://www.cian.ru/cat.php?deal_type=rent&engine_version=2&page={i}&offer_type=flat®ion=1&room1=1&type=-2"
response = requests.get(s, headers = headers)
if response.status_code == 200:
name = f'sheets/sheet_{i}.txt'
with open(name, 'w') as f:
f.write(response.text)
n += 1
logging.info(f" {i}")
else:
print(f" {i} response.status_code = {response.status_code}")
time.sleep(np.random.randint(7,13))
return f" {n} "
requests_site(300)
рдПрдХрд▓ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо
рдкреГрд╖реНрдареЛрдВ рд╕реНрдХреНрд░реИрдк рдХреЗ рд▓рд┐рдП, рдЪреБрдиреЗрдВ BeautifulSoup рдФрд░ lxml ред рд╣рдо "рд╕реБрдВрджрд░ рд╕реВрдк" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╢рд╛рдВрдд рдирд╛рдо рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ lxml рддреЗрдЬ рд╣реИредрдЖрдк рдЗрд╕реЗ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдУрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЙрди рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ рдФрд░ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЙрдирдХреЗ рд╕рдЯреАрдХ рдирд╛рдореЛрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЬрдм рддрдХ рд╣рдо tqdm рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдЧрддрд┐ рдкрдЯреНрдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдЬрд╛рд╡рдЯ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗрдХреЛрдб
from bs4 import BeautifulSoup
import re
import pandas as pd
from dateutil.parser import parse
from datetime import datetime, date, time
def read_file(filename):
with open(filename) as input_file:
text = input_file.read()
return text
import tqdm
site_texts = []
pages = [1 + i for i in range(309)]
for i in tqdm.tqdm(pages):
name = f'sheets/sheet_{i}.txt'
site_texts.append(read_file(name))
print(f" {len(site_texts)} .")
def parse_tag(tag, tag_value, item):
key = tag
value = "None"
if item.find('div', {'class': tag_value}):
if key == 'link':
value = item.find('div', {'class': tag_value}).find('a').get('href')
elif (key == 'price' or key == 'price_meter'):
value = parse_digits(item.find('div', {'class': tag_value}).text, key)
elif key == 'pub_datetime':
value = parse_date(item.find('div', {'class': tag_value}).text)
else:
value = item.find('div', {'class': tag_value}).text
return key, value
def parse_digits(string, type_digit):
digit = 0
try:
if type_digit == 'flats_counts':
digit = int(re.sub(r" ", "", string[:string.find("")]))
elif type_digit == 'price':
digit = re.sub(r" ", "", re.sub(r"тВ╜", "", string))
elif type_digit == 'price_meter':
digit = re.sub(r" ", "", re.sub(r"тВ╜/┬▓", "", string))
except:
return -1
return digit
def parse_date(string):
now = datetime.strptime("15.03.20 00:00", "%d.%m.%y %H:%M")
s = string
if string.find('') >= 0:
s = "{} {}".format(now.day, now.strftime("%b"))
s = string.replace('', s)
elif string.find('') >= 0:
s = "{} {}".format(now.day - 1, now.strftime("%b"))
s = string.replace('',s)
if (s.find('') > 0):
s = s.replace('','mar')
if (s.find('') > 0):
s = s.replace('','feb')
if (s.find('') > 0):
s = s.replace('','jan')
return parse(s).strftime('%Y-%m-%d %H:%M:%S')
def parse_text(text, index):
tag_table = '_93444fe79c--wrapper--E9jWb'
tag_items = ['_93444fe79c--card--_yguQ', '_93444fe79c--card--_yguQ']
tag_flats_counts = '_93444fe79c--totalOffers--22-FL'
tags = {
'link':('c6e8ba5398--info-section--Sfnx- c6e8ba5398--main-info--oWcMk','undefined c6e8ba5398--main-info--oWcMk'),
'desc': ('c6e8ba5398--title--2CW78','c6e8ba5398--single_title--22TGT', 'c6e8ba5398--subtitle--UTwbQ'),
'price': ('c6e8ba5398--header--1df-X', 'c6e8ba5398--header--1dF9r'),
'price_meter': 'c6e8ba5398--term--3kvtJ',
'metro': 'c6e8ba5398--underground-name--1efZ3',
'pub_datetime': 'c6e8ba5398--absolute--9uFLj',
'address': 'c6e8ba5398--address-links--1tfGW',
'square': ''
}
res = []
flats_counts = 0
soup = BeautifulSoup(text)
if soup.find('div', {'class': tag_flats_counts}):
flats_counts = parse_digits(soup.find('div', {'class': tag_flats_counts}).text, 'flats_counts')
flats_list = soup.find('div', {'class': tag_table})
if flats_list:
items = flats_list.find_all('div', {'class': tag_items})
for i, item in enumerate(items):
d = {'index': index}
index += 1
for tag in tags.keys():
tag_value = tags[tag]
key, value = parse_tag(tag, tag_value, item)
d[key] = value
results[index] = d
return flats_counts, index
from IPython.display import clear_output
sum_flats = 0
index = 0
results = {}
for i, text in enumerate(site_texts):
flats_counts, index = parse_text(text, index)
sum_flats = len(results)
clear_output(wait=True)
print(f" {i + 1} flats = {flats_counts}, {sum_flats} ")
print(f" sum_flats ({sum_flats}) = flats_counts({flats_counts})")
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдпрд╣ рдереА рдХрд┐ рдкреГрд╖реНрда рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рдЖрдВрдХрдбрд╝рд╛ рдФрд░ рдЕрдиреБрд░реЛрдз рдкрд░ рдкрд╛рдП рдЧрдП рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рдкреГрд╖реНрда рд╕реЗ рдкреГрд╖реНрда рдкрд░ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЫрд╛рдВрдЯреЗ рдЧрдП 5,402 рд╡рд╛рдХреНрдп 5343 рд╕реЗ 5402 рддрдХ рдХреЗ рд╣реИрдВ, рдЬреЛ рдЕрдиреБрд░реЛрдз рдХреА рдкреГрд╖реНрда рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдзреАрд░реЗ-рдзреАрд░реЗ рдХрдо рд╣реЛ рд░рд╣реЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рд┐рдд рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдирд╣реАрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд╛рдЗрдЯ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рд╕рдВрднрд╡ рдерд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдЗрдЯ рдкрд░ рдХреЗрд╡рд▓ 54 рдкреГрд╖реНрдареЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рд╣рдо рдХреБрд▓ 8640 рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХрд┐рд░рд╛рдпреЗ рдХреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкреБрд░рд╛рдиреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреЗ рд╕рд╛рде 309 рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЙрддрд╛рд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗредрдЗрд╕ рддрдереНрдп рдХреА рдПрдХ рдЬрд╛рдВрдЪ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд░рд╣ рдЬрд╛рдПрдЧреАредрдбрд╛рдЯрд╛ рдлреНрд░реЗрдо рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 8640 рдСрдлрд╝рд░ рдкрд░ рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдбреЗрдЯрд╛ рдлрд╝реНрд░реЗрдо рд╣реИред рд╣рдо рдЬрд┐рд▓реЛрдВ рдореЗрдВ рдФрд╕рдд рдФрд░ рдФрд╕рдд рдХреАрдорддреЛрдВ рдХрд╛ рдПрдХ рд╕рддрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЗ рдкреНрд░рддрд┐ рд╡рд░реНрдЧ рдореАрдЯрд░ рдФрд╕рдд рдХрд┐рд░рд╛рдпреЗ рдХреА рдХреАрдордд рдФрд░ рдЬрд┐рд▓реЗ рдореЗрдВ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреА рдХреАрдордд рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ "рдФрд╕рдд"редрд╣рдо рдЕрдкрдиреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдиреНрдпрддрд╛рдУрдВ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ:- рджреЛрд╣рд░рд╛рд╡ рдХреА рдХрдореА: рд╕рднреА рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрджрд╛ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рд╣реИрдВред рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдордиреЗ рдкрддреЗ рдФрд░ рдХреНрд╡рд╛рдбрд░реЗрдЪрд░ рдкрд░ рджреЛрд╣рд░рд╛рдП рдЧрдП рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЛ рдЦрддреНрдо рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХреНрд╡рд╛рдбрд░реЗрдЪрд░ рдпрд╛ рдкрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдорд╛рдирддреЗ рд╣реИрдВред
- тАФ .
тАФ ┬л┬╗ ? ( ) , , , , . , , , . ┬л┬╗ : . ┬л┬╗ ( ) , .
рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:price_per_month - rublessquare -okrug рдХреНрд╖реЗрддреНрд░ - рдЬрд┐рд▓реЗ рдореЗрдВ рдорд╛рд╕рд┐рдХ рдореВрд▓реНрдп рдХрд┐рд░рд╛рдпрд╛ , рдЗрд╕ рдЕрдзреНрдпрдпрди рдореЗрдВ рдкреВрд░рд╛ рдкрддрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИprice_meter - рдкреНрд░рддрд┐ рд╡рд░реНрдЧ рдореАрдЯрд░ рдХрд┐рд░рд╛рдпрд╛ рдореВрд▓реНрдпрдХреЛрдбdf['price_per_month'] = df['price'].str.strip('/.').astype(int)
new_desc = df["desc"].str.split(",", n = 3, expand = True)
df["square"]= new_desc[1].str.strip(' ┬▓').astype(int)
df["floor"]= new_desc[2]
new_address = df['address'].str.split(',', n = 3, expand = True)
df['okrug'] = new_address[1].str.strip(" ")
df['price_per_meter'] = (df['price_per_month'] / df['square']).round(2)
df = df.drop(['index','metro', 'price_meter','link', 'price','desc','address','pub_datetime','floor'], axis='columns')
рдЕрдм рд╣рдо рд╢реЗрдбреНрдпреВрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрд╕рд░реНрдЬрди рдХреА "рджреЗрдЦрднрд╛рд▓" рдХрд░реЗрдВрдЧреЗред рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рддреАрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ: matplotlib , seaborn рдФрд░ plotly редрдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо ред Matplotlib рдЖрдкрдХреЛ рдЙрди рдбреЗрдЯрд╛ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЪрд╛рд░реНрдЯ рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЗрд╕рдХреА рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЖрдВрдХрдбрд╝рд╛, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд┐рдЯрд┐рдиреЛ рдореЗрдВ рдХреЗрд╡рд▓ 1 рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд╕рдд рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЗ рдЧреБрдгрд╛рддреНрдордХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджрдХреНрд╖рд┐рдгреА рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдУрдХреНрд░рдЧ рдореЗрдВ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рддрд╕реНрд╡реАрд░: 1000 рд░реВрдмрд▓ рд╕реЗ рдиреАрдЪреЗ рдХреЗ рдХрд┐рд░рд╛рдпреЗ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдСрдлрд╝рд░ рдХрд╛ рдмрд╣реБрдордд (500 рд╕реЗ рдЕрдзрд┐рдХ рдЗрдХрд╛рдЗрдпрд╛рдВ), рдФрд░ 1700 рд░реВрдмрд▓ рдкреНрд░рддрд┐ рд╡рд░реНрдЧ рдореАрдЯрд░ рдХреА рджрд░ рд╕реЗ рдСрдлрд░ (рд▓рдЧрднрдЧ 300 рдпреВрдирд┐рдЯ) рдореЗрдВ рд╡реГрджреНрдзрд┐ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ - рдЗрди рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕рдВрдХреЗрддрдХреЛрдВ рдореЗрдВ рдЕрдлрд╡рд╛рд╣редрдХреЛрдб рдХреА рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рд╕рдореВрд╣рд┐рдд рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рджреЗрддреА рд╣реИ:hists = df['price_per_meter'].hist(by=df['okrug'], figsize=(16, 14), color = "tab:blue", grid = True)
рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдмрд┐рдЦрд░рд╛рд╡ ред рдиреАрдЪреЗ рд╕рднреА рддреАрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдЦрд╛рдВрдХрди рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реАрдмреЙрд░реНрди рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдФрд░ рдЙрдЬреНрдЬреНрд╡рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдЙрд╕ рдХреЛ рдШреБрдорд╛рддреЗ рд╕рдордп рдЖрдк рддреБрд░рдВрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ , рдЬреЛ рдХрд┐ "рдЖрдЙрдЯрд▓реЗрд░" рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╣рдЯрд╛ рджреЗрдВрдЧреЗредmatplotlibfig, axes = plt.subplots(nrows=4,ncols=3,figsize=(15,15))
for i, (name, group) in enumerate(df_copy.groupby('okrug')):
axes = axes.flatten()
axes[i].scatter(group['price_per_meter'],group['square'], color ='blue')
axes[i].set_title(name)
axes[i].set(xlabel=' 1 ..', ylabel=', 2')
fig.tight_layout()
seaboarnsns.pairplot(vars=["price_per_meter","square"], data=df_copy, hue="okrug", height=5)
plotlyрдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдПрдХ рдЬрд┐рд▓реЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛редimport plotly.express as px
for i, (name, group) in enumerate(df_copy.groupby('okrug')):
fig = px.scatter(group, x="price_per_meter", y="square", facet_col="okrug",
width=400, height=400)
fig.update_layout(
margin=dict(l=20, r=20, t=20, b=20),
paper_bgcolor="LightSteelBlue",
)
fig.show()

рдкрд░рд┐рдгрд╛рдо
рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЙрддреНрд╕рд░реНрдЬрди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 8602 "рд╕реНрд╡рдЪреНрдЫ" рдСрдлрд░ рд╣реИрдВредрдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореБрдЦреНрдп рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛: рдФрд╕рдд, рдордВрдЭрд▓рд╛, рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди, рд╣рдо рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ рдПрдХ рдФрд╕рдд рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдФрд╕рдд рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рд╕реНрдХреЛ рдЬрд┐рд▓реЛрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд░реНрдЬрд╝рд╛ рдкреНрд░рд╛рдкреНрдд:
рддреБрдореНрд╣реЗрдВ рдкрддрд╛ рд╣реИ, рдХреА рддреБрд▓рдирд╛ рджреНрд╡рд╛рд░рд╛ рд╕реБрдВрджрд░ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдФрд╕рдд рдФрд░ рдЬрд┐рд▓реЗ рдореЗрдВ рдордВрдЭрд▓рд╛ рдХреАрдорддреЛрдВ рдХреЗ рд▓рд┐рдП:
рдХреНрдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд░рд╛рдпреЗ рдХреЗ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣реЗрдВ:- , , , . тАЬтАЭ , ( ). , , , , , , тАЬтАЭ . , , .
- . . ┬л ┬╗. , ┬л┬╗ тАФ . . . , , , , , - , , . . .
- , тАЬтАЭ , . , , тАФ .
рдПрдХ рдЕрд▓рдЧ, рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╕реБрдВрджрд░ рдЕрдзреНрдпрд╛рдп рдЬрд┐рдпреЛрдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реИред рддреБрдо рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдирд┐рдореНрди рд▓реЗрдЦ рдореЗрдВ:рдореЙрд╕реНрдХреЛ рдореЗрдВ рдПрдХ Jupyter рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдПрдХ рдирдХреНрд╢реЗ рдкрд░ рдЪреБрдирд╛рд╡ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рджреГрд╢реНрдпрдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдЕрдиреБрдорд╛рдиреЛрдВ рдкрд░ LikbezOpenStreetMap рдЫрд╡рд┐рдпреЛрдВ geodata рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдкрд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, OpenStreetMap рд╣реИ рд╣рдорд╛рд░реЗ рд╕рдм рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╛рдзрди: geopandas , cartoframes (рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рдорд░ рдЧрдпрд╛?) рдФрд░ рдлреЛрд▓рд┐рдпрдо , рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗредрдпрд╣рд╛рдВ рдПрдХ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред
рд▓реЗрдЦ рдкрд░ рдХрд╛рдо рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА:рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрд░реА рддрд░рд╣ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗредрдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИредрд╕реНрд░реЛрдд рдФрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдпрд╣рд╛рдБ github рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ ред