Python HTML Link- einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Maya
User
Beiträge: 9
Registriert: Sonntag 9. Dezember 2018, 12:08

Hallo, ich habe ein Problem.

Ich muss eine HTML- Tabelle von Wikipedia in Python einlesen, nur irgendwie klappt es nicht.

Der Link ist: https://en.wikipedia.org/wiki/United_St ... gn_finance

Anschließend müsste ich die spalten im Datensatz umbennen und manch auch entfernen , weiß jemand zufällig wie das geht?

Danke schon mal im voraus :lol:
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Maya: klappt nicht, ist eine sehr schlechte Fehlerbeschreibung. Was hast Du versucht? Was passierte dann? Fehlermeldung, etc?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal als Ansatz:

Code: Alles auswählen

#!/usr/bin/env python3
import pandas as pd


def main():
    campaing_finance = pd.read_html(
        'https://en.wikipedia.org/wiki/'
            'United_States_presidential_election,_2016',
        'Money raised',  # Something that is just in *that* table.
        skiprows=2,
    )[0]
    print(campaing_finance)


if __name__ == '__main__':
    main()
Man möchte natürlich danach die Zahlen zum Beispiel in tatsächliche Zahlen umwandeln und Header hinzufügen.

Warum musst Du das in Python machen? Das ist ja fest für das Jahr 2016, die Daten ändern sich ja nicht und werden wohl auch kaum in der Zukunft erweitert. Da lohnt sich der Aufwand von Automatisierung wahrscheinlich nicht und es ist einfacher/schneller das Beispielsweise direkt aus dem Browser in eine Tabellenkalkulation zu kopieren und schnell von Hand zu bereinigen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Maya
User
Beiträge: 9
Registriert: Sonntag 9. Dezember 2018, 12:08

Es ist für mein Seminar in der Uni. Ich habe ein Aufgabenblatt bekommen und bin damit total überfordert.
Maya
User
Beiträge: 9
Registriert: Sonntag 9. Dezember 2018, 12:08

Aufgabenstellung
1.Lesen sie die die HTML-Tabellen des Wikipedia-Artikels zu den US-amerikanischen Präsidentschaftswahlen von 2016 ein. Die URL lautet: https://en.wikipedia.org/wiki/United_St ... gn_finance
Sollten sie die Pandas read_html() Funktion nutzen, so beachten sie bitte den Hinweis, dass es sich um die Tabelle an Indexstelle 25 handelt.

2.Bereiten sie den Datensatz folgendermaßen auf:
Benennen sie die Spalten entsprechend Liste 1 um.
Entfernen sie die ersten zwei Zeilen des Datensatzes, so dass nur die Zeilen mit Kandidaten übrig bleiben.
Entfernen sie die Fußnoten aus den Strings der Kandidatennamen (gemeint sind die eckigen Klammern und die darin enthaltenen Zahlen). Tips: Text-Daten in Pandas, str.replace

3.Ersetzen sie den numerischen Index mit der Spalte 'Candidate'.
Entfernen sie das Dollarzeichen und die Kommatas aus den verbleibenden Zellen und ändern sie den dtype der verbliebenen Zellen zu einem numerischen Typ. Tip: .astype()

4. Recherchieren sie folgende Informationen über den Datensatz und stellen sie diese kurz dar:
Was sind die Merkmalsträger?
Was sind die Variablen? Beschreiben sie hier auch, was für Informationen in den Daten kodiert sind.
Überlegen sie sich eine Fragestellung, zu deren Beantwortung diese Daten beitragen könnten.
Gehen sie zu folgender Destatis Genesis URL: https://www-genesis.destatis.de/genesis ... scheiben=1
Laden sie den Datensatz „Studienanfänger: Bundesländer, Semester, Nationalität, Geschlecht“ als CSV Datei herunter.
Lesen sie den Datensatz mittels Pandas I/O Funktionen ein. Achten sie dabei insbesondere auf die Zeichen, die zur Seperation verwendet wurden (Tip: sep=).
Grenzen sie den Datensatz auf die zentrale Datentabelle ein. speichern sie diese als Stata Datensatz.

Material
Liste 1
'Candidate'
'Campaign committee Money raised'
'CC Money spent'
'CC Cash on hand'
'CC Debt'
'Outside groups Money raised'
'OG Money spent'
'OG Cash on hand'
'OG Total spent'
Maya
User
Beiträge: 9
Registriert: Sonntag 9. Dezember 2018, 12:08

Wenn irgendjemand mir helfen könnte wäre das fantastisch.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Maya: zum Teil ist das Absicht, weil daran üben kann, wie man mit Aufgaben umgeht, die einen im ersten Moment total überfordern. In vielen Situationen ist es im wirklichen Leben ja nicht anders. Man steht vor einer Aufgabe und es gibt niemanden, der so eine ähnliche Aufgabe schon einmal hatte. Früher saßen wir immer in Lerngruppen zusammen und haben gemeinsam Aufgabenblätter gelöst. Ist das heutzutage nicht mehr angesagt?

In der Aufgabenstellung sind die Stichworte, wo man in der pandas-Dokumentation nachlesen muß, freundlicherweise schon angegeben. Was verstehst Du an der Dokumentation, bzw. an den Beispielen die darin vorkommen nicht?
Maya
User
Beiträge: 9
Registriert: Sonntag 9. Dezember 2018, 12:08

Lerngruppen gibt es leider keine. Ich studiere Soziologie und nicht Informatik. Wir müssen von der Uni aus diesen Kurs bestehen und leider kenne ich niemanden der mit Python umgehen kann, deshalb versuche ich hier Hilfe zu bekommen.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Maya: Ich würde mit dem Python-Tutorial in der Python-Dokumentation anfangen und dann mit der Pandas-Dokumentation weitermachen. Da gibt's ja auch eine kleine Einführung und Verweise auf weitere Tutorials. Anhand der Kapitelnamen kannst Du entscheiden was Du Dir näher anschauen solltest. Erst allgemein und dann spezifisch für Deine zu lösenden Probleme.

Zum Ausprobieren und von Ausdrücken und kleinen Codestücken sind IPython Notebooks bzw. Jupyter Notebooks interessant.

Bezüglich Lerngruppen: Du bist doch nicht die Einzige mit diesem Aufgabenzettel? Ist da bei Euch echt jeder Einzelkämpfer? Wäre ja nicht sehr sozial, ausgerechnet bei Soziologen. :-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Maya
User
Beiträge: 9
Registriert: Sonntag 9. Dezember 2018, 12:08

Code: Alles auswählen

import pandas as pd 
df = pd.read_html('https://en.wikipedia.org/wiki/United_States_presidential_election,_2016#Campaign_finance', 
                   header=0)

df[25]

Code: Alles auswählen

import pandas as pd
df = df.rename(columns={'Candidate': 'Candidate', 'Campaign committee (as of December 9)': 'Campaign committee Money raised', 'Outside groups (as of December 9)': 'CC Money spent', 'Total spent':'CC Cash on hand', 'Unnamed: 4': 'CC Debt', 'Unnamed: 5': 'Outside groups Money raised', 'Unnamed: 6': 'OG Money spent', 'Unnamed: 7': 'OG Cash on hand', 'Unnamed: 8': 'OG Total spent'})
Ich wollte die Kopfzeile Umbenennen , Python spuckt mir aus dass das Attribte rename nicht vorhanden ist. Könnte mir jemand vielleicht helfen.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Maya: Der Name `df` ist ja auch falsch bzw. irreführend, weil man da einen Wert vom Typ `DataFrame` erwarten würde. `read_html()` liefert aber etwas anderes. Den Typ eines Wertes kann man mit der `type()`-Funktion ermitteln und dann beispielsweise mit `print()` ausgeben wenn man das nicht in einer interaktiven Python-Shell macht. Der Rückgabetyp steht aber auch in der Dokumentation.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ein Ansatz den Programmieranteil der beiden Aufgaben anzugehen:

Code: Alles auswählen

#!/usr/bin/env python3
import pandas as pd

COLUMN_NAMES = [
    'Candidate',
    'Campaign committee Money raised',
    'CC Money spent',
    'CC Cash on hand',
    'CC Debt',
    'Outside groups Money raised',
    'OG Money spent',
    'OG Cash on hand',
    'OG Total spent',
]


def convert_dollars(column):
    return column.str.replace('$', '').str.replace(',', '').astype(int)


def process_campaign_finance():
    campaign_finance = pd.read_html(
        'https://en.wikipedia.org/wiki/'
            'United_States_presidential_election,_2016',
        'Money raised',  # Something that is just in *that* table.
        skiprows=2,
    )[0]
    campaign_finance.columns = COLUMN_NAMES
    # 
    # Remove footnotes from candidates names.
    # 
    campaign_finance['Candidate'] = (
        campaign_finance['Candidate'].str.partition('[')[0]
    )
    
    campaign_finance = (
        campaign_finance.set_index('Candidate').transform(convert_dollars)
    )
    print(campaign_finance.to_csv())


def process_student_numbers():
    # 
    # Source of data: https://www-genesis.destatis.de/genesis/online/
    #   logon?sequenz=tabelleErgebnis&selectionname=21311-0014&zeitscheiben=1
    # 
    student_numbers = pd.read_csv(
        'test.csv',
        encoding='iso8859-15',
        sep=';',
        engine='python',
        skiprows=4,
        skipfooter=3,
        index_col=[0, 1],
        header=[0, 1],
    )
    # 
    # Stata doesn't like the `MultiIndex` columns, so let's flatten the index.
    # 
    student_numbers.columns = (
        '_'.join(value) for value in student_numbers.columns.values
    )
    
    student_numbers.to_stata('test.dta')


def main():
    process_campaign_finance()
    process_student_numbers()


if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten