staatsverschuldung in prozent des bip

Code-Stücke können hier veröffentlicht werden.
Antworten
sophie_marie
User
Beiträge: 1
Registriert: Freitag 1. März 2013, 23:21

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).
Zuletzt geändert von Anonymous am Samstag 2. März 2013, 00:22, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
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()
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
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()
Antworten