Laboratorium 5

Marek Kociński & Anna Borowska-Terka

Zapis danych do pliku tekstowego. Słowniki, sygnały

Zadania do wykonania

  1. Napisz funkcję która zapisuje serię danych do pliku (np. wartości kolejnych próbek w sygnale sinusoidalnym) w nstępującym porządku:
%x    sin   cos    
0   0.000   1.000
1   0.063   0.998
2   0.125   0.992
3   0.187   0.982
4   0.249   0.969
5   0.309   0.951
6   0.368   0.930
...   ...     ...
...   ...     ...  
  1. Napisz funkcję, która odczytuje zapisane wartości z pliku dyskowego, a następnie je wyświetla.
  2. Dla zadanego przebiegu sinusoidalnego znajdź miejsca (indeksy), w których wartość $y=sin(x)$:

    • przecina oś OX ($y=0$),
    • wynosi 0.5 ($y=0.5$).

      Wykonaj zadanie korzystając z:

    • pętli for,
    • funkcji np.allclose(...) .
  3. Dla zadanego przebiegu sinusoidalnego znajdź wszystkie indeksy t , dla których funkcja $y=sin(x)$ przyjmuje wartości $y>=0.5$, a następnie przypisz im wartość 0.5. Uzyskane wyniki przedstaw graficznie. Wykonaj zadanie korzystając z:

    • pętli for,
    • funkcji np.where(...) .
  4. Napisz "bazę danych" zawierającą spis filmów. Każdy wpis o filmie powinien zawierać co najmniej następujące informacje:

    • tytuł,
    • gatunek,
    • rok produkcji,
    • główny aktor,
    • informacje czy film już został obejrzany czy jeszcze nie,
    • ocena (liczba gwiazdek od 1 do 5),
    • kraj produkcji,
    • ... (możesz dodać dowolnie zaproponowane pola)

      Przemyśl strukturę (struktury) danych, w których będą przechowywane informacje. Napisz zestaw funkcji, które umożliwiają wyszukiwanie filmów z "bazy danych" według szukanej informacji: np.:

    • filmy z danego roku,
    • filmy wyprodukowane przed zadanym rokiem,
    • filmy wyprodukowane po zadanym roku,
    • filmy wyprodukowane pomiędzy latami xxxx i yyyy,
    • filmy z danym aktorem,
    • filmy z danego gatunku,
    • ...
  5. Otwórz w notatniku plik 2014-03-11_json_Anna_fitbit_steps.txt - przyjrzyj sie jego budowie, składni, długości. Następnie wykonaj polecenia podane w dalszej części tej instrukcji i zastanów się nad otrzymanymi rezultatami.

Wybrane zagadnienia z laboratorium

In [1]:
import pp_lab5 as lab5

%matplotlib inline

Zapis fukcji do pliku

In [2]:
# save to file
import numpy as np

t = np.arange(150)
y1 = np.sin(t*np.pi/50)
y2 = np.cos(t*np.pi/50)

f = open('data.txt', 'w')
# dla Python 2.#:
# print >> f, '%s\t%s\t%s' %("%x", "sin", "cos")

f.write('%s\t%s\t%s\n' %("%x", "sin", "cos"))
for i in range(t.size):
    # dla Python 2.#:
    # print >> f, "%i\t%.3f\t%.3f"%(t[i],y1[i],y2[i])
    f.write("%i\t%.3f\t%.3f\n"%(t[i],y1[i],y2[i]))
f.close()

Odczyt wartości z pliku

In [3]:
import matplotlib.pyplot as plt

t = []
s1 = []
c1 = []
# load from file
f = open('data.txt', 'r')
f.readline()
for line in f:
    l = line.split()
    t.append(int(l[0]))
    s1.append(float(l[1]))
    c1.append(float(l[2]))
f.close()           

plt.plot(t,s1,t,c1)
plt.legend(['sin','cos'])
plt.title('Plots')
plt.ylabel('sin and cos')
plt.xlabel('time')
plt.grid()
plt.show()

Wartości zerowe funkcji

In [4]:
reload(lab5)
lab5.wartosci_zerowe()
***Wartosc 0.0 ***
indeks: 0 wartosc: 0.0
indeks: 50 wartosc: 1.22464679915e-16
indeks: 100 wartosc: -2.44929359829e-16
***Wartosc 0.5 ***
indeks: 8 wartosc: 0.481753674102
indeks: 42 wartosc: 0.481753674102
indeks: 108 wartosc: 0.481753674102
indeks: 142 wartosc: 0.481753674102

***Wartosc w poblizu 0.5 ***
indeks: 9 wartosc: 0.535826794979
indeks: 41 wartosc: 0.535826794979
indeks: 109 wartosc: 0.535826794979
indeks: 141 wartosc: 0.535826794979

Modyfikacja funkcji, m.in. z użyciem funkcji 'where'

Napisz funkcję, która zwróci indeksy, dla których funkcja $y=sin(x)$ przyjmuje określone wartości: znajdz_indeks(funkcja,wartosc,dzialanie)

In [5]:
reload(lab5)
lab5.znajdz_indeks(y1,0.5,'rowna')
print '*'*10
lab5.znajdz_indeks(y1,0.99,'wieksza')
print '*'*10
lab5.znajdz_indeks(y1,-0.99,'mniejsza')
print '*'*10
Brak indeksów, dla ktorych wartosci funkcji sa rowne 0.5 . Ale istnieja indeksy, ktorych wartosci funkcji znajduja sie w poblizu 0.5
indeks: 8 wartosc: 0.481753674102
indeks: 42 wartosc: 0.481753674102
indeks: 108 wartosc: 0.481753674102
indeks: 142 wartosc: 0.481753674102
**********

Indeksy, dla ktorych wartosci funkcji sa wieksze od 0.99
indeks: 23 wartosc: 0.992114701314
indeks: 24 wartosc: 0.998026728428
indeks: 25 wartosc: 1.0
indeks: 26 wartosc: 0.998026728428
indeks: 27 wartosc: 0.992114701314
indeks: 123 wartosc: 0.992114701314
indeks: 124 wartosc: 0.998026728428
indeks: 125 wartosc: 1.0
indeks: 126 wartosc: 0.998026728428
indeks: 127 wartosc: 0.992114701314
**********

Indeksy, dla ktorych wartosci funkcji sa mniejsze od -0.99
indeks: 73 wartosc: -0.992114701314
indeks: 74 wartosc: -0.998026728428
indeks: 75 wartosc: -1.0
indeks: 76 wartosc: -0.998026728428
indeks: 77 wartosc: -0.992114701314
**********
In [6]:
reload(lab5)
lab5.funkcja_zmodyfikowana()

Baza filmów

In [7]:
# filmy wyprodukowane w latach 1970 - 2000
lab5.wyswietl_zakres_lat(1970,2000)
Lista filmow wyprodukowanych pomiedzy latami 1970 i 2000:

Ojciec chrzestny
	rok produkcji: 1972
	obejrzany: Tak
	ocena: 5
	aktor: Brando
	gatunek: sensacyjny
Dawno temu w Ameryce
	rok produkcji: 1985
	obejrzany: Tak
	ocena: 5
	aktor: De Niro
	gatunek: sensacyjny
Shogun
	rok produkcji: 1980
	obejrzany: Tak
	ocena: 5
	aktor: Chemberlain
	gatunek: historyczny

Słowniki - wykorzystanie danych z aplikacji internetowych

In [8]:
import json
json_data=open('2014-03-11_json_Anna_fitbit_steps.txt')
data = json.load(json_data)
#pprint(data)
json_data.close()
In [9]:
print len(data.items())
2
In [10]:
print data.keys()
[u'activities-steps-intraday', u'activities-steps']
In [11]:
print data['activities-steps']
[{u'value': u'15958', u'dateTime': u'2014-03-11'}]
In [12]:
print len(data['activities-steps-intraday']), len(data['activities-steps'])
3 1
In [13]:
print type(data['activities-steps-intraday']), type(data['activities-steps']), type(data['activities-steps'][0])
<type 'dict'> <type 'list'> <type 'dict'>
In [14]:
print data['activities-steps'][0].keys()
print data['activities-steps'][0].values()
print data['activities-steps'][0]['dateTime']
[u'value', u'dateTime']
[u'15958', u'2014-03-11']
2014-03-11
In [15]:
print data['activities-steps-intraday'].keys()
print data['activities-steps-intraday']['datasetType']
print data['activities-steps-intraday']['datasetInterval']
print '\n',10*'*'
print type(data['activities-steps-intraday']['dataset']), len(data['activities-steps-intraday']['dataset'])
print '\n',10*'*'
print type(data['activities-steps-intraday']['dataset'][-1]), len(data['activities-steps-intraday']['dataset'][-1])
print '\n',10*'*'
print data['activities-steps-intraday']['dataset'][-1]
print data['activities-steps-intraday']['dataset'][-1].items()
print data['activities-steps-intraday']['dataset'][-1].keys()
print data['activities-steps-intraday']['dataset'][-1].values()[1]
[u'datasetType', u'datasetInterval', u'dataset']
minute
1

**********
<type 'list'> 1440

**********
<type 'dict'> 2

**********
{u'value': 0, u'time': u'23:59:00'}
[(u'value', 0), (u'time', u'23:59:00')]
[u'value', u'time']
23:59:00

Praca samodzielna

  1. Zmodyfikuj "bazę" filmów, tak aby można było dodać
    • kilku głównych aktorów dla każdego filmu,
    • kilka słów określających gatunek danego filmu np. komedia, sensacja
  2. Napisz funkcję, która zapisuje bazę danych do pliku tekstowego.
  3. Przemyśl w jakich, znanych Ci, strukturach danych można przechowywać informację o filmach.