From bfae3fa2c20ce34f3e2819af42eee33e04005078 Mon Sep 17 00:00:00 2001 From: s45160 Date: Mon, 25 Dec 2017 12:08:16 +0100 Subject: [PATCH] zadania z zajec 16-17.12.2017 --- labs05/Lab05.ipynb | 2 +- labs05/README.md | 10 ++++++--- labs05/task00.py | 14 +++++++++++-- labs05/task01.py | 3 +++ labs05/task02.py | 3 +++ labs06/README.md | 15 ++++++++----- labs06/task02.py | 51 ++++++++++++++++++++++++++++++++++++--------- labs06/wykres.png | Bin 0 -> 15566 bytes 8 files changed, 77 insertions(+), 21 deletions(-) create mode 100644 labs06/wykres.png diff --git a/labs05/Lab05.ipynb b/labs05/Lab05.ipynb index cbd7e24..80a37b8 100644 --- a/labs05/Lab05.ipynb +++ b/labs05/Lab05.ipynb @@ -125,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" diff --git a/labs05/README.md b/labs05/README.md index 1d86fa4..57d75f8 100644 --- a/labs05/README.md +++ b/labs05/README.md @@ -2,16 +2,20 @@ Napisz funkcję ``suma``, która przyjmnie jeden argument: listę liczb i zwróci ich sumę. ** zad. 1 ** -Zaimportuj z zadania 0 fukcje ``suma``. Korzystając z tej fukcji i tablicy ``sys.argv`` oblicz i wyświetl sumę argumentów, jakie zostały przekazane do proramu. Załóź, że argumentami do programu będą tylko liczby zmiennoprzecinkowe. +Zaimportuj z zadania 0 fukcje ``suma``. Korzystając z tej fukcji i tablicy ``sys.argv`` oblicz i wyświetl sumę argumentów, +jakie zostały przekazane do proramu. Załóź, że argumentami do programu będą tylko liczby zmiennoprzecinkowe. ** zad. 2 ** -Uodpornoj program z zad. 1 w następujący sposób: do programu mogą zostać przekazane argumenty, które nie mają wartości liczbowej (przyjmijmy, że ich wartość to 0). Skorzystaj z mechanizmu wyjątków: złap wyjątek, jeżeli argumenty nie da się skonwertować na liczbę zmiennoprzecinkową. +Uodpornoj program z zad. 1 w następujący sposób: do programu mogą zostać przekazane argumenty, które nie mają wartości liczbowej +(przyjmijmy, że ich wartość to 0). Skorzystaj z mechanizmu wyjątków: złap wyjątek, jeżeli argumenty nie da się skonwertować na +liczbę zmiennoprzecinkową. ** zad. 3 ** Przekształć rozwiązanie zadania drugiego w taki sposob, żeby korzystało z biblioteki ``argparse`` zamiast z z listy ``sys.argv``. ** zad. 4 (Domowe) ** -Plik ``task04.py`` zawiera kod prorgamu, który działa jak popularne narzędzie unixowe ``wc`` (Word Counter): zlicza liczbę linii, wyrazów i znaków. Aktualnie program potrafi działać wyłącznie na wejściu podanym z klawiatury. Dodaj do niego opcje programu: +Plik ``task04.py`` zawiera kod prorgamu, który działa jak popularne narzędzie unixowe ``wc`` (Word Counter): zlicza liczbę +linii, wyrazów i znaków. Aktualnie program potrafi działać wyłącznie na wejściu podanym z klawiatury. Dodaj do niego opcje programu: * domyślnie program ma zliczać na wejściu z klawiatury (stdin) i wyświetlać wszystkie 3 liczby. * Jeżeli został podany przełącznik `-l`, to to ma zostać zwrócona tylko liczba linii. * Jeżeli został podany przełącznik `-w`, to to ma zostać zwrócona tylko liczba słów. diff --git a/labs05/task00.py b/labs05/task00.py index ea96b5e..9c8c8a8 100644 --- a/labs05/task00.py +++ b/labs05/task00.py @@ -1,11 +1,21 @@ #!/usr/bin/env python2 # -*- coding: utf-8 -*- +import sys + def suma(liczby): - pass + suma_liczb = 0 + for i in liczby: + try: + suma_liczb += float(i) + except: + suma_liczb += 0 + return suma_liczb def main(): - print(summa([1, 2, 3, 4])) + print(suma([1, 2, 3, 4])) if __name__ == "__main__": main() +else: + suma(sys.argv[1:]) diff --git a/labs05/task01.py b/labs05/task01.py index e69de29..4c611ca 100644 --- a/labs05/task01.py +++ b/labs05/task01.py @@ -0,0 +1,3 @@ +import task00 + +print(task00.suma([5.2,3.4,4.5])) diff --git a/labs05/task02.py b/labs05/task02.py index e69de29..dc6b5de 100644 --- a/labs05/task02.py +++ b/labs05/task02.py @@ -0,0 +1,3 @@ +import task00 + +print(task00.suma(['def',3.4,4.5])) diff --git a/labs06/README.md b/labs06/README.md index e35b68f..afca275 100644 --- a/labs06/README.md +++ b/labs06/README.md @@ -4,13 +4,18 @@ 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. +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. 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. 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. diff --git a/labs06/task02.py b/labs06/task02.py index 9d96016..44e2ef8 100755 --- a/labs06/task02.py +++ b/labs06/task02.py @@ -1,14 +1,22 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +import pandas as pd +import matplotlib +import matplotlib.pyplot as plt + def wczytaj_dane(): - pass + dane = pd.read_csv('mieszkania.csv', + sep=',', + encoding='utf-8') + return dane def most_common_room_number(dane): - pass + return dane.Rooms.mode()[0] def cheapest_flats(dane, n): - pass + dane = dane.sort_values('Expected',ascending=True) + return dane.head(n) def find_borough(desc): dzielnice = ['Stare Miasto', @@ -19,23 +27,35 @@ def find_borough(desc): 'Winogrady', 'Miłostowo', 'Dębiec'] - pass + + for dzielnica in dzielnice: + if desc.find(dzielnica)>=0: + return dzielnica + + return 'Inne' def add_borough(dane): - pass + borough = [] + for current_location in dane: + borough.append(find_borough(current_location)) + return pd.Series(borough) def write_plot(dane, filename): - pass + dane['Borough'].hist() + plt.savefig(filename) def mean_price(dane, room_number): - pass + dane = dane[dane.Rooms == room_number] + return round(dane.Expected.mean(),2) def find_13(dane): - pass + dane = dane[dane.Floor == 13] + return list(dane.Borough) def find_best_flats(dane): - pass + dane = dane[(dane.Borough=='Winogrady') & (dane.Rooms==3) & (dane.Floor == 1)] + return dane def main(): dane = wczytaj_dane() @@ -44,11 +64,22 @@ def main(): print("Najpopularniejsza liczba pokoi w mieszkaniu to: {}" .format(most_common_room_number(dane))) + najtansze = cheapest_flats(dane,10) + print("{} to najłądniejsza dzielnica w Poznaniu." - .format(find_borough("Grunwald i Jeżyce")))) + .format(find_borough("Grunwald i Jeżyce"))) + + dzielnice = add_borough(dane['Location']) + dane['Borough'] = dzielnice.values + + write_plot(dane,'wykres.png') print("Średnia cena mieszkania 3-pokojowego, to: {}" .format(mean_price(dane, 3))) + find_13(dane) + + find_best_flats(dane) + if __name__ == "__main__": main() diff --git a/labs06/wykres.png b/labs06/wykres.png new file mode 100644 index 0000000000000000000000000000000000000000..2acb887f123c4d29a160e18841b1a8b113aecd7c GIT binary patch literal 15566 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 bioET0zP-V*?D!xui9|lDawhZC<=_4nxz_86 literal 0 HcmV?d00001