Seite 1 von 1

staatsverschuldung in prozent des bip

Verfasst: Freitag 1. März 2013, 23:43
von sophie_marie
Hallo zusammen,

ich habe ein kleines Programm geschrieben, das die Staatsverschuldung im Verhältnis zum BIP berechnet und hätte hier ein, zwei Fragen, ob und wie es vielleicht besser wäre:

Code: Alles auswählen

staatsverschuldung = [10, 21, 29,45, 64, 130, 239, 388, 538, 1019, 1211, 1490, 2021, 2150]
bip = [50, 92, 155, 235, 361, 551, 789, 984, 1307, 1849, 2048, 2224, 2496, 2644]

index = 0
start = 1950
# die Daten beziehen sich jeweils auf 5-Jahres-Zeiträume

for x in staatsverschuldung:
    prozent = (float(x)/float(bip[index]))*100
    print start, ": ", prozent
    index += 1
    start += 5  
Gibt es eine Möglichkeit, das float zu umgehen oder anders zu setzen (außer, alle Daten mit .0 einzugeben)?
Und vor allem: Gibt es eine Alternative zu meinem "index"?
Die Daten stimmen übrigens und beziehen sich auf Deutschland (wobei die letzten Daten in den Listen für 2012 gelten und nicht, wie ausgegeben, für 2015).

Re: staatsverschuldung in prozent des bip

Verfasst: Samstag 2. März 2013, 00:28
von BlackJack
@sophie_marie: Du könntest einen ``from __future__ import division`` als ersten Import in das Modul setzen. Davor darf ausser Kommentaren und Docstring nichts stehen. Dadurch werden alle Divisionen im Modul mit ``/`` zu Fliesskommadivisionen. Ein `float()`-Aufruf hätte übrigens genügt.

Für `start` könntest Du `enumerate()` ansehen und den Wert dann aus der Zahl berechnen und den Zugriff mit `index` wirst Du mit `itertools.izip()` los. Alternativ zu `enumerate()` könnte man auch `itertools.count()` in der Lösung verwenden.

Re: staatsverschuldung in prozent des bip

Verfasst: Samstag 2. März 2013, 09:30
von snafu
Eine der vielen Möglichkeiten:

Code: Alles auswählen

from __future__ import division

STARTJAHR = 1950
ANSTIEG = 5

schulden = [10, 21, 29,45, 64, 130, 239, 388,
            538, 1019, 1211, 1490, 2021, 2150]

bips = [50, 92, 155, 235, 361, 551, 789, 984,
        1307, 1849, 2048, 2224, 2496, 2644]


jahre = xrange(STARTJAHR, len(bips) * ANSTIEG + STARTJAHR, ANSTIEG)

for (verschuldung, bip, jahr) in zip(schulden, bips, jahre):
    prozent = verschuldung / bip * 100
    print jahr, ': ', prozent

Re: staatsverschuldung in prozent des bip

Verfasst: Samstag 2. März 2013, 10:17
von BlackJack
Eine weitere der vielen Möglichkeiten:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
from __future__ import division
from itertools import count, izip


def main():
    startjahr = 1950
    schrittweite = 5
    schulden = [
        10, 21, 29,45, 64, 130, 239, 388, 538, 1019, 1211, 1490, 2021, 2150
    ]
    bips = [
        50, 92, 155, 235, 361, 551, 789, 984, 1307, 1849, 2048, 2224, 2496,
        2644
    ]
    assert len(schulden) == len(bips)

    jahre = count(startjahr, schrittweite)
    for jahr, jahres_schulden, bip in izip(jahre, schulden, bips):
        print '{0}: {1:6.2f}%'.format(jahr, jahres_schulden / bip * 100)


if __name__ == '__main__':
    main()

Re: staatsverschuldung in prozent des bip

Verfasst: Samstag 2. März 2013, 10:21
von Sirius3
eine andere ohne future division:

Code: Alles auswählen

from itertools import izip, count
schulden = [10, 21, 29,45, 64, 130, 239, 388,
            538, 1019, 1211, 1490, 2021, 2150]

bips = [50, 92, 155, 235, 361, 551, 789, 984,
        1307, 1849, 2048, 2224, 2496, 2644]

for jahr, verschuldung, bip in izip(count(1950,5),schulden, bips):
    prozent = 100.0 * verschuldung / bip
    print '%4d: %4.1f'%(jahr, prozent)

Re: staatsverschuldung in prozent des bip

Verfasst: Samstag 2. März 2013, 10:59
von BlackJack
Und noch eine Alternative mit einer externen Bibliothek (`pandas`), die man vielleicht mal anschauen sollte wenn man öfter mit dem Analysieren von solchen Daten zu tun hat.

Code: Alles auswählen

import pandas as pd


def main():
    startjahr = 1950
    schrittweite = 5
    schulden = [
        10, 21, 29,45, 64, 130, 239, 388, 538, 1019, 1211, 1490, 2021, 2150
    ]
    bips = [
        50, 92, 155, 235, 361, 551, 789, 984, 1307, 1849, 2048, 2224, 2496,
        2644
    ]
    assert len(schulden) == len(bips)
    
    data = pd.DataFrame(
        {'schulden': schulden, 'BIP': bips},
        pd.DateRange(
            pd.datetime(startjahr, 1, 1),
            periods=len(schulden),
            offset=pd.datetools.YearBegin(schrittweite)
        ),
        dtype=float
    )
    print data
    
    for year, ratio in (data['schulden'] / data['BIP'] * 100).iteritems():
        print '{0:%Y}: {1:6.2f}%'.format(year, ratio)


if __name__ == '__main__':
    main()