forked from tdwojak/Python2017
166 lines
6.5 KiB
Python
Executable File
166 lines
6.5 KiB
Python
Executable File
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
## Zadania
|
||
|
||
# ** zad. 0 **
|
||
# Sprawdź, czy masz zainstalowany pakiet ``pandas``. Jeżeli nie, zainstaluj go.
|
||
#
|
||
# ** zad. 2 (domowe) **
|
||
# Jest to zadanie złożone, składające się z kilku części. Całość będzie opierać się o dane zawarte w pliku *mieszkania.csv* i dotyczą cen mieszkań w Poznaniu kilka lat temu.
|
||
# 1, Otwórz plik ``task02.py``, który zawiera szkielet kodu, który będziemy rozwijać w tym zadaniu.
|
||
# 1. Napisz funkcje, która wczyta zestaw danych z pliku *mieszkania.csv* i zwróci obiekt typu *DataFrame*. Jeżeli wszystko zostało zrobione poprawnie, powinno się wyśtwietlić 5 pierwszych wierszy.
|
||
# 1. Uzupełnij funkcję ``most_common_room_number``, która zwróci jaka jest najpopularniejsza liczba pokoi w ogłoszeniach. Funkcji powinna zwrócić liczbę całkowitą.
|
||
# 1. Uzupełnij kod w funkcji ``cheapest_flats(dane, n)``, która wzróci *n* najtańszych ofert mieszkań. Wzrócony obiekt typu ``DataFrame``.
|
||
# 1. Napisz funkcje ``find_borough(desc)``, która przyjmuje 1 argument typu *string* i zwróci jedną z dzielnic zdefiniowaną w liście ``dzielnice``. Funkcja ma zwrócić pierwszą (wzgledem kolejności) nazwę dzielnicy, która jest zawarta w ``desc``. Jeżeli żadna nazwa nie została odnaleziona, zwróć *Inne*.
|
||
# 1. Dodaj kolumnę ``Borough``, która będzie zawierać informacje o dzielnicach i powstanie z kolumny ``Localization``. Wykorzystaj do tego funkcję ``find_borough``.
|
||
# 1. Uzupełnił funkcje ``write_plot``, która zapisze do pliku ``filename`` wykres słupkowy przedstawiający liczbę ogłoszeń mieszkań z podziałem na dzielnice.
|
||
# 1. Napisz funkcje ``mean_price``, która zwróci średnią cenę mieszkania ``room_numer``-pokojowego.
|
||
# 1. Uzupełnij funkcje ``find_13``, która zwróci listę dzielnic, które zawierają ofertę mieszkanie na 13 piętrze.
|
||
# 1. Napisz funkcje ``find_best_flats``, która zwróci wszystkie ogłoszenia mieszkań, które znajdują się na Winogradach, mają 3 pokoje i są położone na 1 piętrze.
|
||
# 1. *(dodatkowe)*: Korzystając z pakietu *sklearn* zbuduj model regresji liniowej, która będzie wyznaczać cenę mieszkania na podstawie wielkości mieszkania i liczby pokoi.
|
||
|
||
import pandas as pd
|
||
import re
|
||
from sklearn import *
|
||
import numpy as np
|
||
|
||
|
||
def wczytaj_dane():
|
||
flats_data = pd.read_csv('mieszkania.csv', encoding='utf-8', sep=',', index_col='Id')
|
||
flats_as_frame = pd.DataFrame(flats_data)
|
||
return flats_as_frame
|
||
|
||
|
||
def most_common_room_number(dane):
|
||
rooms = dane['Rooms']
|
||
rooms_counter = rooms.value_counts()
|
||
rooms_counter_dict = rooms_counter.to_dict()
|
||
max_room = max(rooms_counter_dict, key=rooms_counter_dict.get)
|
||
return max_room
|
||
|
||
|
||
def cheapest_flats(dane, n):
|
||
sorted_flats_data = dane.sort_values(by=['Expected'])
|
||
first_n_cheapest_flats = sorted_flats_data[:n]
|
||
return first_n_cheapest_flats
|
||
|
||
|
||
def find_borough(desc):
|
||
dzielnice = ['Stare Miasto',
|
||
'Wilda',
|
||
'Jeżyce',
|
||
'Rataje',
|
||
'Piątkowo',
|
||
'Winogrady',
|
||
'Miłostowo',
|
||
'Dębiec']
|
||
|
||
# using regular expression to get rid of all special characters with the exception of accents
|
||
final_desc_wo_spaces = re.sub(u'[^a-zA-Z0-9áąéęćíóúÁÉÍÓÚâêîôÂÊÎÔńãõÃÕçÇżź:]', ' ', desc)
|
||
final_desc_wo_spaces = final_desc_wo_spaces.split()
|
||
for n in final_desc_wo_spaces:
|
||
if n in dzielnice:
|
||
return n
|
||
# horrible hack to match 'Stare' with 'Miasto'
|
||
elif n == 'Stare':
|
||
return 'Stare Miasto'
|
||
return "Inne"
|
||
|
||
|
||
def add_borough(dane):
|
||
dane['Borough'] = dane['Location'].apply(find_borough)
|
||
return dane
|
||
|
||
|
||
def write_plot(dane, filename):
|
||
bar_plot_data = dane['Borough']
|
||
counter = bar_plot_data.value_counts()
|
||
my_plot = counter.plot(kind='bar', title='Liczba mieszkań w Poznaniu według dzielnicy', figsize=(12, 12))
|
||
my_plot.set_xlabel('Dzielnica')
|
||
my_plot.set_ylabel('Liczebność')
|
||
fig = my_plot.get_figure()
|
||
fig.savefig(filename + '.png')
|
||
|
||
|
||
def mean_price(dane, room_number):
|
||
filtered_data_mean = dane[dane['Rooms'] == room_number]['Expected'].mean()
|
||
return filtered_data_mean
|
||
|
||
|
||
def find_13(dane):
|
||
filtered_data_floor_13 = dane[dane['Floor'] == 13]['Borough'].values
|
||
return filtered_data_floor_13
|
||
|
||
|
||
def find_best_flats(dane):
|
||
filtered_data = dane.loc[(dane['Borough'] == 'Winogrady') & dane['Rooms'].isin([3]) & dane['Floor'].isin([1])]
|
||
return filtered_data['Description']
|
||
|
||
|
||
def percentile_based_outlier(dane, confidence=95):
|
||
"""
|
||
Filters data set by given confidence criterion
|
||
:param dane:
|
||
:param confidence:
|
||
:return:
|
||
"""
|
||
diff = (100 - confidence) / 2.0
|
||
minval, maxval = np.percentile(dane['Expected'], [diff, 100 - diff])
|
||
return dane[(dane['Expected'] > minval) & (dane['Expected'] < maxval)]
|
||
|
||
|
||
def linear_regression(dane, powierzchnia, liczba_pokoi):
|
||
# remove outliers and define the data/predictors as the pre-set feature name
|
||
dane_filtered = percentile_based_outlier(dane)
|
||
features = dane_filtered[['SqrMeters', 'Rooms']]
|
||
target = dane_filtered['Expected']
|
||
# print(min(target), max(target))
|
||
|
||
x = features
|
||
y = target
|
||
|
||
lm = linear_model.LinearRegression()
|
||
lm.fit(x, y)
|
||
model_score = lm.score(x, y)
|
||
|
||
# calculate mean squared error
|
||
mse = np.mean((dane_filtered['Expected'] - lm.predict(x)) ** 2)
|
||
price = lm.intercept_ + powierzchnia * lm.coef_[0] + liczba_pokoi * lm.coef_[1]
|
||
|
||
co = list(zip(x.columns, lm.coef_))
|
||
coef = pd.DataFrame(co, columns=['feature', 'coefficient'])
|
||
|
||
print('Features and coefficients \n {}'.
|
||
format(coef))
|
||
print('Estimated intercept coefficient: {}'.
|
||
format(lm.intercept_))
|
||
print('Number of coefficients {}'.
|
||
format(lm.coef_)) # list of coefficients
|
||
print('R^2 of the prediction: {}'.
|
||
format(model_score))
|
||
print('Mean squared error {}'.
|
||
format(mse))
|
||
print('{} squared meter flat, which has {} rooms with should cost {} PLN'.
|
||
format(powierzchnia, liczba_pokoi, round(price, 4)))
|
||
|
||
|
||
def main():
|
||
dane = wczytaj_dane()
|
||
print(dane[:5])
|
||
|
||
print("Najpopularniejsza liczba pokoi w mieszkaniu to: {}"
|
||
.format(most_common_room_number(dane)))
|
||
|
||
print("{} to najłądniejsza dzielnica w Poznaniu."
|
||
.format(find_borough("Grunwald i Jeżyce")))
|
||
|
||
print("Średnia cena mieszkania 3-pokojowego, to: {}"
|
||
.format(mean_price(dane, 3)))
|
||
|
||
linear_regression(dane, 100, 4)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|