I am working on the file "PythonQnA_9_generators.ipynb".
The first task is:
Although both snippets of code give the same result, the implementation with the generator is more scalable since it uses constant memory.
Generator expressions
See PEP 289 (https://www.python.org/dev/peps/pep-0289/).
Generator expressions merge the concepts of both generators and list comprehensions. The syntax is almost similar to list comprehensions but the returned result is a generator instead of a list.
Can you write Python code for it?

gen4 = nsquared(10)
print(gen4)
gen5 = (i**2 for i in range(11))
print(gen5)


I am working on the file "PythonQnA_9_generators.ipynb".
The first task is:
Now, we define our master generator.
Can you write Python code for it?

def master_sequence(n):
    g1 = fib(n)
    g2 = geom(n)
    g3 = constant(n)
    count = 0

    yield from g1
    yield from g2
    yield from g3

master_gen = master_sequence(5) # creates a sequence of length 15
print(list(master_gen))


I am working on the file "PythonQnA_9_generators.ipynb".
The first task is:
This example shows how you can represent an infinte sequence in Python without using up all the memory in the world. Next, we will look at a more practical example.
Can you write Python code for it?

def nsquared(n):
    while True:
        yield n ** 2
        n = n - 1
        if n == 0:
            return  # correct way to terminate a generator

gen2 = nsquared(10)

for i in gen2:
    print(i, end=', ')

try:
    next(gen2) # should raise a StopIteration exception
except StopIteration:
    print("\nWe hit the the end of the generator, no more elements can be consumed")
except Exception as e:
    print("\nOops! Unexpected error", e)
finally:
    print("Passed !")


I am working on the file "PythonQuestions.ipynb".
The first task is:
As seen from the above example, we have a closure in Python when a nested function references a value in its enclosing scope. The criteria that must be met to create closure in Python are summarized in the following points.

We must have a nested function (function inside a function). A lambda is a function, although anonymous.
The nested function must refer to a value defined in the enclosing function.
The enclosing function must return the nested function.

Python class inheritance
Python class member variables are stored in a dict. If a subclass' member variable is not found in this dict, the parent class dict is searched. The child inherits the state of its parent. This is very different from C++.
Can you write Python code for it?

class P(object):
    x = 1

class A(P):
    pass

class B(P):
    pass

print 'P A B\n-----'
print P.x, A.x, B.x
A.x = 2
print P.x, A.x, B.x, '<-- A gets its own x via assignment'
P.x = 3
print P.x, A.x, B.x, '<-- B is still sharing Ps x'


I am working on the file "PythonQuestions.ipynb".
The first task is:
Fun with lists
Can you write Python code for it?

import pprint
L = [[]] * 5  # Creates a list of 5 references to the same [].
print L
L[0].append(10) # Append to the first, but they are all the same thing.
print L
L[1].append(20) # Append to the second, but still the same.
print L
L.append(30)  # Append to the outer list.
print L


I am working on the file "PythonQuestions.ipynb".
The first task is:
In one line of code, find the even numbers in even indices
Can you write Python code for it?

L = [1,2,4,5,6,8,-2]
#    0,1,2,3,4,5,6
# Soln 1 with enumerate
L_enum = [i for n,i in enumerate(L) if (i%2 == 0 and n%2 == 0)]
# Soln 2 with slicing
L_sliced = [i for i in L[::2] if i%2 == 0]
print L, '-->', L_enum
print L, '-->', L_sliced


I am working on the file "PythonQuestions.ipynb".
The first task is:
Lets bind a variable  another to the returned function printer(). Strangely, it remembered the value of msg. This is a closure.
Can you write Python code for it?


I am working on the file "PythonQuestions.ipynb".
The first task is:
List assignment is a reference
Can you write Python code for it?

i = [1,2,3]
j = list(i)
k = i
i.append(4)
print 'i', i
print 'j', j
print 'k', k


I am working on the file "PythonQuestions.ipynb".
The first task is:
Never use empty containers as default parameters
The [ ] in bar(x, [ ]) is created when the function is defined.  It is continues to exist and is reused (even if modified) with each call of bar() that relies on the default my_list.
Can you write Python code for it?

def foo(x, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(x)
    return my_list

print 'foo (correct)\n-------------'
print foo('s'), foo('t'), foo('u')

def bar(x, my_list=[]):
    my_list.append(x)
    return my_list

print '\nbar (broken)\n------------'
print bar('s'), bar('t'), bar('u')


I am working on the file "PythonQuestions.ipynb".
The first task is:
String spaces --> %20s using RE sub()
Can you write Python code for it?

import re
import unittest

def space20(strg):
    '''Replace " " with "%20"'''
    space_to_20 = re.compile(r' ')
    return space_to_20.sub(r'%20', strg)

class Space20Test(unittest.TestCase):
    def test_zero_len(self):
        self.failUnlessEqual('', space20(''))
    def test_match_nothing(self):
        self.failUnlessEqual('abc;def', space20('abc;def'))
    def test_match_at_start(self):
        self.failUnlessEqual('%20abc', space20(' abc'))
    def test_match_in_middle(self):
        self.failUnlessEqual('abc%20def', space20('abc def'))
    def test_match_at_end(self):
        self.failUnlessEqual('abc%20', space20('abc '))
    def test_match_complex(self):
        self.failUnlessEqual('%20%20abc%20%20def%20%20',
                             space20('  abc  def  '))

squares_suite = unittest.TestLoader().loadTestsFromTestCase(Space20Test)
unittest.TextTestRunner().run(squares_suite)


I am working on the file "PythonTutorial.ipynb".
The first task is:
"Standard" math operators exist: +, -, *, /, **
Be careful with /: integer division when both numbers are integers! (only Python 2!)
Unary operators +=, -=, ...
Operators may behave differently depending on the type.

Boolean Expressions
Can you write Python code for it?

truth = True
lie = False
print(type(truth))
print(truth)
print(not lie and (truth or lie))

truth = (i == 42)
truth = lie or (i == n) and (x != y) or (x < y)


I am working on the file "PythonTutorial.ipynb".
The first task is:
A class can inherit all methods from another class.
The inherited methods can be overridden.
Allows to extend functionality of a class.

Modules
Can you write Python code for it?

import math
print(math.pi)
print(math.sin(math.pi))

import sys
print("Hello World!", file=sys.stderr)

from math import sin, pi
print(sin(pi))

from math import *
print(log(pi))


I am working on the file "PythonTutorial.ipynb".
The first task is:
Boolean values are True and False.
and, or and not are logical operators.
==, !=, <, >, <=, >= are comparison operators.

Formatted Output
Can you write Python code for it?


I am working on the file "PythonTutorial.ipynb".
The first task is:
Hello World!
Can you write Python code for it?

# Output "Hello World!"
print("Hello, World!")
print("Hello World!", 10.0)


I am working on the file "PythonTutorial.ipynb".
The first task is:
Inheritance
Can you write Python code for it?

class MyCircle(Circle):
    def __init__(self, r = 1.0, color = "red"):
        Circle.__init__(self, r)
        self.color = color
    def __str__(self):
        return "I am a {} circle with radius {} and area {}.".format(self.color, self.radius, self.area())

c1 = MyCircle()
c2 = MyCircle(2.0, "green")
print(c1)
print(c2)
print(c1 + c2)


I am working on the file "PythonTutorial.ipynb".
The first task is:
Local variables override global variables.
Global variables are not modified when changing local variables.
Still, in a function definition, global variables can be accessed (i.e., they are copied).
When the global variable should be modified inside a function, explicitely declare it with global.

Variables contain References
Can you write Python code for it?

l = ["Hello", "World"]
ll = [l, l]
print(ll)

l[1] = "Olaf"
print(ll)

ll[0][1] = "Axel"
print(ll)


I am working on the file "PythonTutorial.ipynb".
The first task is:
Python has strings.
Various functions to modify strings.
These functions return the new value.
The strings itself are immutable!

Ints and Floats
Can you write Python code for it?


I am working on the file "PythonTutorial.ipynb".
The first task is:
RHS of = (10.0, "Hello World") are values.
LHS of = (s, x, ...) are variables.
Values have a type.
We can assign more than one variable in a single assignment.
type(x) can be used to determine the type of x.
variables can change their type.

Strings
Can you write Python code for it?

name = "olaf"
print(len(name))
print(name.capitalize())
print(name.upper())
print(name[2])


I am working on the file "PythonTutorial.ipynb".
The first task is:
Variables are references to values.
When an value is modified, all variables that reference it get changed.
Basic types are immutable, i.e. they cannot be modiified.
When they are assigned to another variable, a new copy is created.
Functions modifying them return a new, modified version.
Not so with other types!

Classes and Objects

Classical Python programs contain variables that have a value of a certain data type, and functions.
Observation: functions are tied to a given data type.
For example, print should behave differently when used with a string, and integer, or a file. The same basically holds for all functions.
Idea: Tie functions to the data type also syntactically
The world is made of objects (a.k.a. value)
An object is an instance of a class (a.k.a. data type)
A class provides methods (a.k.a. as functions) that can be used to do anything with these objects.
Can you write Python code for it?

# Create an object of class "file"
f = file('test.txt', 'w')
# Call the method "write" on the object
f.write('Hello')
# Close he file
f.close()


I am working on the file "PythonTutorial.ipynb".
The first task is:
__init__ is the constructor.
Other special functions can be used to allow operators etc.
Can you write Python code for it?

# same a + 23
a = 19
print(a.__add__(23))
# same as "Hello Olaf!"[6:10]
print("Hello Olaf!".__getslice__(6, 10))


I am working on the file "PythonTutorial.ipynb".
The first task is:
def to define a function
return defines the return values of the function
* to unpack lists/take argument lists

Variable Scoping
Can you write Python code for it?

def f(x):
    print("i =", i)
    print("x =", x, "(in function, before add)")
    x += 2
    print("x =", x, "(in function, after add)")
    return x

x = 3
i = 42
print("x =", x, "(in script, before call)")
y = f(x)
print("x =", x, "(in script, after function call)")
print("y =", y)

x = 3

def f():
    global x
    x += 2

print("x =", x, "(before call)")
f()
print("x =", x, "(after function call)")


I am working on the file "PythonTutorial.ipynb".
The first task is:
file is a class.
When using a class like a function, this will create an object (a.k.a. an instance of a class): f = file('test.txt', 'w')
Several instances/objects of a class can be created.
An object has methods (a.k.a. class functions) that can be used to do something with the object.
Methods are called like object.method(): f.write('Hello')

Everything is an object
Can you write Python code for it?

s = "Hello {}"
print(s.format("World!"))
print("Hello {}".format("World"))

x = 42.0
print(x.is_integer())
print((42.0).is_integer())

# same as l=[]
l = list()
l.append(42)
l.append(23)


I am working on the file "PythonTutorial.ipynb".
The first task is:
str.format() to format output (was "%")
{} is replaced by function arguments in order
{1} explicitely denotes the second argument
{:5.3} can be used to format the output in more detail (here: precision)

Lists
Can you write Python code for it?

# create an empty list
l = []

# append different elements
l.append("Hallo")
l.append("Welt!")
l.append(42)
l.append(23)
l.append([1.0, 2.0])

# create a number range
ns = range(20)

# output the list
print(l)
print(ns)
print(range(7,15))

print(len(ns))

# access elements
print(l[0])
print(l[2])
print(l[-1])

# take slices
print(ns)
print(ns[2:7])
print(ns[17:])
print(ns[:7])
# with stride
print(ns[7:16:2])

# unpack the list
print(l)
s1, s2, n1, n2, _ = l
print(s1, s2)

print(17 in ns)
print("Hallo" in l)


I am working on the file "PythonTutorial.ipynb".
The first task is:
while, if, else, for control structures
Indentation is significant! All lines with the same indent belong to one block
: at end of previous line starts a new block
while is a loop with an end condition
for is a loop over elements of a list (or other generators)

Function Definitions
Can you write Python code for it?

# define a function
def f(x, c):
    return x**2-c, x**2+c

print(f(3.0, 1.0))
print(f(5.0, 2.0))

# with default argument
def f(x, c=1.0):
    return x**2-c, x**2+c

print(f(3.0))
print(f(5.0, 2.0))

# with docstring
def f(x):
    "Computes the square of x."
    return x**2

help(f)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:

**Note**: Contrary to Java a Python file can contain classes, variables, function and main code. The filename defines the module name and the namespace to access the functions

Caveat: possible namespace conflicts in large programs

Import selected Functions into the current Namespace
Selective import of function from a module
Can you write Python code for it?

from math import cos, pi

x = cos(2 * pi)

print(x)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Adding, inserting, modifying, and removing elements from lists
Can you write Python code for it?

# create a new empty list
l = []

# add an elements using `append`
l.append("A")
l.append("d")
l.append("d")

print(l)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Basic Data Structures
Python provides a large set of fast, easy to use data structures. In particular

Strings
List  (mutable arrays)
Tupel (inmutable Lists)
Dictionaries (Maps)

Built-in data structures are implemented in C.
Strings
Strings are the variable type that is used for storing text messages as array of characters/bytes.
Can you write Python code for it?

characters = "Complex Systems Engineering"

type(characters)

char = "C"

type(char)

# length of the string: the number of characters
len(char)

s = "Hello world"

# replace a substring in a string with somethign else
s2 = s.replace( "world", "test")
print(s2)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Basictypes
Can you write Python code for it?

# integers
x = 1
type(x)

# float
x = 1.0
type(x)

# boolean
b1 = True
b2 = False

type(b1)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Because Python has a dynamic type system, func0 does not need to specify the type of the return values nor the parameters.
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Boolean Operators

The boolean operators are spelled out as words and, not, or.
Can you write Python code for it?

True and False

not False

True or False


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Caveat: Readability may suffer.
Looking at what a module contains
Once a module is imported, we can list the symbols it provides using the dir function:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Classes
Classes are the key features of object-oriented programming.
A class is a structure for representing an object and the operations that can be performed on the object.
A class can contain attributes (variables) and methods (functions).
A class is defined using the class keyword plus a number of class method definitions (a function in a class).

Each class method should have an argurment self as it first argument. This object is a self-reference.

Some class method names have special meaning, for example:

__init__: The name of the method that is invoked when the object is first created.

__str__ : A method that is invoked when a simple string representation of the class is needed, as for example when printed.
There are many more, see http://docs.python.org/2/reference/datamodel.html#special-method-names
Can you write Python code for it?

class Point:
    """
    Simple class for representing a point in a Cartesian coordinate system.
    """

    def __init__(self, x, y):
        """
        Create a new Point at x, y.
        """
        self.x = x
        self.y = y

    def translate(self, dx, dy):
        """
        Translate the point by dx and dy in the x and y direction.
        """
        self.x += dx
        self.y += dy

    def __str__(self):
        return("Point at [%f, %f]" % (self.x, self.y))


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Counting for loops
The for loop iterates over the elements of the supplied list, and executes the containing block once for each element. Any kind of list can be used in the for loop. For example:
Can you write Python code for it?

strList = ["complex", "systems", "engineering"]

for word in strList:
    print(word)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Default argument and keyword arguments
In a definition of a function, we can give default values to the arguments the function takes:
Can you write Python code for it?

def myfunc(x, p=2, debug=False):

    if debug:
        print("evaluating myfunc for x = " + str(x) + " using exponent p = " + str(p))

    return x**p


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Dictionaries
Dictionaries are also like lists, except that each element is a key-value pair. The syntax for dictionaries is {key1 : value1, ...}:
Can you write Python code for it?

params = {"key1" : 1.0,
          "key2" : 2.0,
          "key3" : 3.0,}

print(type(params))
print(params.keys())
print(params.values())
print(params)

print("key1 = " + str(params["key1"]))
print("key3 = " + str(params["key3"]))

params["key1"] = "A"
params["key2"] = "B"

# add a new entry
params["key4"] = "D"

print("key1 = " + str(params["key1"]))
print("key2 = " + str(params["key2"]))
print("key3 = " + str(params["key3"]))
print("key4 = " + str(params["key4"]))


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Execute the next cell to see a sample solution
Can you write Python code for it?


print("""     3 in [6,9,5,3]

The result of this instruct is boolean """)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Execute the next cell to see the solution
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Execute the next cell to test your solution
Can you write Python code for it?

import sys
import traceback

try:
    assert s_length("python") == 6
    print("success")
except AssertionError:
    print('try again')

solution ="""def s_length(string):
    c = 0
    for char in string:
        c += 1
    return c"""


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Further reading

http://www.python.org - The official web page of the Python programming language.
http://www.python.org/dev/peps/pep-0008 - Style guide for Python programming. Highly recommended.
http://www.greenteapress.com/thinkpython/ - A free book on Python programming.
Python Essential Reference - A good reference book on Python programming.

Versions
Can you write Python code for it?

import sys
import IPython

print("This notebook was evaluated with: Python %s and IPython %s." % (sys.version, IPython.__version__))


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Getting Help on a Module
Use help function directly on modules:
help(math)

Some very useful modules form the Python standard library are

os
sys
math
shutil
re
subprocess
multiprocessing
threading.

A complete lists of standard modules for Python 2 and Python 3 are available at http://docs.python.org/2/library/ and http://docs.python.org/3/library/, respectively.
Matplotlib
matplotlib.pyplot is a collection of command style functions that make matplotlib work like MATLAB
Can you write Python code for it?

import matplotlib.pyplot as plt
plt.plot([0,1,2,3,4])
plt.ylabel('some numbers')
plt.show()

a = [0,1,2,3,4]
squared = [x**2 for x in a]

plt.plot(a, squared, 'ro')
plt.ylabel('some numbers')
plt.show()

import math

def sigmoid(x):
    a = []
    for item in x:
        a.append(1/(1+math.exp(-item)))
    return a

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-10, 10, 0.2)
sig = sigmoid(x)
plt.plot(x,sig)
plt.axhline(0, color='black')
plt.axvline(0, color='black')
plt.grid(True)
plt.show()


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Heterogeneous Types and Nesting
Elements in a list do not all have to be of the same type:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
If we assign a new value to a variable, its type can change.
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
If we omit either (or both) of start or stop from [start:stop], the default is the beginning and the end of the string, respectively:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
If we try to use a variable that has not yet been defined we get an NameError:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Import a Module in current Namespace

Goal: avoid writing the prefix module. by importing all symbols (functions and variables) of one module into the current namespace
Can you write Python code for it?

from math import *

x = cos(2 * pi)

print(x)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Instance Creation
To create a new instance of a class:
Can you write Python code for it?

p1 = Point(0, 0) # this will invoke the __init__ method in the Point class

print(p1)         # this will invode the __str__ method


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Keyword Argument
If we explicitly list the name of the arguments in the function calls, they do not need to come in the same order as in the function definition.
This is called keyword arguments, and is often very useful in functions that take a lot of optional arguments.
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
List
Lists are very similar to strings, except that each element can be of any type.
The syntax for creating lists in Python is [...]:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
List comprehensions: Creating lists using for loops
A convenient and compact way to initialize lists:
Can you write Python code for it?

l1 = [x**2 for x in range(0,5)]

print(l1)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Lists and flow control
Lists play a very important role in Python, and are for example used in loops and other flow control structures (discussed below). There are number of convenient functions for generating lists of various types, for example the range function:
Can you write Python code for it?

start = 10
stop = 30
step = 2

range(start, stop, step)

# in python 3 range generates an iterator, which can be converted to a list using 'list(...)'. It has no effect in python 2
list(range(start, stop, step))

list(range(-10, 10))

s = "some string"

# convert a string to a list by type casting:

s2 = list(s)

s2

# sorting lists
s2.sort()

print(s2)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Loops
In Python, loops can be programmed in a number of different ways. The most common is the for loop, which is used together with iterable objects, such as lists. The basic syntax is:
for loops:
Can you write Python code for it?

for x in range(6): # by default range start at 0
    print(x)

for x in range(-3,3):
    print(x)

myList = [1,2,3]

for i in range(len(myList)):
    print(myList[i])

for item in myList:
    print(item)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Noe: Indexing starts at 0!
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Note that calling class methods can modifiy the state of that particular class instance, but does not effect other class instances or any global variables.
That is one of the nice things about object-oriented design: code such as functions and related variables are grouped in separate and independent entities.
Python Modules
Overview

Modules group Python functions
Modules are files with containing Python code (e.g. myprogram.py)
Using Modules requires to import them first using the import statement
Scope: Import a module to the current namespace, defined in its own namespace or used as module.function

The Python Standard Library is a large collection of modules that provides cross-platform implementations of common facilities such as access to the operating system, file I/O, string management, network communication, and much more.
References

The Python Language Reference: http://docs.python.org/2/reference/index.html
The Python Standard Library: http://docs.python.org/2/library/

Module import
For example, to import the module math, which contains many standard mathematical functions, we can do:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Note that the print("done") statement is not part of the while loop body because of the difference in indentation.
Functions
A function in Python is defined using the keyword def, followed by a function name, a signature within parenthises (), and a colon :. The following code, with one additional level of indentation, is the function body.
Can you write Python code for it?

def func0():
    print("Without Parameter")

def func1(someString):
    print(someString)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Note: range(4) does not include 4 !
Iterating over Dictionaries
To iterate over key-value pairs of a dictionary:
Can you write Python code for it?

for key, value in params.items():
    print(key + " = " + str(value))

#for key in params.keys():
#    print(key + " = " + str(params[key]))


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Numpy - Exercise
NumPy enriches the programming language Python with powerful data structures for efficient computation of multi- dimensional arrays and matrices. The implementation is even aiming at huge matrices and arrays. Besides that the module supplies a large library of high-level mathematical functions to operate on these matrices and arrays.
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Operators and Comparisons
Most operators and comparisons in Python work as one would expect. We will briefly outline the following operators

Arithmetic Operators
Boolean Operators
Comparison Operators

Arithmetic Operators

Arithmetic operators +, -, *, /, // (integer division), '**' power
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Practice
Exercise 1
Write a Python function that can calculate the length of a given string
Can you write Python code for it?

def s_length(string):
    #write your code here


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Python lists can be inhomogeneous and arbitrarily nested:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Question
Print the length of a given list like [9,5,1,2]
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Returning Multiple Values
We can return multiple values from a function using tuples (see above):
Can you write Python code for it?

def powers(x):
    """
    Return a few powers of x.
    """
    return x ** 2, x ** 3, x ** 4

resultOfPowers = powers(3)

print(type(resultOfPowers))
print(resultOfPowers)
print(resultOfPowers[0])

x2, x3, x4 = powers(3)

print(x3)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
See help(list) for more details, or read the online documentation
List Indexing
We can use the same slicing techniques to manipulate lists as we could use on strings:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Task1
Try to complete the following tasks:
Can you write Python code for it?

# create a one-dimensional python list containing 15 integers from 0 to 14

# create a new numpy array containing the values of the python list

# reshape the numpy array into a 2-Dimensional matrix with 3 rows and 5 coloumns

# print the dimensions of the array

# divide the entire array by 2

# add another 2 columns to the matrix with the values 0,1,2

# create two numpy arrays of length 1000, one initialised with only 1's and one with only 0's

# add random values to each value inside the 0-array


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
The type is derived form the value it was assigned (duck-typing)
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
To invoke a class method in the class instance p:
Can you write Python code for it?

p2 = Point(1, 1)

p1.translate(0.25, 1.5)

print(p1)
print(p2)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Tuples are Inmutable
If we try to assign a new value to an element in a tuple we get an error:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Type casting
Can you write Python code for it?

x = "80"
y = "20"

print(x, type(x), y, type(y))

u = x + y

print(u, type(u))

u = int(x) + int(y)

print(u, type(u))

x = "80.0"

x = int(x)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
Unnamed functions (lambda function)
In Python we can also create unnamed functions, using the lambda keyword:
Can you write Python code for it?

f1 = lambda x: x**2

# is equivalent to

def f2(x):
    return x**2

f1(2), f2(2)


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
We can also use the isinstance method for testing types of variables:
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
We can index a character in a string using []:
Note: Indexing start at 0!
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
We can modify lists by assigning new values to elements in the list. In technical jargon, lists are mutable.
Can you write Python code for it?


I am working on the file "PythonTutorial/PythonTutorial.ipynb".
The first task is:
while loops
Can you write Python code for it?

i = 0

while i < 5:
    print(i)

    i = i + 1

    #i += 1

print("done")


I am working on the file "PythonWars/Python Wars.ipynb".
The first task is:
Mailing the quotes

Get the record of the last 15 quotes.
We will randomize the quotes, those that are not in the last 15 sent quotes, so you don't get the same quotes in the same order over and over. # Hint: circular buffer for sent quotes.
Mail the quote
Can you write Python code for it?

path = "./"
with open(path+"starwar_quotes.txt", "wb") as f:
    for item in starwar_quotes_selected_cleaned:
      f.write("%s\n" % item)
#    writer = csv.writer(f)
#    writer.writerows([starwar_quotes_selected_cleaned])

pd.read_table(path+"starwar_quotes.txt",header=None)


I am working on the file "PythonZipExploration.ipynb".
The first task is:
But how often are you going to know exactly how many items are in a list when you need to assign to a variable?
For example, this produces an error because the number of variables on the left side of the assignment does not equal the number of items in the list.  (Capturing exception with try block to add some clarity.)
Can you write Python code for it?

try:
    A,B,C,D = exlst
except Exception as X:
    print("whoopsie: Exception Type:[{0}] Text:[{1}]".format(type(X),X))


I am working on the file "PythonZipExploration.ipynb".
The first task is:
Huh?  Oh, it's not performing the operation immediately.  zip is returning an iterator which is an object that will step through and provide the results when iterated with next.
Can you write Python code for it?


I am working on the file "PythonZipExploration.ipynb".
The first task is:
NOTE iterating over a zip consumes the zip. The first time we ask for a list from a zip. It returns zipped results, however subsequent calls will return no results.
Can you write Python code for it?


I am working on the file "PythonZipExploration.ipynb".
The first task is:
Now zflc is a fully realized list of tuples where each tuple is the corresponding values from exlst and exlsv.
Starred Expression in Zip function
The big reveal, how does this all relate back to star expressions?
Can you write Python code for it?

#returns an iterator zipping up two collections
zf = zip(exlst,exlsv)
#returns lists unzipping a collection into result collections
c1,c2 = zip(*zf)

c1

c2


I am working on the file "PythonZipExploration.ipynb".
The first task is:
Ok, can we do this with parameters in a function?  Can we pass in a list of many items into a function to perform some operation?  First attempt:
Can you write Python code for it?

def foo(v1, v2):
    print("v1:[ {} ]".format(v1))
    print("v2:[ {} ]".format(v2))

try:
    foo(*exlst)
except Exception as X:
    print("whoopsie: Exception Type:[{0}] Text:[{1}]".format(type(X),X))


I am working on the file "PythonZipExploration.ipynb".
The first task is:
Starred expression
Starred expression tells python to keep all other list items together into a paramater.  I think of this as "and all the remaining stuff goes here".
Can you write Python code for it?

X, *Y = exlst

print("X:[ {} ]".format(X))
print("Y:[ {} ]".format(Y))


I am working on the file "PythonZipExploration.ipynb".
The first task is:
Well, that's not quite what I wanted.  I wanted the first item from the list in v1 and the remaining items in the list to go into v2...
Star on the function parameter call
So now we use the star on the input parameter to specify that it will split the parameters into 1 and remaining.
Can you write Python code for it?


I am working on the file "PythonZipExploration.ipynb".
The first task is:
What I have are two collections exlst and exlsv.
What I want is one collection where the first element of exlst is paired with the first element of exlsv
This is where zip comes in. https://docs.python.org/3/library/functions.html#zip
Can you write Python code for it?


I am working on the file "PythonZipExploration.ipynb".
The first task is:
so you have to be careful with iterators that you don't use them up before you expect to.  You could create a copy, but that forces all the calculation over the list to happen at once... which could be a problem if it's an infinite collection. :o
Can you write Python code for it?

zflc = list(zip(exlst,exlsv)).copy()
zflc


I am working on the file "Python_2_1.ipynb".
The first task is:

Aufgabe

Schreiben Sie diesen Text in eine Datei mit den Namen "goethe.txt" (utf-8):

Johann Wolfgang von Goethe (* 28. August 1749 in Frankfurt am Main; † 22. März 1832 in Weimar), geadelt 1782, gilt als einer der bedeutendsten Repräsentanten deutschsprachiger Dichtung.

Goethes literarische Produktion umfasst Lyrik, Dramen, erzählende Werke (in Vers und Prosa), autobiografische, kunst- und literaturtheoretische sowie naturwissenschaftliche Schriften. Daneben ist sein umfangreicher Briefwechsel von literarischer Bedeutung. Goethe war Vorbereiter und wichtigster Vertreter des Sturm und Drang. Sein Roman Die Leiden des jungen Werthers machte ihn in Europa berühmt. Gemeinsam mit Schiller, Herder und Wieland verkörpert er die Weimarer Klassik. Im Alter wurde er auch im Ausland als Repräsentant des geistigen Deutschlands angesehen.

Am Hof von Weimar bekleidete er als Freund und Minister des Herzogs Carl August politische und administrative Ämter und leitete ein Vierteljahrhundert das Hoftheater.

Im Deutschen Kaiserreich wurde er „zum Kronzeugen der nationalen Identität der Deutschen“[1] und als solcher für den deutschen Nationalismus vereinnahmt. Es setzte damit eine Verehrung nicht nur des Werks, sondern auch der Persönlichkeit des Dichters ein, dessen Lebensführung als vorbildlich empfunden wurde. Bis heute zählen Gedichte, Dramen und Romane von ihm zu den Meisterwerken der Weltliteratur.

Reguläre Ausdrücke

Zeichenklassen
z.B.  '.' (hier und im folgenden ohne '') = beliebiges Zeichen

Quantifier
z.B. '+'   = 1 oder beliebig viele des vorangehenden Zeichens'ab+' matches 'ab' 'abb'  'abbbbb', aber nicht 'abab'

Positionen
z.B. '^' am Anfang der Zeile

Sonstiges
Gruppen (x), '|'  Oder‚ '|', Non-greedy: ?, '\'  Escape character

Beispiel. Aufgabe: Finden Sie alle Großbuchstaben in einem String s.
Can you write Python code for it?

import re
s = "Dies ist ein Beispiel."
re.findall(r"[A-ZÄÖÜ]", s)

re.findall("\w+", s)


I am working on the file "Python_2_1.ipynb".
The first task is:

Aufgabe

Schreiben Sie eine vergleichbare Zuweisung für jede der oben aufgelisteten Datenstrukturen

Can you write Python code for it?


I am working on the file "Python_2_1.ipynb".
The first task is:

Aufgaben

Schreiben Sie eine Funktion, die die Anzahl der Vokale in einem String zählt.

Can you write Python code for it?

a = "Hallo"

def count_vowels(s):
    result = 0
    for i in s:
        if i in "AEIOUaeiou":
            result += 1
    return result
count_vowels(a)

s = "hallo"
for i in s:
    print(i)


I am working on the file "Python_2_1.ipynb".
The first task is:

Aufgaben

Geben Sie alle Buchstaben von A bis z aus, deren Unicode-Code eine gerade Zahl ist.

Can you write Python code for it?

for c in range(65,112):
    if c % 2 == 0:
        print(chr(c))


I am working on the file "Python_2_1.ipynb".
The first task is:

Dateien lesen und schreiben

open(file, mode='r', encoding=None) können Sie Dateien schreiben oder lesen.

modes:

"r" - read (default)

"w" - write. Löscht bestehende Inhalte

"a" - append. Hängt neue Inhalte an.

"t" - text (default)

"b" - binary.

"x" - exclusive. Öffnet Schreibzugriff auf eine Datei. Gibt Fehlermeldung, wenn die Datei existiert.

 encoding
"utf-8"

"ascii"

"cp1252"

"iso-8859-1"

Can you write Python code for it?

words = []
with open("goethe.txt", "w", encoding="utf-8") as fin:
    for line in fin:
        re.findall("\w+", s)


I am working on the file "Python_2_1.ipynb".
The first task is:

Funktionen

Funktionen dienen der Modularisierung des Programms und der Komplexitätsreduktion. Sie ermöglichen die Wiederverwendung von Programmcode und eine einfachere Fehlersuche.
Can you write Python code for it?

#diese Funktion dividiert 2 Zahlen:
def div(a, b):
    return a / b

#test
div(6,2)


I am working on the file "Python_2_1.ipynb".
The first task is:

Zählen Sie, wie häufig der Buchstabe "a" im folgenden Satz vorkommt: "Goethes literarische Produktion umfasst Lyrik, Dramen, erzählende Werke (in Vers und Prosa), autobiografische, kunst- und literaturtheoretische sowie naturwissenschaftliche Schriften."

Can you write Python code for it?

a = "ABCDEuvwwxyz"
for i in a:
    print(i)


I am working on the file "Python_2_1.ipynb".
The first task is:
Mit <b>for</b> kann man Schleifen über alles Iterierbare machen. Z.B.:
Can you write Python code for it?

#chr(x) gibt den char mit dem unicode value x aus

for c in range(80,90):
    print(chr(c),end=" ")


I am working on the file "Python_2_10.ipynb".
The first task is:
2. Spacy
Can you write Python code for it?

import spacy
nlp = spacy.load('de')
doc = nlp(text_2)
for s in doc.sents:
    print(s)

doc = nlp(text_3)
for s in doc.sents:
    print(s)


I am working on the file "Python_2_10.ipynb".
The first task is:
Das Gute daran, ist, dass wir  - wie oben - über dieses Objekt iterieren können:
for s in doc.sentences
Aber genau genommen iterieren wir ja nicht über das 'doc'-Objekt, sondern über die Daten einer bestimmten Sicht, die wir mit dem Attribut 'sentences' aktivieren.
Wir können auch  andere Sichten aktivieren, z.B. Worte:
for w in doc.words
Can you write Python code for it?

doc.words[:20]

w = doc.words[0]

type(w)


I am working on the file "Python_2_10.ipynb".
The first task is:
Im folgenden werden wir nur mit Spacy weiterarbeiten. Für Spacy spricht, dass es recht neu ist, eine ganze Reihe von Sprachen unterstützt, ein modernes Python-Interface mit einer wohlüberlegten API hat, vergleichsweise neue Aspekte der Sprachtechnologie, z.B. Word Embeddings, unterstützt und dass Deutsch zu den gut unterstützten Sprachen zählt. Gegen Spacy spricht, dass es von einer privaten Firma entwickelt wird, allerdings wird das dadurch gemildert, dass spacy selbst auf github unter einer sehr freizügigen MIT-Lizenz verfügbar ist.
Can you write Python code for it?


I am working on the file "Python_2_10.ipynb".
The first task is:
Textblob installieren:
Text in Sätze zerlegen
1. Textblob:
Can you write Python code for it?

from textblob_de import TextBlobDE as TextBlob
from textblob_de import PatternParser

doc = TextBlob(text)
print("Number of sentences: ", len(doc.sentences))
print("Length of sentences in characters: ")
for s in doc.sentences:
    print(len(s), end=" - ")


I am working on the file "Python_2_2.ipynb".
The first task is:

Aufgabe 2
Can you write Python code for it?

#uppeditys the string word
def upper(word):
    return word.upper()

a = ["dies", "ist", "Ein", "satz"]
list(map(upper, a))


I am working on the file "Python_2_2.ipynb".
The first task is:
Allerdings gibt es sehr unterschiedliche Meinungen darüber, ob auf diese Weise guter Code entsteht. Ich finde diesen Ratschlag anz gut:

Write a lambda function.

Write a comment explaining what the heck that lambda does.

Study the comment for a while, and think of a name that captures the essence of the comment.

Convert the lambda to a def statement, using that name.

Remove the comment.

Hausaufgabe
1) Geben Sie alle Unicode-Zeichen zwischen 34 und 250 aus und geben Sie alle aus, die keine Buchstaben oder Zahlen sind
2) Wie könnte man alle Dateien mit der Endung *.txt in einem Unterverzeichnis hintereinander ausgeben?
3) Schauen Sie sich in der Python-Dokumentation die Funktionen sort und itemgetter an. Wie kann man diese so kombinieren, dass man damit ein Dictionary nach dem value sortieren kann. (no stackoverflow :-)

Lösungen
Aufgabe 1
Can you write Python code for it?

#zählt die Vokale eines strings
def cv(word):
    return sum([1 for a in word if a in "aeiouAEIOUÄÖÜäöü"])

a = "Dies ist eine Lüge, oder nicht?"
[cv(w) for w in a.split()]


I am working on the file "Python_2_2.ipynb".
The first task is:
Aufgabe 2
Verwenden Sie map() um in einer Liste von Worten jedes Wort in Großbuchstaben auszugeben. Diskutieren Sie evtl. Probleme mit einem Nachbarn.
Aufgabe 3 (optional)
Lösen Sie Aufgabe 1 mit map()
filter()
filter(FunktionX, Liste)

Die Funktion FunktionX wird auf jedes Element der Liste angewandt. Konstruiert einen neuen Iterator, in den die Elemente der Liste aufgenommen werden, für die die FunktionX den Ausgabewert True hat.

Bsp.:
Can you write Python code for it?

#returns True if x is an even number
def is_even(x):
    return (x % 2) == 0

b = [2,3,4,5,6]
list(filter(is_even, b))


I am working on the file "Python_2_2.ipynb".
The first task is:
Aufgabe 4
Verwenden Sie filter, um aus dem folgenden Text eine Wortliste zu erstellen, in der alle Pronomina, Artikel und die Worte "dass", "ist", "nicht", "auch", "und" nicht enthalten sind:

"Ich denke auch, dass ist nicht schlimm. Er hat es nicht gemerkt und das ist gut. Und überhaupt: es ist auch seine Schuld. Ehrlich, das ist wahr."
Das itertools-Modul
Die Funktionen des itertools-Moduls lassen sich einteilen in Funktionen, die:

die einen neuen Iterator auf der Basis eines existierenden Iterators erzeugen.

die Teile der Ausgabe eines Iterators auswählen.

die die Ausgabe eines Iterators gruppieren.

die Iteratoren kombinieren

Neuen Iterator erzeugen
Diese Funktionen erzeugen einen neuen Iterator auf der Basis eines existierenden:

itertools.count(),itertools.cycle(), itertools.repeat(), itertools.chain(), itertools.isslice(), itertools.tee()
itertools.cycle(iterator) Gibt die Liste der Elemente in iterator in einer unendlichen Schleife zurück
Can you write Python code for it?

import itertools
#don't try this at home:
#list(itertools.cycle([1,2,3,4,5]))


I am working on the file "Python_2_2.ipynb".
The first task is:
Aufgabe 5
Verknüpfen Sie den Inhalt dreier Dateien zu einem Iterator
Teile der Ausgabe eines Iterators auswählen.
itertools.filterfalse(Prädikat, iterator) ist das Gegenstück zu filter(). Ausgabe enthält alle Elemente, für die das Prädikat falsch ist.
itertools.takewhile(Prädikat, iterator) - gibt solange Elemente aus, wie das Prädikat wahr ist
itertools.dropwhile(Prädikat, iter)entfernt alle Elemente, solange das Prädikat wahr ist. Gibt dann den Rest aus.
itertools.compress(Daten, Selektoren) Nimmt zweei Iteratoren un dgibt nur die Elemente des ersten (Daten) zurück, für die das entsprechende Element im zweiten (Selektoren) wahr ist. Stoppt, wenn einer der Iteratoren erschöpft ist.
Iteratoren kombinieren
itertools.combinations(Iterator, r)  gibt alle r-Tuple Kombinationen der Elemente des Iterators wieder. Beispiel:
Can you write Python code for it?

tuple(itertools.combinations([1, 2, 3, 4], 2))


I am working on the file "Python_2_2.ipynb".
The first task is:
Aufgabe 7
Wieviele Zweier-Permutationen sind mit den graden Zahlen zwischen 1 und 101 möglich?
The operator module
Mathematische Operationen: add(), sub(), mul(), floordiv(), abs(), ...

Logische Operationen: not_(), truth()

Bit Operationen: and_(), or_(), invert()

Vergleiche: eq(), ne(), lt(), le(), gt(), and ge()

Objektidentität: is_(), is_not()

Can you write Python code for it?


I am working on the file "Python_2_2.ipynb".
The first task is:
Das ist äquivalent zu
Can you write Python code for it?


I am working on the file "Python_2_2.ipynb".
The first task is:
Geschachtelte Schleifen
Man kann in list comprehensions auch mehrere geschachtelte for-Schleifen aufrufen:
Can you write Python code for it?

#Aufgabe: vergleiche zwei Zahlenlisten und gebe alle Zahlenkombinationen aus, die ungleich sind
#Erst einmal die traditionelle Lösung mit geschachtelten Schleifen:
combs = []
for x in [1,2,3 ]:
    for y in [3,1,4]:
        if x != y:
            combs.append((x, y))
combs


I am working on the file "Python_2_2.ipynb".
The first task is:
Lambda-Funktionen
lambda erlaubt es, kleine Funktionen anonym zu definieren. Nehmen wir an, wir wollen in einer List von Zahlen alle Zahlen durch 100 teilen und mit 13 multiplizieren. Dann könnten wir das so machen:
Can you write Python code for it?

def calc(n):
    return (n * 13) / 100

a = [1, 2, 5, 7]
list(map(calc, a))


I am working on the file "Python_2_2.ipynb".
The first task is:
Man kann sich die vollständige Ausgabe eines Iterators ausgeben lassen, wenn man ihn als Parameter der list()- oder tuple() Funktion übergibt.
Can you write Python code for it?

#beispiel
a = [1, 2, 3,]
my_iterator = iter(a)
list(my_iterator)

my_iterator = iter(a)
tuple(my_iterator)


I am working on the file "Python_2_2.ipynb".
The first task is:
Natürlich kann man den Rückgabewert von List Comprehensions auch in einer Variablen abspeichern.
Can you write Python code for it?

squared = [x**2 for x in range(10)]
squared


I am working on the file "Python_2_2.ipynb".
The first task is:
Python erwartet in bestimmten Kontexten ein iterierbares Objekt, z.B. in der for-Schleife:
Can you write Python code for it?


I am working on the file "Python_2_2.ipynb".
The first task is:
itertools.chain(iterator_1, iterator_2, ...)  Erzeugt einen neuen Iterator, in dem die Elemente von iterator_1, _2 usw. aneinander gehängt sind.
Can you write Python code for it?


I am working on the file "Python_2_2.ipynb".
The first task is:
itertools.permutations(iterator, r) gibt alle Permutationen aller Elemente unabhängig von der Reihenfolge in Iterator wieder:
Can you write Python code for it?

tuple(itertools.permutations([1, 2, 3, 4], 2))


I am working on the file "Python_2_2.ipynb".
The first task is:
itertools.repeat(iterator, [n]) wiederholt die Elemente in iterator n mal.
Can you write Python code for it?

import itertools
list(itertools.repeat([1,2,3,4], 3))


I am working on the file "Python_2_3.ipynb".
The first task is:
2) Wie könnte man alle Dateien mit der Endung *.txt in einem Unterverzeichnis hintereinander ausgeben?
Can you write Python code for it?

import glob

for file in glob.glob("test\\*.*"):
    with open(file, "r") as fin:
        [print(l) for l in fin]


I am working on the file "Python_2_3.ipynb".
The first task is:
4) Was ist die Operation, die im Kern verlangt wird?

jedes Wort durch eine Zahl ersetzen und zwar die Anzahl der Vokale.

daraus können wir ableiten: wir brauchen eine Funktion, die ein Wort als Input hat und die Anzahl der Vokale als Output. Damit fangen wir an:
Can you write Python code for it?

#count vowels in a word, returns their number
def count_vowels(word):
    nr_of_vowels = 0
    #something will happen here
    return nr_of_vowels


I am working on the file "Python_2_3.ipynb".
The first task is:

Aufgabe 4
Hier ist eine Liste der Jahres-Zinssätze für Privatdarlehen der letzten 10 Jahre (frei erfunden!):
2004: 4,3 - 2005: 4,0 - 2006: 3,5 - 2007: 3,0 - 2008: 2,5 - 2009: 3,2 - 2010: 3,3 - 2011: 1,8 - 2012: 1,4 - 2013: 0,7
Wieviel hat jemand auf dem Konto, der Anfang 2004 750€ eingezahlt hat.
Can you write Python code for it?

from functools import reduce
#we define a function which adds the yearly interests to the sum
def jahreszins(betrag, zins):
    return betrag + (betrag * zins / 100)

#we put the interests into a list
zinsen = [4.3, 4.0, 3.5, 3.0, 2.5, 3.2, 3.3, 1.8, 1.4, 0.7]
#we use reduce to calculate the result
reduce(jahreszins, zinsen, 750)


I am working on the file "Python_2_3.ipynb".
The first task is:

Aufgabe 3
Schreiben Sie eine Funktion, die für beliebig große Textdateien jeweils den nächsten Satz ausgibt. Gehen Sie dabei von der (überstark vereinfachten) Regel aus, dass ein Satz durch eines dieser Zeichen [.?!] + Leerzeichen oder Absatzmarke beendet wird.
Can you write Python code for it?

def get_sentence(filehandler):
    in_markup = False
    sentence = ""
    while True:
        c = filehandler.read(1)
        if c == "":
            break
        elif c in ".?!":
            sentence += c
            in_markup = True
        elif (c == " " or c == "\n") and in_markup == True:
            yield sentence
            sentence = ""
            in_markup = False
        else:
            if in_markup == True:
                in_markup == False
            if c != "\n":
                sentence += c

with open("text.txt", "r", encoding="utf-8") as fin:
    for s in get_sentence(fin):
        print(s)


I am working on the file "Python_2_3.ipynb".
The first task is:
Aber hier stimmt die Logik nicht - wir wollen ja die Zeichen ausgeben, die <b>keine</b> Buchstaben sind, d.h. wir müssen verneinen. Dafür gibt es, wie erwähnt, itertools.filterfalse()
Can you write Python code for it?

from itertools import filterfalse
a = list(filterfalse(lambda c: c.isalnum(), [chr(c) for c in range(34,250)]))
print(a[:20])


I am working on the file "Python_2_3.ipynb".
The first task is:
Aufgabe 1
Finden Sie heraus, welche Wörter in Faust I von Goethe und Maria Stuart von Schiller nur in dem jeweiligen Text vorkommen. Begründen Sie Ihr Vorgehen.
Funktionales Programmieren - 2. Teil
Daten aus zwei Iteratoren verwenden
Wir haben bereits gesehen, wie wir Daten aus zwei Iteratoren verwenden können, wenn wir praktisch verschachtelte Schleifen brauchen:
Can you write Python code for it?


I am working on the file "Python_2_3.ipynb".
The first task is:
Aufgabe 3
Schreiben Sie eine Funktion, die für beliebig große Textdateien jeweils den nächsten Satz ausgibt. Gehen Sie dabei von der (überstark vereinfachten) Regel aus, dass ein Satz durch eines dieser Zeichen [.?!] + Leerzeichen oder Absatzmarke beendet wird.
reduce
functools.reduce(func, iter, [initial_value])  wendet die Funktion func auf alle Elemente einer iterierbaren Struktur (iter) an. Die Funktion func muss als Eingabe zwei Elemente akzeptieren und ein Element ausgeben. Das Besondere der reduce-Funktion besteht darin, dass die Ausgabe der ersten Anwendung der Funktion, Teil der Eingabe der nächsten Anwendung der Funktion wird. Angenommen in der iterierbaren Datenstruktur findet sich [A, B, C, D], dann würde die Funktion func zuerst also Parameter A und B nehmen. Die Ausgabe X wird dann wiederum zur Eingabe für den Aufruf der Funktion: es berechnet dann also: func(func(A, B), C) usw. bis die Liste erschöpft ist. Sie können den Anfangswert (also den Wert von A) als initialvalue setzen.<br/>
Ein Beispiel. Wir multiplizieren alle Zahlen einer Liste. Erst wird 1 * 2 multipliziert. Das Ergebnis wird  dann mit 3 multipliziert usw.:
Can you write Python code for it?

import functools
from operator import mul
a = [1,2,3,4,5]
functools.reduce(mul, a)


I am working on the file "Python_2_3.ipynb".
The first task is:
Aufgabe 4
Hier ist eine Liste der Jahres-Zinssätze für Privatdarlehen der letzten 10 Jahre (frei erfunden!):
2004: 4,3 - 2005: 4,0 - 2006: 3,5 - 2007: 3,0 - 2008: 2,5 - 2009: 3,2 - 2010: 3,3 - 2011: 1,8 - 2012: 1,4 - 2013: 0,7<br/>Wieviel hat jemand auf dem Konto, der Anfang 2004 750€ eingezahlt hat.
Exkurs: timeit
Can you write Python code for it?

def test():
    """Stupid test function"""
    L = [i for i in range(100)]

if __name__ == '__main__':
    import timeit
    print(timeit.repeat("test()", setup="from __main__ import test", number=1000000, repeat=3))

import random

def get_random_NGram(ngram_length):
    chars = []
    for i in range(ngram_length):
        x = random.randint(66,90)
        chars.append(chr(x))
    a = "".join(chars)

if __name__ == '__main__':
    import timeit
    print(timeit.repeat("get_random_NGram(5)", setup="from __main__ import get_random_NGram", number=100000, repeat=3))

def get_random_NGram(ngram_length):
    a = "".join([chr(random.randint(66,90)) for i in range(ngram_length)])

if __name__ == '__main__':
    import timeit
    print(timeit.repeat("get_random_NGram(5)", setup="from __main__ import get_random_NGram", number=100000, repeat=3))


I am working on the file "Python_2_3.ipynb".
The first task is:
Die Zahl, die itemgetter als Parameter übergeben wird, ist der index im Tuple, der zum Sortieren verwendet werden soll, hier also das zweite Element. Nun können wir das auf ein Dictionary anwenden:
Can you write Python code for it?

wl = dict(haus=8, auto=12, tier=10, mensch=13)
[e for e in wl.items()]

sorted(wl.items(), key=itemgetter(1), reverse=True)

[a[0] for a in sorted(wl.items(), key=itemgetter(1), reverse=True)]


I am working on the file "Python_2_3.ipynb".
The first task is:
Eleganter ist die Verwendung der Methode zip, die man außerdem auch dann verwenden kann, wenn kein Index vorhanden ist.
Can you write Python code for it?

for (x,y) in zip(a,b):
     print (x, " ", y)


I am working on the file "Python_2_3.ipynb".
The first task is:
Exkurs: Sortieren für Objekte
Can you write Python code for it?

class student:
    def __init__(self, name, note):
        self.name = name
        self.note = note

studenten = [student("Cordula",2), student("Vicky", 3), student("Michael", 1)]
[print(stud.name + "\t" + str(stud.note)) for stud in studenten]

from operator import attrgetter
[print(stud.name + "\t" + str(stud.note)) for stud in sorted(studenten, key=attrgetter("note"))]


I am working on the file "Python_2_3.ipynb".
The first task is:
Hier die Definition der Methode:

sorted(iterable[, key][, reverse])

Can you write Python code for it?

#mit reverse drehen wir die Sortierreihenfolge um
b = ["b", "a", "d", "c","e"]
sorted(b, reverse=True)


I am working on the file "Python_2_3.ipynb".
The first task is:
Hier ein etwas realistischeres Beispiel. Das 'flatttening of a list of lists' (Denken Sie daran, dass die Addition auf Listen angewandt diese verknüpft.)
Can you write Python code for it?

a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
x = [a,b,c]
x

from operator import add
functools.reduce(add, x)


I am working on the file "Python_2_3.ipynb".
The first task is:
Hier noch einmal das ganze Skript im Zusammenhang:
Can you write Python code for it?

#parses a string and returns a list of words
import re
def tokenize (line):
    wordlist = re.findall("\w+", line)
    return wordlist

#count vowels in a word, returns their number
def count_vowels(word):
    nr_of_vowels = 0
    for c in word:
        if c in "aeiouäöüAEIUOÄÖÜ":
            nr_of_vowels += 1
    return nr_of_vowels

#input
text = "Dies ist ein langer, lausiger Textbaustein."
#output
list_of_vowels = []
#preprocess input
wordlist = tokenize(text)
#apply count method on all words in list
list(map(count_vowels, wordlist))


I am working on the file "Python_2_3.ipynb".
The first task is:
Kurzum, wenn Sie sehr große Datenmengen verarbeiten (oder unendlichen Listen), dann sollten Sie mit generator expressions arbeiten.
Generators
Wenn Sie selbst Funktionen schreiben, dann können Sie als Rückgabewert natürlich Listen verwenden. Aber auch hier könnte es sein, dass die Größe der Liste möglicherweise den Arbeitsspeicher sprengt. Dann können Sie Generators verwenden. Der entscheidende Unterschied liegt in der Verwendung des Schlüsselworts yield in der Definition der Funktion. <br/>
Can you write Python code for it?

def generate_ints(N):
    for i in range(N):
        yield i

#hier benutzen wir die Funktion; der Parameter N könnte beliebig groß sein, da
#immer nur die Zahl ausgegeben wird, die gerade abgefragt wird.
for j in generate_ints(5):
    print(j)


I am working on the file "Python_2_3.ipynb".
The first task is:
Noch ein -etwas länges - Beispiel. Im folgenden definieren wir erst einmal eine Funktion, die eine Liste zufälliger Buchstabenkombinationen in definierbarer Länge zurückgibt.
Can you write Python code for it?

import random

def get_random_NGram(ngram_length):
    chars = []
    for i in range(ngram_length):
        x = random.randint(66,90)
        chars.append(chr(x))
    return "".join(chars)

get_random_NGram(5)


I am working on the file "Python_2_3.ipynb".
The first task is:
Nun können wir die Lösung für unsere Aufgabe schon einmal als Pseudecode hinschreiben:
So, nun müssen wir nur noch die Methoden ausfüllen und den Pseude-Code in richtigen Code verwandeln. Also erst einmal tokenize. Das zerlegen von Strings in Listen kann man mit mehreren vorgefertigten Methoden erledigen. Wir können die primitive split()-Methode nehmen, die allerdings nicht so gut geeignet ist, wenn der Text nicht nur an einem einzelnen Zeichen zerlegt werden soll. Oder wir verwenden re.findall() aus dem regular expressions-Modul, das hier deutlich flexibler ist. Eine richtige Tokenisierung müsste natürlich noch einmal komplexer sein.
Can you write Python code for it?

#parses a string and returns a list of words
import re
def tokenize (line):
    wordlist = re.findall("\w+", line)
    return wordlist


I am working on the file "Python_2_3.ipynb".
The first task is:
Nun wollen wir die Funktion so umschreiben, dass Sie als Parameter außerdem die Anzahl der Ngramme enthält, die zurückgegeben werden soll:
Can you write Python code for it?

import random

def get_random_NGram(ngram_length, nr_of_ngrams):
    ngrams = []
    for j in range(nr_of_ngrams):
        chars = []
        for i in range(ngram_length):
            x = random.randint(66,90)
            chars.append(chr(x))
        ngrams.append("".join(chars))
    return ngrams

get_random_NGram(5,5)


I am working on the file "Python_2_3.ipynb".
The first task is:
Ok, nun können wir alles zusammensetzen:
Can you write Python code for it?

#input
text = "Dies ist ein langer, lausiger Textbaustein."
#output
list_of_vowels = []
#preprocess input
wordlist = tokenize(text)
#main loop
#for each word in wordlist do count_vowels and add result to list_of_vowels
#Es gibt zwei Möglichkeiten, diesen Loop zu gestalten. Erstens ganz traditionell:
for word in wordlist:
    list_of_vowels.append(count_vowels(word))
print (str(list_of_vowels))


I am working on the file "Python_2_3.ipynb".
The first task is:
Programme strukturieren
Aufgabe 1 von der letzten Sitzung:

Ersetzen Sie eine Reihe von Worten durch eine Reihe von Zahlen, die die Anzahl der Vokale anzeigen. Z.B.: "Dies ist ein Satz" -> "2 1 2 1"
1) Schritt: Analysieren Sie den Input und den Output - welche Datenstruktur ist hier notwendig?
"Dies ist ein Satz" - String. Wir brauchen also eine Variable für diesen string

"2 1 2 1" - String (sieht aber aus, wie eine Liste, die zu einem String konvertiert wurde! Also eine Variable für die Ausgabeliste.

2) Schritt: Analysieren Sie, auf welcher Datenstruktur operiert wird

     "Ersetzen Sie eine Reihe von Worten" -> also auf Worten. Da wir die Ausgabe der Zahlen in der Sequenz der Worte brauchen, brauchen wir die Worte in einer Liste, die die Reihenfolge bewahrt.
3) Wie kommen Sie von der Datenstruktur des Inputs zur Datenstruktur, die Sie für die Verarbeitung brauchen?

String, der einen Satz enthält -> Liste von Worten
Can you write Python code for it?

#parses a string and returns a list of words
def tokenize (line):
    wordlist = []
    #hier passiert was Aufregendes
    return wordlist


I am working on the file "Python_2_3.ipynb".
The first task is:
Test, Test:
Can you write Python code for it?


I am working on the file "Python_2_3.ipynb".
The first task is:
Und hier die etwas stärker komprimierte Form - schauen Sie mal, ob Sie sehen, was hier gemacht wird. Aber tatsächlich ist die Kürze der Schreibung nicht so wichtig! Dadurch wird ein Programm nicht effizienter.
Can you write Python code for it?

import re

#input
text = "Dies ist ein langer, lausiger Textbaustein."

#count vowels in a word, returns their number
def cv(word):
    return sum([1 for c in word if c in "aeiouäöüAEIUOÄÖÜ"])

list(map(cv, re.findall("\w+",text)))


I am working on the file "Python_2_3.ipynb".
The first task is:
Und nun wollen wir diese Liste nach den Noten sortieren.
Can you write Python code for it?

from operator import itemgetter
sorted(d, key=itemgetter(1))


I am working on the file "Python_2_3.ipynb".
The first task is:
Wir können die Funktion auch direkt  verwenden
Can you write Python code for it?

a = list(filter(lambda c: c.isalnum(), [chr(c) for c in range(34,250)]))
print(a[:20])


I am working on the file "Python_2_3.ipynb".
The first task is:
mit key übergeben wir eine Funktion, die das jeweilige Element aus dem Iterator bearbeitet
Can you write Python code for it?

c = ["d", "a", "A", "U"]
sorted(c)

sorted(c, key=str.upper)

#nehmen wir an, wir haben eine Liste von 2-Tuples, z.B. Namen und Noten
d = [("Michael", 3), ("Vicky", 2), ("Cordula", 1) ]


I am working on the file "Python_2_3.ipynb".
The first task is:
oder
Can you write Python code for it?

a = list(map(chr, range(34, 250)))
print(a[:50])

#1b) nur die ausgeben, die keine Buchstaben oder Zahlen sind
def is_no_char(c):
    if c.isalnum():
        return False
    else:
        return True

a = list(filter(is_no_char, [chr(c) for c in range(34,250)]))
print(a[:20])


I am working on the file "Python_2_3.ipynb".
The first task is:
oder auch:
Can you write Python code for it?

import random

def get_random_NGram(ngram_length):
    return "".join([chr(random.randint(66,90)) for i in range(ngram_length)])

get_random_NGram(3)


I am working on the file "Python_2_3.ipynb".
The first task is:
zip() beendet die Arbeit, sobald der kürzere Iterator erschöpft ist. Wenn Sie das nicht wollen, dann verwenden Sie itertools.zip_longest()
Aufgabe 2
Sie haben zwei Dateien, die eigentlich identisch sein sollen. Prüfen Sie das und geben Sie jede Zeile aus, die nicht identisch ist. (Basteln Sie sich selbst vorher zwei Testdateien, die 5 identische Zeilen und 2 nicht-identische haben).
Aufgabe 2a (optional)
Die deutsche Sprache hat 29 Buchstaben einschließlich der Umlaute. Wieviele Wörter mit drei Buchstaben können wir daraus bilden, wenn wir vereinfachend davon ausgehen, dass der Unterschied zwischen Groß- und Kleinschreibung keine Rolle spielt und dass ein Buchstabe nur einmal in einem Wort vorkommen darf?
Generator Expressions
Generator expression sind in der Syntax und Funktionsweise List Comprehensions sehr ähnlich. Noch einmal ein Blick auf letzere:
Can you write Python code for it?


I am working on the file "Python_2_4.ipynb".
The first task is:
betweenness centrality Intuition: Ein Knoten ist wichtig/zentral, wenn er auf vielen Wegen zwischen anderen Knoten liegt.

Zur Berechnung werden also einmal alle Pfade zwischen zwei Knoten s und t berechnet und dann der Anteil dieser Pfade, auf denen der Knoten u liegt

$$ C_B(u) = \sum_{s,t \in V} \frac {\sigma (s, t|v)}{\sigma (s,t)} $$
wobei gilt:

V ist das Set der Knoten

σ(s,t) ist die Anzahl der kürzesten Pfade zwischen s und t

σ(s,t|v) ist die Anzahl der kürzesten Pfade zwischen s und t, die über v laufen.
Can you write Python code for it?


I am working on the file "Python_2_4.ipynb".
The first task is:

Wenn zwei Knoten verbunden sind, dann gibt es mindestens einen Pfad, der den kürzesten Weg zwischen den Knoten darstellt; diesen Pad nennt man die Distanz, manchmal auch geodesische Distanz oder auch einfach den kürzesten Pfad. Die folgende Grafik zeigt den kürzesten Pfad von B nach E (über A und D):

Can you write Python code for it?

#einen Graphen erstellen
import networkx as nx
g = nx.Graph()
g.add_edges_from([("A","B"),("A","C"),("A","D"),("C","D"),("D","E")])

#suchen des kürzesten Pfads von B nach E:
nx.shortest_path(g, "B","E")


I am working on the file "Python_2_4.ipynb".
The first task is:
Auch für komplexe Daten und Strukturen gut geeignet ist das Format GEFX (Graph Exchange XML Format), das z.B. auch von Gephi unterstützt wird.
Can you write Python code for it?

g = nx.Graph()
g.add_weighted_edges_from([("Goethe","Schiller",12),("Goethe","Humboldt", 1),("Goethe","Zelter", 3)])
nx.write_gexf(g, "file3.txt")
with open("file3.txt", encoding="utf8") as fin:
    print(fin.read(-1))


I am working on the file "Python_2_4.ipynb".
The first task is:
Aufgabe
1) Die Bibliothek networkx kennt auch eine große Menge von Graph-Generatoren, mit denen man Graphen erzeugen kann. Verwenden Sie die Funktionen a) hypercube_graph(n) [mit n=3] und b) krackhardt_kite_graph(), um zwei Netzwerke zu erzeugen. Visualisieren Sie das Ergebnis und berechnen Sie einen kürzesten Pfad  a) zwischen (0,0,0) und (1,1,1) sowie b) zwischen 1 und 9 an. Überlegen Sie sich, wie für die beiden Graphen die Ergebnisse der drei Zentralitätsmaße aussehen müßten. Berechnen Sie dann für die beiden Graphen jeweils die 3 Zentralitätsmaße (sortieren Sie nach Größe des Maßes).
2) Berechnen Sie die drei Zentralitätsmaße für das Figurennetzwerk der Hausaufgabe und zeigen Sie die jeweils wichtigsten 10 Figuren und ihre Werte an.
Lesen und Schreiben von Graphen
adjacency-Listen
Can you write Python code for it?

import networkx as nx
g = nx.Graph()
g.add_edges_from([("A","B"),("A","C"),("A","D"),("C","D"),("D","E"),("E","F")])
nx.draw_networkx(g)
plt.show()

print(g.nodes())
g.adjacency_list()


I am working on the file "Python_2_4.ipynb".
The first task is:
Außerdem gibt es noch eine Funktion, um die Labels der Knoten festzulegen:<br/>
draw_networkx_labels(G, pos, labels=None, font_size=12, font_color=’k’, font_family=’sans-serif’,
font_weight=’normal’, alpha=1.0, ax=None, **kwds)
Can you write Python code for it?

#wenn Sie alle Labels setzen wollen, können Sie das auch direkt in der Funktion draw_networkx machen
nx.draw_networkx(g, pos, node_color="yellow", with_labels=False)
labels = {0:0,1:1,2:2,3:"Center",4:4,5:5,6:6,7:7,8:8,9:"Outsider",}
nx.draw_networkx_labels(g, pos, labels=labels, font_size=12, font_color='b')
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
Das Visualisieren von Graphen
networkx ist keine Bibliothek zum Visualisieren von Graphen, vielmehr verwendet sie matplotlib zur Darstellung und bietet einige Funktionen, um die Objekte, die dargestellt werden sollen, anzusprechen. Wir haben ja schon die ganze Zeit mit den generischen Funktionen nx.draw() und nx.draw_networkx() gearbeitet.
Can you write Python code for it?

import matplotlib.pyplot as plt
import networkx as nx
g = nx.krackhardt_kite_graph()
#plotting starts here
nx.draw_networkx(g)
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
Durch die labels können wir die - im Prinzip  ganz abstrakte Datenstruktur - für ganz beliebige Informationen verwenden, z.B. Städte und deren Zugverbindung, Namen in Texten und deren gemeinsames Vorkommen, Briefpartner usw.
Can you write Python code for it?

g = nx.Graph()
g.add_nodes_from(["Goethe", "Schiller", "Humboldt", "Zelter"])
g.add_edges_from([("Goethe","Schiller"),("Goethe","Humboldt"),("Goethe","Zelter")])
nx.draw_networkx(g)
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
Es gibt eine ganze Reihe von unterschiedlichen Formaten, z.B. read_edgelist (+ read_weighted_edgelist),
Can you write Python code for it?

nx.write_edgelist(g, "file2.txt")

with open("file2.txt", encoding="utf8") as fin:
    for l in fin:
        print(l, end="")


I am working on the file "Python_2_4.ipynb".
The first task is:
Es gibt eine ganze Reihe von verschiedenen Layout-Algorithmen für Graphen. Voreingestellt ist das spring-layout. Aber Sie können auch andere verwenden:
Can you write Python code for it?

#spectral layout
pos = nx.spectral_layout(g)
nx.draw_networkx(g)
plt.show()

#shell layout
pos = nx.shell_layout(g)
nx.draw_networkx(g)
plt.show()

#pos enthält ein dictionary mit den Positionen der Knoten und damit implizit auch der Kanten.
pos


I am working on the file "Python_2_4.ipynb".
The first task is:
Graphen als Datenstruktur
Graphen bieten sich offensichtlich als Datenstruktur an, wenn es darum geht vernetzte Informationseinheiten abzubilden. Man muss ich dann entscheiden, welcher Aspekt als Knoten, welcher als Kante abgebildet wird und was als Gewicht modelliert wird. Tatsächlich kann man in networkx alles was hashable ist als Knoten nehmen, da die zugrundeliegende Informationsstruktur ein dictionary ist.
Can you write Python code for it?

class Author ():
    def __init__(self, name, yob, yod, works):
        self.name = name
        self.yob = yob
        self.yod = yod
        self.works = works

a = Author("Goethe", 1749, 1832, ["Werther", "Faust"])
b = Author("Schiller", 1759, 1805, ["Die Räuber", "Wallenstein"])
c = Author("Lessing", 1729, 1781, ["Minna von Barnhelm", "Nathan der Weise"])

g = nx.Graph()
g.add_edges_from([(a,b),(a,c),(b,c)])
nx.draw_networkx(g)
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
Man kann diese Befehle beliebig kombinieren:
Can you write Python code for it?

nx.draw_networkx(g, pos, node_color="yellow")
nx.draw_networkx_nodes(g, pos, [9], node_color="orange")
nx.draw_networkx_nodes(g, pos, [8], node_color="b")
nx.draw_networkx_edges(g, pos, [(8,9)], width=3, edge_color="g", style="dashed")
nx.draw_networkx_edges(g, pos, [(7,8)], width=3, edge_color="b")
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
Oft ist es noch besser, den Graphen zu visualisieren:
Can you write Python code for it?

import matplotlib.pyplot as plt
nx.draw(g)
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
Ok. Aber hier fehlt noch der Rest des Graphen. Den können wir einfach mit dem generischen Befehl malen:
Can you write Python code for it?

#jetzt müssen wir auch hier die Positionen übergeben, sonst werden diese noch einmal berechnet
pos = nx.spring_layout(g)
nx.draw_networkx(g, pos)
#Sie müssen die Reihenfolge beachten. Die Zeichenbefehle werden nacheinander ausgeführt.
nx.draw_networkx_nodes(g, pos, [9], node_color="b")
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
Und zuletzt die Funktion, die es Ihnen erlaubt, die Labels an den Kanten festzulegen:<br/>
draw_networkx_edge_labels(G, pos, edge_labels=None, label_pos=0.5, font_size=10,
font_color=’k’, font_family=’sans-serif’, font_weight=’normal’,
alpha=1.0, bbox=None, ax=None, rotate=True, **kwds)
Can you write Python code for it?

nx.draw_networkx(g, pos, node_color="yellow")
nx.draw_networkx_nodes(g, pos, [9], node_color="blue")
nx.draw_networkx_edges(g, pos, [(8,9)], width=3, edge_color="b", style="dashed")x.draw_networkx_edge_labels(g, pos, edge_labels={(8,9):"outsider"})
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
Wenn wir etwas mehr Informationen als nur die Grundstruktur des Graphen sehen wollen, verwenden wir die Methode draw_networkx. Hier werden nun etwa die Labels der Knoten angezeigt.
Can you write Python code for it?


I am working on the file "Python_2_4.ipynb".
The first task is:
Wir können jeden einzelnen Aspekt eines Graphen, also jeden Knoten, jede Kante gezielt manipulieren und Label, Farbe, Größe usw. festlegen. Dabei müssen wir eines beachten: Am Anfang der Layout-Sequenz müssen wir einmal das Layout berechnen lassen und dann diese Information immer als Parameter an die folgenden Grafikoperationen übergeben.
Beginnen wir damit, dass wir den Knoten 9 blau einfärben. Hier ist die Signatur der entsprechenden Funktion:

draw_networkx_nodes(G, pos, nodelist=None, node_size=300, node_color=’r’, node_shape=’o’, alpha=
1.0, cmap=None, vmin=None, vmax=None, ax=None, linewidths=None, label=
None, **kwds)

Wir müssen also den Parameter node_color setzen
Can you write Python code for it?

nx.draw_networkx_nodes(g, pos, [9], node_color="b")
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
Wir können uns die Informationen über einen Graphen schnell ausgeben lassen:
Can you write Python code for it?

nr_nodes = len(g.nodes())
print("Graph hat " + str(nr_nodes) + " Knoten.")
nr_edges = len(g.edges())
print("Graph hat " + str(nr_edges) + " Kanten.")


I am working on the file "Python_2_4.ipynb".
The first task is:
Wir können zumdem die Kanten verwenden, um Informationen über das Netzwerk abzuspeichern. Das macht man, indem man den Kanten ein Gewicht gibt. Wenn die Knoten etwa Namen in einem Briefnetzwerk repräsentieren, können wir die Anzahl der Briefe an den Kanten notieren. Die Visualisierung zeigt die größere Menge der Briefe als größere Nähe an:
Can you write Python code for it?

g = nx.Graph()
g.add_nodes_from(["Goethe", "Schiller", "Humboldt", "Zelter"])
g.add_edges_from([("Goethe","Schiller", dict(weight=12)),("Goethe","Humboldt", dict(weight=1)),("Goethe","Zelter", dict(weight=3))])
#auch hier gibt es eine convenience function, die die Eingabe vereinfacht:
g.add_weighted_edges_from([("Goethe","Schiller",12),("Goethe","Humboldt", 1),("Goethe","Zelter", 3)])
nx.draw_networkx(g)
plt.show()


I am working on the file "Python_2_4.ipynb".
The first task is:
oder einfach auch (einschließlich evtl. Gewichte):
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Arrays mit nan oder anderen ungültigen Werten verhalten sich nicht wie gewohnt:
Can you write Python code for it?

data.sum()

for i in data:
    print(i.sum())


I am working on the file "Python_2_5.ipynb".
The first task is:
Auch bei arrays greifen wir über den Index auf die Elemente zu:
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Aufgabe
1) Laden Sie die Daten aus der Datei missing.csv, maskieren Sie ungültige Werte und berechnen Sie die Summe der Zeilen.
Funktionales Programmieren mit Arrays
numpy bietet eine große Menge an Funktionen, die man mittels broadcasting auf Arrays anwenden lassen kann. Man kann aber auch in vergleichbarer Weise bzw. in einer Art, die an die Verwendung von map im funktionalen Programmieren erinnert, jede selbstgeschriebene Funktion auf numpy-Arrays anwenden. Dazu dient die Funktion np.apply_along_axis().

np.apply_along_axis(func1d, axis, arr, *args)

Diese Funktion verarbeitet eine Matrix in der Weise, dass in der angegebenen Achse jeweils ein Vektor, also ein 1-dimensionaler Array, herausgeschnitten wird und mit der Funktion verarbeitet wird, d.h. die Funktion sollte als Input einen Vektor erwarten.
Can you write Python code for it?

def simple_mean(a):
    return a.sum() /len(a)

a = np.array([[1,4,2,7,5], [3,1,4,6,3], [6,1,4,2,4]])
print(a)
np.apply_along_axis( simple_mean,axis=0,arr=a)  #axis u arr kann man natürlich weglassen, hier zur Erläuterung

#Im folgenden Beispiel wird die Axis auf 1 gesetzt:
np.apply_along_axis( simple_mean,axis=1,arr=a)

#wir können so auch numpy Funktionen auf Arrays anwenden
g = np.array([2,12,5,2,4,9])
print(np.max(g))
print(np.max(a))
np.apply_along_axis(np.max,axis=0,arr=g)


I am working on the file "Python_2_5.ipynb".
The first task is:
Dabei muss man allerdings beachten, dass die Länge der Dimension, immer gleich sind oder 1. Wenn eine der Dimensionen die Länge 1 hat und sie trifft auf eine längere, dann wird sie auf deren Länge erweitert.
Can you write Python code for it?

a = np.array([[1,2,3],[4,5,6]])
b = np.array([7,8,9,10])

#erzeugt einen Fehler
#a * b

b = np.arange(3).reshape(1, 3)
b

a * b


I am working on the file "Python_2_5.ipynb".
The first task is:
Das funktioniert nur, wenn die Gesamtlänge der alten Matrix auch genau die neue Matrix ausfüllt - sonst wird eine Exception geworfen.
Aufgabe
1) Legen Sie mit np.arange(start, stop[, step]) ein 1-dimensionales Array mit den Zahlen von 200 bis 1000 an.

2)Verfünffachen Sie alle Werte des Arrays.

3) Erzeugen Sie einen Vektor mit der Größe 100, der ungerade Zahlen beginnend bei 11 enthält.

4) Geben Sie die letzte Zahl des Vektors aus.

5) Erzeugen Sie eine Matrix der Form 40x 25 mit den Zahlen von 0-999 als Inhalt.

6) Lassen Sie sich die erste Zeile der Matrix anzeigen.

7) Geben die drei Spalten aus, die die Zahlen 150,151,152 enthalten - von Anfang an.

Broadcasting
Ein weiterer Unterschied zwischen Python-Listen und numpy Arrays besteht darin, dass Arrays - im Gegensatz zu Python Listen - Vektorisierung und Broadcasting unterstützen. Will man z.B. zwei Python-Listen einfach multiplizieren, so könnte man versucht sein, folgendes zu schreiben:
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Das ist alles andere als einfach zu verstehen. Siehe "General Broadcasting Rules" im numpy-Handbuch.
Aufgaben
1) Erzeugen Sie einen Array mit der Form 4 x 5, der mit den Zahlen der 4er Reihe (4,8,12 usw.) gefüllt ist. Normalisieren Sie die Daten, indem Sie sie durch die Summe teilen. <br/>
2) Finden Sie den höchsten Wert der Matrix und jeder Reihe.
Datentypen in Numpy Arrays
Numpy Arrays bestehen, wie oben erwähnt, aus Daten mit dem gleichen Datentypen. Arrays mit mehreren Datentypen nennt man strukturierte Arrays oder Records (s.u.). Man kann den Datentypen auch explizit angeben, (mit den bekannten Nebeneffekten):
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Die Arrays werden elementweise multipliziert. Arrays verhalten sich also wie mathematische Vektoren.
Wir können in Python zwar eine Liste mit einer Zahl multiplizieren, aber was dann passiert, ist folgendes: die Liste wird entsprechend oft wiederholt
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Die Maske hat an den Stellen den Wahrheitswert True, wo der darunterliegende Wert die normalen Array-Operationen stören würde. Man kann übrigens, wenn man will, selbst entscheiden, wie die Maske aussieht. Siehe im numpy-Handbuch den Abschnitt 3.19 masked array operations.
Can you write Python code for it?

masked_data.sum()

for i in masked_data:
    print(i.sum())


I am working on the file "Python_2_5.ipynb".
The first task is:
Die Parameter:

delimiter - Welches Zeichen trennt die Felder einer Reihe in der csv-Datei

skiprows  - Welche Zeilen übersprungen werden sollen, falls die Datei wie hier Kolumnentitel enthält

usecols  -  Welche Spalten sollen verwendet werden. Kann man weglassen, wenn alles geladen werden soll. Hier können wir die erste nicht gebrauchen.

Gestalt eines Arrays
Ein Array hat soviele Achsen wie er Dimensionen hat. Bei manchen Operationen werden wir die Information, welche Achse nun behandelt werden soll, angeben müssen. Hier das Beispiel eines zweidimensionalen Arrays:

Unter 'Form' der Matrix versteht man die Anzahl der Zellen in die jeweilige Richtung der Achse. Die Form kann man mit dem Befehl shape abfragen:
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Genau das aber kann man mit numpy Arrays machen:
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Im folgenden werde ich anstatt von 1-dimensionalen Arrays auch von Vektoren sprechen und einen mehrdimensionalen Array als Matrix bezeichnen. Das sind mathematische Konzepte, die später noch ausführlicher erläutert werden.
Erzeugen von numpy-Arrays
Es gibt mehrere Wege, wie man numpy-Arrays erzeugen kann:
1) Aus einer Python-Datenstruktur, z.B. einer Liste (wie oben) oder einem Tuple:
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Mit der Funktion reshape() können wir einen Vektor oder eine Matrix umformen:
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Multipliziert man einen Vektor mit einem Skalar (also einer einzelnen Zahl), dann wird jeder Wert des Vektors multipliziert:
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
Wenn man Rohwerte einer Erhebung in einer Tabelle hat, dann besteht der erste Schritt oft darin, diese zu normalisieren. Nehmen wir an, die Werte oben stellen insgesamt die Anzahl der Worte in einem Text dar, dann würden wir die Werte so normalisieren, dass wir ausrechnen, wieviel Prozent Anteil das jeweilige Wort an der Gesamtheit hat.
Can you write Python code for it?

dsum = d / d.sum()
#test! :-)
dsum.sum()


I am working on the file "Python_2_5.ipynb".
The first task is:
Wir können auf diese Weise offensichtlich auch Reihen und Spalten angeben, um einzelne Werte oder Wertgruppen herauszuschneiden. Im folgenden Beispiel schneiden wir den Wert heraus, der in der Zelle liegt, die durch die 2. Reihe und die 2. Spalte indexiert ist:
<img src="files/images/numpy_row+columns.png" width=300>
Can you write Python code for it?


I am working on the file "Python_2_5.ipynb".
The first task is:
nd steht für n-dimensional
Can you write Python code for it?

#wir erzeugen einen zweidimensionalen Array
b = np.array([[1,2,3],[4,5,6]])
b


I am working on the file "Python_2_5.ipynb".
The first task is:
numpy-arrays unterscheiden sich in einigen Punkten sehr deutlich von Pythons eingebauter Liste:

numpy Arrays haben bei der Erzeugung eine festgelegte Größe. Verändert man das Array wird eine neue Kopie angelegt und die alte verworfen.

Alle Elemente des Arrays müssen denselben Datentyp haben.

numpy Arrays sind dazu ausgelegt, mehrdimensional verwendet zu werden:

Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Aufgabe
Erzeugen Sie eine Serie mit den Werten 1-20. index = a,b,c usw. Schreiben Sie das Ergebnis in eine Datei und lesen Sie die Datei dann wieder ein.
Serien - Daten auswählen
Das Auswählen von Daten (Slicen) funktioniert erst einmal ebenso wie bei numpy, d.h. wir können einfach mit der Position auf die Daten zugreifen:
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Außerdem können wir aber auch den Index dafür verwenden:
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Außerdem können wir die statistischen Methoden aus numpy verwenden oder auch Pandas eigene
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Broadcasting ist ausgesprochen mächtig und erlaubt es komplexe Vorgänge sehr kompakt auszudrücken. Wenn wir unsere Daten standardisieren wollen, d.h. sie sollen den Mittelwert 0 haben und eine Standardabweichung von 1, dann muss man von jedem Datenpunkt den Mittelwert abziehen und das Ergebnis durch die Standardabweichung teilen. Das kann man nun so ausdrücken:
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Daher kann man auch jeden Ausdruck an dieser Stelle verwenden, der eine Folge von Wahrheitswerten erzeugt (die Anzahl der Wahrheitswerte muss der Anzahl der Elemente in der Serie entsprechen). Wir können also z.B. eine Bedingung so formulieren:
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Das Folgende zeigt, wie man Bedingungen für Werte in zwei Spalten formulieren kann. Beachten Sie:

* Es ist wichtig darauf zu achten, dass man die Bedingungen nicht einfach nebeneinander in die Klammern setzt, sondern durch Klammern eindeutig formuliert.
* Dem ein oder anderen wird sich die Frage stellen, warum man hier den Bit-Operator '&' verwendet und nicht 'and'. In Kürze: Wenn wir mit Vektoren von Wahrheitswerten arbeiten, dann ist der Bit-Operator notwendig, da wir sonst versuchen zu prüfen, ob der Vektor leer ist oder nicht. (Ausführliche Erklärung)
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Das Lesen von Serien ist nicht ganz intuitiv, da man in pandas einen generischen Befehl für das Lesen von csv-Dateien hat, der normalerweise einen DataFrame zurückgibt und dem man mit squeeze=True sagt, dass das Ergebnis eine Serie ist. Außerdem muss man mit index_col kommunizieren, dass die erste Spalte als Index verwendet werden soll.
Can you write Python code for it?

s = pd.read_csv("series.csv", squeeze=True, index_col=0)
s


I am working on the file "Python_2_6.ipynb".
The first task is:
Das funktioniert, wird aber in komplexeren Anwendungen fast immer zu schwer durchschaubaren  Fehlern führen. Deshalb sollte man hier immer mit 'loc' arbeiten (Ausführliche Erklärung)
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
DataFrame
Ein DataFrame ist eine zweidimensionale Datenstruktur mit Spalten, die unterschiedliche Datentypen haben können.
DataFrames erstellen
Wir schauen uns zuerst an, wie man DataFrames erstellt, auch wenn das in der Datenanalyse gar nicht so häufig vorkommt, da man zumeist irgendwo erzeugte Daten aus Dateien einliest.
Es mehrere Wege ein DataFrame zu erstellen.
Can you write Python code for it?

#aus einem zwei dimensionalen array oder einer vergleichbaren numpy-Datenstruktur
#Zeilen (=index) und Spalten (=columns) Informationen werden dann über entsprechende Parameter gesetzt
data = pd.DataFrame([[2,6,3,4],[3,3,1,7]],index=["text 1", "text 2"], columns=["a","b","c","d"])
data

#aus einer Liste von dictionaries
data = pd.DataFrame([dict(a=2,b=6,c=3,d=4),dict(a=2,b=6,c=3,d=4)],index=["text 1", "text 2"])
data

import pandas as pd
#1. aus Serien'
a = pd.Series([2,6,3,4],["a", "b", "c", "d"], name="text 1")
b = pd.Series([3,3,1,7],["a", "b", "c", "d"], name="text 2")
c = pd.Series([1,7,2,2],["a", "b", "c", "d"], name="text 3")
d = pd.Series([5,6,8,1],["a", "b", "c", "d"], name="text 4")
df = pd.DataFrame([a, b, c, d])
df


I am working on the file "Python_2_6.ipynb".
The first task is:
DataFrames speichern und lesen
Can you write Python code for it?

data.to_csv("df.csv")

print(open("df.csv").read())

data = pd.read_csv("df.csv", index_col=0)
data


I am working on the file "Python_2_6.ipynb".
The first task is:
Der zweite Unterschied besteht darin, dass ich die Auswahl von Spalten gleich in den Ausdruck aufnehmen kann, einfach durch ein Komma abgetrennt. Im Folgenden wähle ich die Zeilen von 'text 1' bis 'text 3', aber nur die Spalte c.
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Durch Gruppen iterieren
Can you write Python code for it?

gender = df.groupby("gender")
for group_name, group_data in gender:
    print(group_name)
    print(group_data)
    print("---")


I am working on the file "Python_2_6.ipynb".
The first task is:
Durch das Hinzufügen der Axeninformation können wir die Spaltennamen sortieren:
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Ebenso üblich ist es, den Index des Elements als Selektionskriterium zu geben.
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Eine einzelne Gruppe herausgreifen
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Im folgenden erzeugen wir einen Plot
Can you write Python code for it?

from matplotlib import pyplot as plt
df.groupby("nationality").boxplot()
plt.show()


I am working on the file "Python_2_6.ipynb".
The first task is:
Man kann jede Folge von Booleans als Selektionsindex verwenden.
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Man kann mit der gleichen Syntax auf die Zeilen zugreifen, aber davon rate ich ab, da das zu Verwirrung führt. Sehr viel klarer ist das System, Zeilen mit iloc bzw. loc anzuspreche. DataFrame stellt nämlich eine sehr mächtige Syntax zur Auswahl der Daten zur Verfügung. Hier funktioniert der Zugriff über spezifische Attribute der Objekte Series bzw. DataFrame:

df.loc[sel] -  wählt Zeilen und Spalten über ihren Namen aus. Wird der Name nicht gefunden, gibt es einen Fehler.

df.iloc[sel] - wählt Zeilen und Spalten über die Position (als Zahl) aus - (i)ndex (loc)ation.

sel - ist das Auswahlkriterium. Es können Einzelwerte, Slices oder auch Listen übergeben werden. Achtung: Im fall von loc wird auch der Endwert in die ausgewählten Daten eingeschlossen! Funktioniert also anders als Python-Arrays. iloc dagegen funktioniert wie Arrays.

Die Syntax von sel bei DataFrames: [row,column]. Lässt man die Angaben zu row oder column weg, wird angenommen, sie lautet :

Die Rückgabewerte dieser ganzen Operationen sind entweder Serien oder DataFrames
iloc
Der folgende Befehl zeigt die Zeilen von 1 bis (aber ausschließlich) 3
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Merging two Dataframes
Wir haben zwei Dataframes, die eine gemeinsame Spalte haben:
Can you write Python code for it?

i1 = pd.Series(["a","b","c","d","g"], name="stadt")
i2 = pd.Series([3,5.5,22,2, 12], name="land")
d1 = pd.DataFrame([i1, i2])
d1 = d1.T
d1

i1 = pd.Series(["a","b","c","d", "e", "f"], name="stadt")
i2 = pd.Series(["ich","du", "er", "sie", "uns", "wir"], name="pros")
d2 = pd.DataFrame([i1, i2])
d2 = d2.T
d2

pd.merge(d1, d2, on="stadt", how="inner")

pd.merge(d1, d2, on="stadt", how="outer")

pd.merge(d1, d2, on="stadt", how="left")


I am working on the file "Python_2_6.ipynb".
The first task is:
Noch mehr Metadaten: Sie können die Daten auch insgesamt benamsen. Hier nennen wir sie 'count':
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Oft ist es sinnvoll, fehlende Werte durch einen Wert zu ersetzen, z.B. 0 (man kann auch einen beliebigen anderen Wert nehmen, der sinnvoll ist):
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Serien und DataFrames sortieren
In Serien und DataFrames kann man entweder die Daten oder den Index sortieren. Beginnen wir mit Serien und dem Sortieren von Daten. Voreingestellt ist das Sortieren innerhalb der gleichen Datenstruktur, d.h. es gibt keine Rückgabe, vielmehr wird die ursprüngliche Serie modifiziert. Verwendet wird das besonders bei großen Datenmengen sehr effektive quicksort, aber Sie können den Algorithmus selbst setzen. Außerdem können Sie bestimmen, ob aufsteigend sortiert werden soll oder nicht.
Can you write Python code for it?

import pandas as pd
s = pd.Series([3,1,6,2,8,3])
s.sort_values()
s

s.sort_values(ascending=False, kind="mergesort")
s


I am working on the file "Python_2_6.ipynb".
The first task is:
Serien verwenden
Serien verhalten sich wie mathematische Vektoren, d.h. man kann sie mit Skalaren (= einfache Zahlen) oder anderen Vektoren, die die gleiche Länge haben, multiplizieren.
Can you write Python code for it?

#die Metadaten bleiben in der Ausgabe erhalten!
s * 3

#Normalisierung, d.h. jedes Element der Serie wird durch die Gesamtsumme geteilt.
#Die Summe aller Elemente ergibt 1
x = s / s.sum()
print(x)
print("Summe aller Werte in der normalisierten Serie: ", x.sum())

#Multiplikation gleichlanger Vektoren
a = pd.Series([2,3,1,5,5])
b = pd.Series([3,4,1,5,6])
a * b

#ACHTUNG
s * a

#nur die Daten mit den gleichen Metadaten werden wie erwartet verarbeitet
c = pd.Series([2,5,1,3,5],["a","b","c","d","e"])
s * c

s + c


I am working on the file "Python_2_6.ipynb".
The first task is:
Spalten und Zeilen aufgrund von Werten auswählen
Eine der wichtigsten Anwendungen von DataFrames ist die Auswahl bestimmter Daten aufgrund von bestimmten Werten. Das entspricht ungefähr dem select-Befehl in SQL. Das ist insgesamt ein sehr umfangreiches Feld, und wir schauen uns nur einige Grundbegriffe davon an.
Im Grunde geht es, wie oben schon einmal erwähnt, zumeist darum, dass man eine Liste von True/False-Werten aufgrund der Auswahlbedingungen erzeugt und diese dann als Index für die Serie / den DataFrame verwendet.
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Und auch bei der Angabe von Spalten kann ich Spannen, bzw. Listen verwenden
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Wenn wir nur die Spalte 'b' haben wollen, dann könnte man das so schreiben:
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Werfen wir einen Blick in die Datei:
Can you write Python code for it?


I am working on the file "Python_2_6.ipynb".
The first task is:
Wir können eine Tabelle auch nach den Werten einer Spalte sortieren lassen. Dazu dient die Methode sort_values.
Can you write Python code for it?


I am working on the file "Python_2_7.ipynb".
The first task is:
Andere Chart-Typen: Pie Charts, Bar Charts, Histogramme, usw.
Pie Charts
Pie-Charts kennen wir alle aus der Zeitung, z.B. bei der Anzeige von Wahlergebnissen. Sie dienen der Anzeige von Verteilungen einer Gesamtheit (z.B. alle Wahlstimmen) über eine kleine Anzahl von Einheiten (z.B. alle Parteien).
Can you write Python code for it?

#Daten + labels
election =  [38.3, 26.8, 11.0, 9.3, 4.0, 3.8, 6.8 ]
labels = ["CDU/CSU","SPD","Die Grünen","Die Linke","FDP","AfD","Sonstige"]
#plotting
plt.pie(election,labels=labels)
plt.show()


I am working on the file "Python_2_7.ipynb".
The first task is:
Bar Charts
Bar Charts sind Säulendiagramme, mit denen man ebenfalls die Ausprägung von wenigen Ergebnissen anzeigen kann (man sieht nur nicht so gut, dass es insgesamt 100% sind, dafür sind die Größenunterschiede besser zu sehen). Wir übergeben die x und y Werte als Listen, wobei der erste Eintrag in beiden Listen die Angaben für die erste Säulen enthält:
Can you write Python code for it?


I am working on the file "Python_2_7.ipynb".
The first task is:
Histogramme
Histogramme werden zumeist verwendet, um Häufigkeiten in Form von Säulen anzuzeigen. Die Säulen repräsentieren die Häufigkeit, mit der Datenpunkte in diese Kategorie (bins) fallen. Wohlgemerkt: Das Histogramm zeigt an, wie häufig (= x-Wert) ein Datenpunkt mit einer gewissen Ausprägung (=y-Wert) vorkommt. Nehmen wir an, wir würfeln 20-mal mit einem 6-seitigen Würfel und lassen uns dann die Werte anzeigen:
Das ist natürlich besonders sinnvoll, wenn man sehr viele Werte hat:
Can you write Python code for it?

import matplotlib.pyplot as plt
import numpy as np
#Datenerzeugung: erzeugt 1000 Zufallszahlen, deren Verteilung der Normalverteilung folgt
y = np.random.randn(1000)
#plotting. default für bins = 10
plt.hist(y, color='k')
plt.show()


I am working on the file "Python_2_7.ipynb".
The first task is:
Im folgenden Beispiel spezifizieren wir die Art der Linie, den Marker, die Linienbreite, aber auch den Ort und das Label der x- und y-Achsen sowie frei positionierbare Texte.
Can you write Python code for it?

#hier sind die schon bekannten Werte
x = np.arange(0,6)

#und hier zeichnen wir damit Linien
#linestyle: - durchgezogene Linie, -- gestrichelte Linie, : gepunktete Linie
#marker (Auswahl): o ^s 1 2 < > p * h H + x D d
plt.plot(x, 0.75*x, color="b", marker="o", linestyle="-", linewidth=3, label="zu langsam" )
plt.plot(x, 2*x, color="y", marker="^", linestyle="--", linewidth=2, label="normal")
plt.plot(x, 3.2*x, color="r", marker="s", linestyle=":", linewidth=1, label="zu schnell")

#Beschriftung der x-Achse
plt.xlabel("hier stehen die x-Werte")
#Beschriftung der y-Achse
plt.ylabel("hier stehen die y-Werte")

#mit der Funktion xticks setzen wir die Position und das Label der Striche auf der X-Achse
#beides übergeben wir als Liste
plt.xticks(range(6), ["a","b","c","d","e","f"])

#ditto mit der y-Achse
plt.yticks(range(0,16,2), ["0k", "10k", "20k", "30k", "40k", "50k", "60k", "70k", "80k"])

#freier Text, der über die x,y Koordinaten positioniert wird
#mit plt.text() verwendet man die Koordinaten mit den Datenwerten
#plt.text(1, 7, "Hier steht Text")
#mit plt.figtext() ist der 0-Punkt unten links (0,0) und der Gegenpunkt oben rechts (1,1)
plt.figtext(0.3,0.6, "Hallo Du, warum kein Tex?")

#zeichnet ein Netz hinter den Linien, womit sich oft Werte besser lesen lassen
plt.grid(True)

#hiermit setzen wir den Titel der Grafik
plt.title("Dies ist eine Beispielgrafik")

#erstellt eine Legende aus den labels der plot-Anweisungen und positioniert sie.
#andere Werte für loc sind 'upper/lower/center right/left'
plt.legend(loc="upper left")
#zeigt die Grafik an
plt.show()