1
0
forked from tdwojak/Python2017
Python2017/labs06/task02.py
2018-01-13 19:06:04 +01:00

166 lines
6.5 KiB
Python
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()