CSV mit doppelten Index-Werten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Seppl2202
User
Beiträge: 16
Registriert: Dienstag 10. Juli 2018, 06:24

Mittwoch 18. Juli 2018, 13:38

Hallo zusammen,
mein Cluserting ist mittlerweilte ganz ansehnlich geworden, das einzige Problem dass ich noch habe ist das Einlesen der CSV.
Dort gibt es für jede Artikelnummer eine gewisse Anzahl Datums zu denen Verkaufswerte vorliegen. Dabei kommt es zu folgenden Sachen:
Es gibt mehere Werte zum gleichen Datum (Artikelnummer 1 und 2 haben am Tag X Werte von z.B. 150 und 200, also : 2018-07, 150,200)
Es gibt Lücken, das heißt am Tag X hat Artikelnummer 1 einen Verkaufswert, 2,3 und 4 zum Beispiel aber nicht.
Wenn ich das Dataframe folgendermaßen befülle, klappt das:

Code: Alles auswählen

ef extract_articles(data, article_numbers):
    result = pd.concat(
        [
            data[data['ARTICLENO'] == article_no]['QUANTITY']
            for article_no in article_numbers
        ],
        axis=1,
    ).fillna(0)
    result.columns = article_numbers
    return result
Die Lücken werden automatisch mit nul befüllt und ich kann im nächsten Schritt alle Datensätze auswählen, die in eine bestimmte Datumsregion fallen.
Wenn ich so allerdingd z.B. 100000 Zeilen einlesen will, erhalte ich folgenden Error:
ValueError: cannot reindex from a duplicate axis
Das ist ja sogar korrekt, den es gibt ja tatsächlich zu jedem Datum verschiedene Einträge.

Code: Alles auswählen

            434078808  432670975  
DATE                                                                     
2014-06-30       0.0    1069.0    
2014-07-07     448.0    1269.0    
2014-08-11     281.0    1776.0     
2014-08-18     235.0    1378.0     
2014-08-25     357.0       0.0        
2014-09-08     269.0     853.0     
2014-09-22     590.0     856.0    
2014-09-29     250.0     745.0     
2014-10-06     305.0     966.0    
2014-10-27     257.0     789.0
2014-11-24     285.0     511.0
2014-12-15     328.0    1237.0  
2014-12-29     247.0     849.0    
2015-01-05     189.0     848.0  
2015-01-19     212.0     672.0 
2015-01-26     280.0     856.0  
2015-02-02       0.0       0.0    
2015-02-16     250.0     953.0   
2015-02-23     327.0    678.0   
So sieht das mit obigem Code exemplarisch aus. So möchte ich es für beliebig viele Zeilen haben.
Geht das irgendwie? Ich hätte für die spätere Verarbeitung möglichst gerne diese Strukur.

Vielen Dank und viele Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 1424
Registriert: Samstag 2. Juni 2018, 10:21

Mittwoch 18. Juli 2018, 14:42

@Seppl2202: Die Frage ist was bei mehreren gleichen Datumsangaben passieren soll. Es würde sich ja beispielsweise anbieten das nach Datum und Artikelnummer zu gruppieren und die Anzahlen zu addieren.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Seppl2202
User
Beiträge: 16
Registriert: Dienstag 10. Juli 2018, 06:24

Donnerstag 19. Juli 2018, 08:07

Hallo,
ich habe es jetzt erstmal so gelöst:

Code: Alles auswählen

data_extracted = data.groupby(['DATE','ARTICLENO'])['QUANTITY'].sum().unstack(fill_value=0)
Dann sieht das ganze ungefähr so aus:

Code: Alles auswählen

ARTICLENO        430270868       43067075       4300678899       450678432       \
DATE                                                                     
2014-06-30              0           1169           1114           450   
2014-07-07            448           1169            806            436   
2014-08-11            481           1196            834            417   
2014-08-18            435           1138            792            465   
2014-08-25            327              0              0              0   
2014-09-08            299            823            470            396   
2014-09-22            290            816            458            318   
2014-09-29            210            785            435            271   
2014-10-06            305            616            499            250   
2014-10-27            227            707            370            312   
2014-11-24            385            861            371            254   
2014-12-15            338           1437            465            312   
2014-12-29            207            389            412            249   
2015-01-05            219            698            491            282   
2015-01-19            274            172            450            315   
Das

Code: Alles auswählen

.unstack(fill_value=0
scheint also schonmal zu funktionieren.
Das nächste Problem lässt aber nicht lange auf sich warten. Für mein Clustering mit k-means muss ich ja immer einen fixen Zeitraum betrachten, in meinem Fall habe ich mich für ein Jahr entschieden.
Das realisiere ich so:

Code: Alles auswählen

data_extracted = data_extracted.loc['2015-01-01' : '2015-12-31']
Problem: Artikel, die ihren ersten Eintrag im Jahr 2016 haben, werden sozusagen vom 30.06.2014 ab mit dem Wert 0 geführt, bis sie irgendwann ihren ersten 'echten' Wert haben.
Lässt sich das irgendwie bereinigen?
Antworten