Pandas Dataframe 'falsch herum'

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

Hallo zusammen,
ich versuche mich immernoch an meinem Clustering.
Aktuell lese ich eine CSV-Datei mit Verkaufszahlen ein.
Das zugehörige Dataframe sieht dann so aus:

Code: Alles auswählen

     0     1     2     3    4    5    6    7    8    9   ...     40      41  \
0   348   381   335   347  279  290  250  305  257  285  ...    442   451   
1  1149  1169  1136  1148  903  756  745  966  887  811  ...    983  1049   
2  1216   966   834   772  463  438  425  409  386  376  ...    744   564  
3   456   471   462   478  376  348  281  276  326  249  ...    302     0.0   
Das Problem daran ist, dass es falsch herum ist. Die einzelnen Verkaufswerte sind praktisch von links nach rechts, ich bräuchte sie aber von oben nach unten. Ziel ist es, für den kmeans-Algorithmus die prozentuale Änderung zu berechnen, mit DataFrame.pct_change().
Ich brauche sozusagen folgendes:

Code: Alles auswählen

     0      1         2         3...
     348    1149     1216      456
     381    1169     1136      471
     ....       ....       ....        ....
So lese ich das Dataframe ein:

Code: Alles auswählen

def extract_articles(data, article_numbers):
    return pd.DataFrame(
        [
            data[data['ARTICLENO'] == article_no]['QUANTITY'].values
            for article_no in article_numbers
        ]
    ).fillna(0)



def read_csv_file(file_name, number_of_lines):
    return pd.read_csv(file_name, parse_dates=['DATE'], nrows=number_of_lines)

def get_unique_article_numbers(data):
    return data['ARTICLENO'].unique()


def main():
    data = read_csv_file('statistics.csv', 200)


    modeling_article_numbers = get_unique_article_numbers(data)
    modeling_data = extract_articles(data, modeling_article_numbers)
Weiß jemand wie das geht?
EDIT: Ich weiß, dass man mit pct_change(axis=1) auch zeilenweise berechnen kann, das bringt mir ja aber im kmeans-Algorithmus nichts, oder? Der geht ja nach wie vor von oben nach unten?
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@Seppl2202: Spalten und Zeilen vertauschen heißt bei Matrizen transponieren. Numpy und Pandas kann das mittels des `T`-Attributs von Arrays und Dataframes:

Code: Alles auswählen

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([[1, 2, 3], [4, 5, 6]])

In [3]: df
Out[3]:
   0  1  2
0  1  2  3
1  4  5  6

In [4]: df.T
Out[4]:
   0  1
0  1  4
1  2  5
2  3  6
Seppl2202
User
Beiträge: 16
Registriert: Dienstag 10. Juli 2018, 06:24

Dankeschön :) weißt du zufällig, wie der kmeans-Algorithmus aus dem sklearn-package arbeitet?
arbeitet der von 'oben nach unten' oder von 'links nach rechts'?
Mein Fehler, das wäre die viel wichtigere Frage : D
Seppl2202
User
Beiträge: 16
Registriert: Dienstag 10. Juli 2018, 06:24

Hallo,
ein kleines Problem hätte ich noch:
Die prozentuale Änderung wird jetzt wie gewünscht von oben nach unten berechnet:
https://drive.google.com/file/d/1I1nRaj ... p=drivesdk
Zahl oben ist die n-te Artikelnummer aus dem Datensatz, die Zahl links ist der n-te Verkaufswert dieser Artikelnummer.
Leider sieht der Plot der Center des kmeans-Algorithmus dazu so aus:
[url]]https://drive.google.com/file/d/14WcVu2 ... p=drivesdk[/url
Das sollte so nicht sein, da ich ja für jeden 'Verkaufstag' (also die Zahlen links) eine Vorhersage haben möchte.
Hier noch der Code dazu:

Code: Alles auswählen

from __future__ import absolute_import, division, print_function
import pandas as pd
import numpy as np
from matplotlib import pyplot as plp
from sklearn import preprocessing
from sklearn.cluster import KMeans
import sys



def extract_articles(data, article_numbers):
    return pd.DataFrame(
        [
            data[data['ARTICLENO'] == article_no]['QUANTITY'].values
            for article_no in article_numbers
        ]
    ).fillna(0)

def read_csv_file(file_name, number_of_lines):
    return pd.read_csv(file_name, parse_dates=['DATE'], nrows=number_of_lines)

def get_unique_article_numbers(data):
    return data['ARTICLENO'].unique()


def main():
    data = read_csv_file('statistics.csv', 400000)
    # data['DATE'] = data['DATE'].astype(int)



    modeling_article_numbers = get_unique_article_numbers(data)
    print("Clustering auf", len(modeling_article_numbers), "article numbers")
    modeling_data = extract_articles(data, modeling_article_numbers)
    modeling_data = modeling_data.iloc[:, :50]
    # 'switch' dataframe
    modeling_data = modeling_data.T
    modeling_data = modeling_data.pct_change().fillna(0)
    print(modeling_data)
    normalized_modeling_data = preprocessing.normalize(modeling_data, norm='l2', axis=1)



    predicting_article_numbers = [430079229, 430079854, 430086845]
    predicting_article_data = extract_articles(data, predicting_article_numbers)
    predicting_article_data = predicting_article_data.pct_change().fillna(0)
    normalized_predicting_article_data = preprocessing.normalize(predicting_article_data, norm='l2')


    kmeans = KMeans(n_clusters=3, random_state=0).fit(normalized_modeling_data)
    print(kmeans.labels_)
    # for data, article_no in [
    #     (normalized_predicting_article_data, 430079229),
    #     (normalized_predicting_article_data, 430079854),
    #     (modeling_data, 430074590),
    # ]:
    #     print('Predicting article {0}'.format(article_no))
    #     print(kmeans.predict([data[0]]))

    for i, cluster_center in enumerate(kmeans.cluster_centers_):
        plp.plot(cluster_center, label='Center {0}'.format(i))
    plp.legend(loc='best')
    plp.title(('Cluster based on ' +   str(len(modeling_article_numbers)) + ' article numbers'))
    plp.show()


main()

Wenn ich modeling_data = modeling_data.iloc[:, :50] durch modeling_data = modeling_data.iloc[:50, :] ersetze, hat der Plot auf der X-Achse zwar die gewünschten Werte (0-50), allerdings werden dann fast alle Artikelnummern in das gleiche Center gelabelt und die Länge des Label-Arrays ist deutlich kleiner als die Anzahl der Artikelnummern im Modeling-Datensatz.
Kann mir hier noch jemand weiterhelfen?
Antworten