[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]

Ich habe mir ein Python-Vorlesungsvideo von Keith Galli, einem jungen Mann aus Übersee, angesehen und die Arbeit ausprobiert.

Lösen wir echte datenwissenschaftliche Probleme mit der Pandas-Bibliothek von Python! ]] Solving real world data science tasks with Python Pandas! Der Schwierigkeitsgrad ist nicht hoch und es ist einfaches Englisch, also schauen Sie bitte.

Es ist ungefähr anderthalb Stunden Video. Es ist eine sehr höfliche Erklärung. Bei Stackoverflow (Q & A-Site zur Programmierung in Übersee) bei Google Es zeigt auch den Prozess der Lösungsfindung.

Es ist eine Aufgabe, mit CSV-Excel-Daten zu analysieren. Die Daten können von seinem Github heruntergeladen werden.

Klicken Sie hier für Github

Ich laufe auf einem Jupyter-Notebook.

Ich mache es, während ich dem Code auf Japanisch Ergänzungen hinzufüge.

Wenn Sie sich das Video ansehen und es tatsächlich berühren, ist dies meiner Meinung nach der beste Weg, um Pandas zu üben.

Sie können ein Gefühl für die Atmosphäre bekommen, indem Sie diesen Artikel lesen.

Erstellen Sie einen Datenrahmen aus dem Lesen von Daten

Laden Sie die Pandas, OS-Bibliothek

import pandas as pd
import os

Überprüfen Sie zunächst, welche Art von Daten enthalten sind (Dateinamenliste abrufen).

files = [file for file in os.listdir("Sales_Data")]
for file in files:
    print(file)
Sales_April_2019.csv
Sales_August_2019.csv
Sales_December_2019.csv
Sales_February_2019.csv
Sales_January_2019.csv
Sales_July_2019.csv
Sales_June_2019.csv
Sales_March_2019.csv
Sales_May_2019.csv
Sales_November_2019.csv
Sales_October_2019.csv
Sales_September_2019.csv

Es scheint, dass die Daten vom Dateinamen bis Januar-Dezember 2019 enthalten sind, ich möchte die Daten für die Analyse kombinieren

Erstellen Sie zunächst einen leeren Datenrahmen, um alle Daten zu speichern

all_months_data = pd.DataFrame()

Um alle Monatsdaten zu kombinieren, fügen wir die CSV-Datei jedes Monats nacheinander in den leeren Datenrahmen ein.

for file in files:
    df = pd.read_csv("Sales_Data/" + file)
    all_months_data = pd.concat([all_months_data,df])

Nun, die ersten 5 Datenzeilen sehen so aus

all_months_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001
1 NaN NaN NaN NaN NaN NaN
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215
3 176560 Google Phone 1 600 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001

Geben Sie die kombinierten Daten aus (Da zu diesem Zeitpunkt die Seriennummer nicht erforderlich ist, fügen Sie dem Argument index = False hinzu.)

all_months_data.to_csv("all_data.csv",index=False)

Versuchen Sie nach Bestätigung der Ausgabedaten erneut, die kombinierten Daten zu lesen.

all_data = pd.read_csv("all_data.csv")
all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001
1 NaN NaN NaN NaN NaN NaN
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215
3 176560 Google Phone 1 600 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001

Arbeit 1: Wann war der Monat mit den höchsten Umsätzen und wie viel haben Sie verdient?

In der Spalte gibt es eine Spalte mit Bestelldatum = Bestelldatum, aber es gibt keine Daten nur für den Monat. Erstellen wir also eine neue

Die ersten beiden Zeichen in der Spalte Bestelldatum sind wahrscheinlich die Monatsdaten

all_data['Month'] = all_data['Order Date'].str[0:2]

Da es in eine Zeichenfolge konvertiert wurde, kehren wir wieder zum numerischen Wert zurück

all_data['Month'] = all_data['Month'].astype('int32')
all_data.head()
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-77-ffc394ccb2ad> in <module>
----> 1 all_data['Month'] = all_data['Month'].astype('int32')
      2 all_data.head()


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in astype(self, dtype, copy, errors, **kwargs)
   5880             # else, only a single dtype is given
   5881             new_data = self._data.astype(
-> 5882                 dtype=dtype, copy=copy, errors=errors, **kwargs
   5883             )
   5884             return self._constructor(new_data).__finalize__(self)


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in astype(self, dtype, **kwargs)
    579 
    580     def astype(self, dtype, **kwargs):
--> 581         return self.apply("astype", dtype=dtype, **kwargs)
    582 
    583     def convert(self, **kwargs):


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in apply(self, f, axes, filter, do_integrity_check, consolidate, **kwargs)
    436                     kwargs[k] = obj.reindex(b_items, axis=axis, copy=align_copy)
    437 
--> 438             applied = getattr(b, f)(**kwargs)
    439             result_blocks = _extend_blocks(applied, result_blocks)
    440 


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/blocks.py in astype(self, dtype, copy, errors, values, **kwargs)
    557 
    558     def astype(self, dtype, copy=False, errors="raise", values=None, **kwargs):
--> 559         return self._astype(dtype, copy=copy, errors=errors, values=values, **kwargs)
    560 
    561     def _astype(self, dtype, copy=False, errors="raise", values=None, **kwargs):


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/blocks.py in _astype(self, dtype, copy, errors, values, **kwargs)
    641                     # _astype_nansafe works fine with 1-d only
    642                     vals1d = values.ravel()
--> 643                     values = astype_nansafe(vals1d, dtype, copy=True, **kwargs)
    644 
    645                 # TODO(extension)


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/dtypes/cast.py in astype_nansafe(arr, dtype, copy, skipna)
    705         # work around NumPy brokenness, #1987
    706         if np.issubdtype(dtype.type, np.integer):
--> 707             return lib.astype_intsafe(arr.ravel(), dtype).reshape(arr.shape)
    708 
    709         # if we have a datetime/timedelta array of objects


pandas/_libs/lib.pyx in pandas._libs.lib.astype_intsafe()


ValueError: cannot convert float NaN to integer

Ich habe einen Fehler bekommen

Wenn ich die Fehlererklärung lese, heißt es, dass NaN nicht quantifiziert werden kann.

Das Kombinieren von is_na und allen Funktionen gibt True zurück, wenn mindestens ein NaN vorhanden ist.

Achse = 1 ist eine Funktion, die die Verarbeitung zeilenweise zurückgibt

Bitten Sie sie, alle Zeilen mit NaN zurückzugeben

nan_df = all_data[all_data.isna().any(axis=1)]
nan_df
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month
1 NaN NaN NaN NaN NaN NaN NaN
356 NaN NaN NaN NaN NaN NaN NaN
735 NaN NaN NaN NaN NaN NaN NaN
1433 NaN NaN NaN NaN NaN NaN NaN
1553 NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ...
185176 NaN NaN NaN NaN NaN NaN NaN
185438 NaN NaN NaN NaN NaN NaN NaN
186042 NaN NaN NaN NaN NaN NaN NaN
186548 NaN NaN NaN NaN NaN NaN NaN
186826 NaN NaN NaN NaN NaN NaN NaN

545 rows × 7 columns

Es gab auch 545 Zeilen

Löschen Sie Daten, die NaN enthalten

all_data = all_data.dropna(how='all')
all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001 04
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215 04
3 176560 Google Phone 1 600 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 04
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 04
5 176561 Wired Headphones 1 11.99 04/30/19 09:27 333 8th St, Los Angeles, CA 90001 04

Okay, gehen wir zurück zum vorherigen Monat und versuchen es erneut

all_data['Month'] = all_data['Month'].astype('int32')
all_data.head()
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-80-ffc394ccb2ad> in <module>
----> 1 all_data['Month'] = all_data['Month'].astype('int32')
      2 all_data.head()


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in astype(self, dtype, copy, errors, **kwargs)
   5880             # else, only a single dtype is given
   5881             new_data = self._data.astype(
-> 5882                 dtype=dtype, copy=copy, errors=errors, **kwargs
   5883             )
   5884             return self._constructor(new_data).__finalize__(self)


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in astype(self, dtype, **kwargs)
    579 
    580     def astype(self, dtype, **kwargs):
--> 581         return self.apply("astype", dtype=dtype, **kwargs)
    582 
    583     def convert(self, **kwargs):


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in apply(self, f, axes, filter, do_integrity_check, consolidate, **kwargs)
    436                     kwargs[k] = obj.reindex(b_items, axis=axis, copy=align_copy)
    437 
--> 438             applied = getattr(b, f)(**kwargs)
    439             result_blocks = _extend_blocks(applied, result_blocks)
    440 


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/blocks.py in astype(self, dtype, copy, errors, values, **kwargs)
    557 
    558     def astype(self, dtype, copy=False, errors="raise", values=None, **kwargs):
--> 559         return self._astype(dtype, copy=copy, errors=errors, values=values, **kwargs)
    560 
    561     def _astype(self, dtype, copy=False, errors="raise", values=None, **kwargs):


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/blocks.py in _astype(self, dtype, copy, errors, values, **kwargs)
    641                     # _astype_nansafe works fine with 1-d only
    642                     vals1d = values.ravel()
--> 643                     values = astype_nansafe(vals1d, dtype, copy=True, **kwargs)
    644 
    645                 # TODO(extension)


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/dtypes/cast.py in astype_nansafe(arr, dtype, copy, skipna)
    705         # work around NumPy brokenness, #1987
    706         if np.issubdtype(dtype.type, np.integer):
--> 707             return lib.astype_intsafe(arr.ravel(), dtype).reshape(arr.shape)
    708 
    709         # if we have a datetime/timedelta array of objects


pandas/_libs/lib.pyx in pandas._libs.lib.astype_intsafe()


ValueError: invalid literal for int() with base 10: 'Or'

Als nächstes erhalte ich wieder einen neuen Fehler

Es scheint, dass das Wort "Oder" enthalten war

Schauen wir uns die Zeile an, die 'Oder' enthält.

temp_df = all_data[all_data['Order Date'].str[0:2] == "Or"]
temp_df.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month
519 Order ID Product Quantity Ordered Price Each Order Date Purchase Address Or
1149 Order ID Product Quantity Ordered Price Each Order Date Purchase Address Or
1155 Order ID Product Quantity Ordered Price Each Order Date Purchase Address Or
2878 Order ID Product Quantity Ordered Price Each Order Date Purchase Address Or
2893 Order ID Product Quantity Ordered Price Each Order Date Purchase Address Or

Es scheint, dass die Identität von "Oder" "Bestelldatum" war.

Aktualisieren wir die Daten, indem wir andere Daten als die Daten extrahieren, die das Wort "Bestelldatum" enthalten.

all_data = all_data[all_data['Order Date'].str[0:2] != "Or"]
all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001 04
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215 04
3 176560 Google Phone 1 600 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 04
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 04
5 176561 Wired Headphones 1 11.99 04/30/19 09:27 333 8th St, Los Angeles, CA 90001 04

Seien wir zum dritten Mal ehrlich und führen eine Quantifizierung durch

all_data['Month'] = all_data['Order Date'].str[0:2]
all_data['Month'] = all_data['Month'].astype('int32')
all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001 4
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215 4
3 176560 Google Phone 1 600 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4
5 176561 Wired Headphones 1 11.99 04/30/19 09:27 333 8th St, Los Angeles, CA 90001 4

Ich hab es geschafft

Als nächstes gibt es, obwohl es jeweils eine bestellte Menge und einen Preis gibt, keine wesentlichen Verkäufe.

Da PQ (Umsatz) = P (Preis) x Q (Menge), fügen Sie eine Spalte hinzu, die PQ entspricht.

all_data['Sales'] = all_data['Quantity Ordered'] * all_data['Price Each'] 
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/ops/__init__.py in na_op(x, y)
    967         try:
--> 968             result = expressions.evaluate(op, str_rep, x, y, **eval_kwargs)
    969         except TypeError:


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/computation/expressions.py in evaluate(op, op_str, a, b, use_numexpr, **eval_kwargs)
    220     if use_numexpr:
--> 221         return _evaluate(op, op_str, a, b, **eval_kwargs)
    222     return _evaluate_standard(op, op_str, a, b)


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/computation/expressions.py in _evaluate_numexpr(op, op_str, a, b, truediv, reversed, **eval_kwargs)
    126     if result is None:
--> 127         result = _evaluate_standard(op, op_str, a, b)
    128 


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/computation/expressions.py in _evaluate_standard(op, op_str, a, b, **eval_kwargs)
     69     with np.errstate(all="ignore"):
---> 70         return op(a, b)
     71 


TypeError: can't multiply sequence by non-int of type 'str'


During handling of the above exception, another exception occurred:


TypeError                                 Traceback (most recent call last)

<ipython-input-84-7c1e2b69cbe2> in <module>
----> 1 all_data['Sales'] = all_data['Quantity Ordered'] * all_data['Price Each']


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/ops/__init__.py in wrapper(left, right)
   1046 
   1047         with np.errstate(all="ignore"):
-> 1048             result = na_op(lvalues, rvalues)
   1049         return construct_result(
   1050             left, result, index=left.index, name=res_name, dtype=None


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/ops/__init__.py in na_op(x, y)
    968             result = expressions.evaluate(op, str_rep, x, y, **eval_kwargs)
    969         except TypeError:
--> 970             result = masked_arith_op(x, y, op)
    971 
    972         return missing.dispatch_fill_zeros(op, x, y, result)


/opt/anaconda3/lib/python3.7/site-packages/pandas/core/ops/__init__.py in masked_arith_op(x, y, op)
    445         if mask.any():
    446             with np.errstate(all="ignore"):
--> 447                 result[mask] = op(xrav[mask], com.values_from_object(yrav[mask]))
    448 
    449     else:


TypeError: can't multiply sequence by non-int of type 'str'

Wieder enthielt es eine Zeichenfolge

Ich möchte es in eine Form umschreiben, die vorerst berechnet werden kann, daher werde ich die Funktion "to_numeric" verwenden

all_data['Quantity Ordered'] = pd.to_numeric(all_data['Quantity Ordered'])
all_data['Price Each'] = pd.to_numeric(all_data['Price Each'])

Ich werde es noch einmal versuchen

all_data['Sales'] = all_data['Quantity Ordered'] * all_data['Price Each'] 
all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month Sales
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001 4 23.90
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215 4 99.99
3 176560 Google Phone 1 600.00 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 600.00
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 11.99
5 176561 Wired Headphones 1 11.99 04/30/19 09:27 333 8th St, Los Angeles, CA 90001 4 11.99

Es kam heraus. Es scheint, dass die Antwort auf die Frage endlich herauskommen wird

Vorerst werde ich die Frage erneut stellen.

Arbeit 1: Wann war der Monat mit den höchsten Umsätzen und wie viel haben Sie verdient?

all_data.groupby('Month').sum()
Quantity Ordered Price Each Sales
Month
1 10903 1.811768e+06 1.822257e+06
2 13449 2.188885e+06 2.202022e+06
3 17005 2.791208e+06 2.807100e+06
4 20558 3.367671e+06 3.390670e+06
5 18667 3.135125e+06 3.152607e+06
6 15253 2.562026e+06 2.577802e+06
7 16072 2.632540e+06 2.647776e+06
8 13448 2.230345e+06 2.244468e+06
9 13109 2.084992e+06 2.097560e+06
10 22703 3.715555e+06 3.736727e+06
11 19798 3.180601e+06 3.199603e+06
12 28114 4.588415e+06 4.613443e+06

Ich kenne Pat nicht, also lass es uns zeigen

Installieren Sie die Bibliothek zur Veranschaulichung

import matplotlib.pyplot as plt

Diagramm, während der Bereich für die X-Achse festgelegt wird

months = range(1,13)
results = all_data.groupby('Month').sum()
plt.bar(months,results['Sales'])
plt.xticks(months)
plt.xlabel('Month')
plt.ylabel('Sales')
plt.show()

output_60_0.png

Das war Arbeit 1.

Arbeit 2: Welche Stadt hatte den höchsten Umsatz?

Jetzt, wo wir eine Vertriebslinie haben, scheint es eine einfache Arbeit zu sein, aber lass es uns tun

Lassen Sie uns vorher noch einmal überprüfen, wie die Daten waren.

all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month Sales
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001 4 23.90
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215 4 99.99
3 176560 Google Phone 1 600.00 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 600.00
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 11.99
5 176561 Wired Headphones 1 11.99 04/30/19 09:27 333 8th St, Los Angeles, CA 90001 4 11.99

Es ist so, als würde man einen Teil der Daten im Teil "Kaufadresse" extrahieren und summieren.

Lassen Sie uns eine City-Spalte erstellen, wie wir es im Vertrieb getan haben

Ich muss einen Teil der Adresse extrahieren, aber wenn ich mir die Daten der Adresse ansehe, möchte ich nur den zweiten Städtenamen wie "Adresse, Städtename, Postleitzahl" extrahieren.

Verwenden Sie die Apply-Funktion, um in der Split-Funktion nach "," zu teilen, und wenden Sie sie auf alle Spalten in derselben Spalte an

all_data['City'] = all_data['Purchase Address'].apply(lambda x: x.split(',')[1])
all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month Sales City
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001 4 23.90 Dallas
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215 4 99.99 Boston
3 176560 Google Phone 1 600.00 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 600.00 Los Angeles
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 11.99 Los Angeles
5 176561 Wired Headphones 1 11.99 04/30/19 09:27 333 8th St, Los Angeles, CA 90001 4 11.99 Los Angeles

Nur City wurde erfolgreich geteilt!

Übrigens gibt es ein Problem, das hier bei der Summe in City berücksichtigt werden muss.

Dies ist der Fall, wenn die Stadt denselben Namen hat, andere Länder jedoch denselben Namen haben. Wenn dies nicht berücksichtigt wird, werden sie addiert und unbeabsichtigte Aggregationsergebnisse erhalten. (Beispiel: Portlands in Oregon und Maine)

Es ist jedoch nicht erforderlich, eine neue Spalte für den Ländernamen zu erstellen. Da es sich nur um eine Aggregation handelt, müssen Sie lediglich den Status (2 Zeichen) in die Zelle der Spalte "Stadt" einfügen. Dieses Mal wird es in Form von Stadt (Staat) sein. Beispiel: Dallas (TX)

Früher habe ich es in einer Zeile mit der Lambda-Funktion geschrieben, aber da es eine große Sache ist, erstellen wir eine Funktion, um den Namen der Stadt bzw. des Landes zu erhalten. Es ist auch freundlich zum Leser.

def get_city(address):
    return address.split(',')[1]

def get_state(address):
    return address.split(',')[2].split(' ')[1]
#Kaufadressdaten sind Komma(,)Leer danach(" ")Weil es gibt, schneiden Sie mit Spaltung, damit es nicht unnatürlich wird, wenn es vereint wird

all_data['City'] = all_data['Purchase Address'].apply(lambda x: f"{get_city(x)} ({get_state(x)})")
all_data.drop("State",axis=1)
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month Sales City
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001 4 23.90 Dallas (TX)
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215 4 99.99 Boston (MA)
3 176560 Google Phone 1 600.00 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 600.00 Los Angeles (CA)
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA)
5 176561 Wired Headphones 1 11.99 04/30/19 09:27 333 8th St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA)
... ... ... ... ... ... ... ... ... ...
186845 259353 AAA Batteries (4-pack) 3 2.99 09/17/19 20:56 840 Highland St, Los Angeles, CA 90001 9 8.97 Los Angeles (CA)
186846 259354 iPhone 1 700.00 09/01/19 16:00 216 Dogwood St, San Francisco, CA 94016 9 700.00 San Francisco (CA)
186847 259355 iPhone 1 700.00 09/23/19 07:39 220 12th St, San Francisco, CA 94016 9 700.00 San Francisco (CA)
186848 259356 34in Ultrawide Monitor 1 379.99 09/19/19 17:30 511 Forest St, San Francisco, CA 94016 9 379.99 San Francisco (CA)
186849 259357 USB-C Charging Cable 1 11.95 09/30/19 00:18 250 Meadow St, San Francisco, CA 94016 9 11.95 San Francisco (CA)

185950 rows × 9 columns

Es ist in Ordnung, alles was Sie tun müssen, ist normal zu addieren

all_data.groupby('City').sum()
Quantity Ordered Price Each Month Sales
City
Atlanta (GA) 16602 2.779908e+06 104794 2.795499e+06
Austin (TX) 11153 1.809874e+06 69829 1.819582e+06
Boston (MA) 22528 3.637410e+06 141112 3.661642e+06
Dallas (TX) 16730 2.752628e+06 104620 2.767975e+06
Los Angeles (CA) 33289 5.421435e+06 208325 5.452571e+06
New York City (NY) 27932 4.635371e+06 175741 4.664317e+06
Portland (ME) 2750 4.471893e+05 17144 4.497583e+05
Portland (OR) 11303 1.860558e+06 70621 1.870732e+06
San Francisco (CA) 50239 8.211462e+06 315520 8.262204e+06
Seattle (WA) 16553 2.733296e+06 104941 2.747755e+06

San Francisco ist die Nummer eins. Sie können auch sehen, dass Portland auch richtig aufgeteilt ist.

Ordnen Sie den im Vormonat verwendeten Code an

results = all_data.groupby('City').sum()
cities = [city for city, df in all_data.groupby('City')]
#Stadt für Beschriftungen auf der x-Achse: Zahlen und Beschriftungen werden getrennt, es sei denn, sie befinden sich in derselben Reihenfolge wie oben gerillt.
plt.bar(cities,results['Sales'])
plt.xticks(cities,rotation="vertical")
#Wenn die Städte so angezeigt werden, wie sie sind, ist sie sperrig. Zeigen Sie sie daher vertikal an.
plt.ylabel('Sales')
plt.xlabel('City name')
plt.show()

output_1.png

Es ist fertig!

Arbeit 3: Wann und wann sollte eine Anzeige geschaltet werden, um die Wahrscheinlichkeit zu maximieren, dass ein Kunde den Artikel kauft?

Die Arbeit wurde sofort wie eine Datenwissenschaft (die Schlussfolgerung ist jedoch zunächst nicht so streng logisch)

Lassen Sie uns nun wie gewohnt auf die Daten zurückblicken

all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month Sales City State
0 176558 USB-C Charging Cable 2 11.95 04/19/19 08:46 917 1st St, Dallas, TX 75001 4 23.90 Dallas (TX) TX 75001
2 176559 Bose SoundSport Headphones 1 99.99 04/07/19 22:30 682 Chestnut St, Boston, MA 02215 4 99.99 Boston (MA) MA 02215
3 176560 Google Phone 1 600.00 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 600.00 Los Angeles (CA) CA 90001
4 176560 Wired Headphones 1 11.99 04/12/19 14:38 669 Spruce St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA) CA 90001
5 176561 Wired Headphones 1 11.99 04/30/19 09:27 333 8th St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA) CA 90001

Vielleicht wäre es schön, die Beziehung zwischen der Spalte Auftragsdaten und der Spalte Verkauf zu betrachten.

Lassen Sie uns den Datentyp ändern, damit das Bestelldatum problemlos als Datumsdaten verarbeitet werden kann.

all_data['Order Date'] = pd.to_datetime(all_data['Order Date'])
all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month Sales City State
0 176558 USB-C Charging Cable 2 11.95 2019-04-19 08:46:00 917 1st St, Dallas, TX 75001 4 23.90 Dallas (TX) TX 75001
2 176559 Bose SoundSport Headphones 1 99.99 2019-04-07 22:30:00 682 Chestnut St, Boston, MA 02215 4 99.99 Boston (MA) MA 02215
3 176560 Google Phone 1 600.00 2019-04-12 14:38:00 669 Spruce St, Los Angeles, CA 90001 4 600.00 Los Angeles (CA) CA 90001
4 176560 Wired Headphones 1 11.99 2019-04-12 14:38:00 669 Spruce St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA) CA 90001
5 176561 Wired Headphones 1 11.99 2019-04-30 09:27:00 333 8th St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA) CA 90001

Das Format der Daten hat sich geändert

Lassen Sie uns eine Zeile von Stunde, Minute machen

Wenn ich eine Spalte in Monat oder Verkauf erstellt habe, war es eine Zeichenfolge, also habe ich Split usw. verwendet, aber dank der früheren Änderung des Datentyps

all_data['Hour'] = all_data['Order Date'].dt.hour
all_data['Minute'] = all_data['Order Date'].dt.minute
all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month Sales City State Hour Minute
0 176558 USB-C Charging Cable 2 11.95 2019-04-19 08:46:00 917 1st St, Dallas, TX 75001 4 23.90 Dallas (TX) TX 75001 8 46
2 176559 Bose SoundSport Headphones 1 99.99 2019-04-07 22:30:00 682 Chestnut St, Boston, MA 02215 4 99.99 Boston (MA) MA 02215 22 30
3 176560 Google Phone 1 600.00 2019-04-12 14:38:00 669 Spruce St, Los Angeles, CA 90001 4 600.00 Los Angeles (CA) CA 90001 14 38
4 176560 Wired Headphones 1 11.99 2019-04-12 14:38:00 669 Spruce St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA) CA 90001 14 38
5 176561 Wired Headphones 1 11.99 2019-04-30 09:27:00 333 8th St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA) CA 90001 9 27

Lassen Sie uns einmal visualisieren, um die Daten zu erfassen

hours = [hour for hour, df in all_data.groupby('Hour')]
plt.plot(hours,all_data.groupby(['Hour']).count())
#Anzahl der Bestellungen pro Stunde mit der Zeit auf der X-Achse(Anzahl der Zeilen)Aggregat
plt.xticks(hours)
plt.grid()
#Ich möchte so viel wie möglich eine klare Tendenz für jede Stunde sehen, also werde ich ein Raster hinzufügen
plt.xlabel('Hour')
plt.ylabel('Orders')
plt.show()

output_2.png

Der Höhepunkt ist um AM: 11 und PM: 7. Daher scheint es gut, Anzeigen während dieser Zeit anzuzeigen, wenn die Anzahl der Bestellungen (Kunden) am höchsten ist.

Arbeit 4: Welche Produkte werden am häufigsten zusammen als Set gekauft?

all_data.head()
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month Sales City State Hour Minute
0 176558 USB-C Charging Cable 2 11.95 2019-04-19 08:46:00 917 1st St, Dallas, TX 75001 4 23.90 Dallas (TX) TX 75001 8 46
2 176559 Bose SoundSport Headphones 1 99.99 2019-04-07 22:30:00 682 Chestnut St, Boston, MA 02215 4 99.99 Boston (MA) MA 02215 22 30
3 176560 Google Phone 1 600.00 2019-04-12 14:38:00 669 Spruce St, Los Angeles, CA 90001 4 600.00 Los Angeles (CA) CA 90001 14 38
4 176560 Wired Headphones 1 11.99 2019-04-12 14:38:00 669 Spruce St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA) CA 90001 14 38
5 176561 Wired Headphones 1 11.99 2019-04-30 09:27:00 333 8th St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA) CA 90001 9 27

Es scheint, dass Sie verstehen können, wenn Sie nach derselben Bestellnummer gruppieren

Mit der duplizierten Funktion können Sie die von Ihnen getragenen Werte einfach sortieren.

df = all_data[all_data['Order ID'].duplicated(keep=False)]
df.head(20)
Order ID Product Quantity Ordered Price Each Order Date Purchase Address Month Sales City State Hour Minute
3 176560 Google Phone 1 600.00 2019-04-12 14:38:00 669 Spruce St, Los Angeles, CA 90001 4 600.00 Los Angeles (CA) CA 90001 14 38
4 176560 Wired Headphones 1 11.99 2019-04-12 14:38:00 669 Spruce St, Los Angeles, CA 90001 4 11.99 Los Angeles (CA) CA 90001 14 38
18 176574 Google Phone 1 600.00 2019-04-03 19:42:00 20 Hill St, Los Angeles, CA 90001 4 600.00 Los Angeles (CA) CA 90001 19 42
19 176574 USB-C Charging Cable 1 11.95 2019-04-03 19:42:00 20 Hill St, Los Angeles, CA 90001 4 11.95 Los Angeles (CA) CA 90001 19 42
30 176585 Bose SoundSport Headphones 1 99.99 2019-04-07 11:31:00 823 Highland St, Boston, MA 02215 4 99.99 Boston (MA) MA 02215 11 31
31 176585 Bose SoundSport Headphones 1 99.99 2019-04-07 11:31:00 823 Highland St, Boston, MA 02215 4 99.99 Boston (MA) MA 02215 11 31
32 176586 AAA Batteries (4-pack) 2 2.99 2019-04-10 17:00:00 365 Center St, San Francisco, CA 94016 4 5.98 San Francisco (CA) CA 94016 17 0
33 176586 Google Phone 1 600.00 2019-04-10 17:00:00 365 Center St, San Francisco, CA 94016 4 600.00 San Francisco (CA) CA 94016 17 0
119 176672 Lightning Charging Cable 1 14.95 2019-04-12 11:07:00 778 Maple St, New York City, NY 10001 4 14.95 New York City (NY) NY 10001 11 7
120 176672 USB-C Charging Cable 1 11.95 2019-04-12 11:07:00 778 Maple St, New York City, NY 10001 4 11.95 New York City (NY) NY 10001 11 7
129 176681 Apple Airpods Headphones 1 150.00 2019-04-20 10:39:00 331 Cherry St, Seattle, WA 98101 4 150.00 Seattle (WA) WA 98101 10 39
130 176681 ThinkPad Laptop 1 999.99 2019-04-20 10:39:00 331 Cherry St, Seattle, WA 98101 4 999.99 Seattle (WA) WA 98101 10 39
138 176689 Bose SoundSport Headphones 1 99.99 2019-04-24 17:15:00 659 Lincoln St, New York City, NY 10001 4 99.99 New York City (NY) NY 10001 17 15
139 176689 AAA Batteries (4-pack) 2 2.99 2019-04-24 17:15:00 659 Lincoln St, New York City, NY 10001 4 5.98 New York City (NY) NY 10001 17 15
189 176739 34in Ultrawide Monitor 1 379.99 2019-04-05 17:38:00 730 6th St, Austin, TX 73301 4 379.99 Austin (TX) TX 73301 17 38
190 176739 Google Phone 1 600.00 2019-04-05 17:38:00 730 6th St, Austin, TX 73301 4 600.00 Austin (TX) TX 73301 17 38
225 176774 Lightning Charging Cable 1 14.95 2019-04-25 15:06:00 372 Church St, Los Angeles, CA 90001 4 14.95 Los Angeles (CA) CA 90001 15 6
226 176774 USB-C Charging Cable 1 11.95 2019-04-25 15:06:00 372 Church St, Los Angeles, CA 90001 4 11.95 Los Angeles (CA) CA 90001 15 6
233 176781 iPhone 1 700.00 2019-04-03 07:37:00 976 Hickory St, Dallas, TX 75001 4 700.00 Dallas (TX) TX 75001 7 37
234 176781 Lightning Charging Cable 1 14.95 2019-04-03 07:37:00 976 Hickory St, Dallas, TX 75001 4 14.95 Dallas (TX) TX 75001 7 37

Daten mit derselben ID werden jetzt nacheinander aufgereiht

Der obige Datensatz ist die Bestellung mit der ID (≒ nichts anderes als die Bestellung, die als Set gekauft wurde)

Erstellen Sie nach dem Gruppieren nach ID eine Spalte, in der die von dieser ID gekauften Bestellungen gespeichert sind. (Beispiel ID: 1111 → Bestellung: Apfel, Banane, Orange)

df = all_data[all_data['Order ID'].duplicated(keep=False)]
df['Grouped'] = df.groupby('Order ID')['Product'].transform(lambda x: ','.join(x))
#Transformation ist wie eine Apply-Funktion. Ich werde die Erklärung hier weglassen.
df = df[['Order ID','Grouped']].drop_duplicates()
df.head(10)
/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
Order ID Grouped
3 176560 Google Phone,Wired Headphones
18 176574 Google Phone,USB-C Charging Cable
30 176585 Bose SoundSport Headphones,Bose SoundSport Hea...
32 176586 AAA Batteries (4-pack),Google Phone
119 176672 Lightning Charging Cable,USB-C Charging Cable
129 176681 Apple Airpods Headphones,ThinkPad Laptop
138 176689 Bose SoundSport Headphones,AAA Batteries (4-pack)
189 176739 34in Ultrawide Monitor,Google Phone
225 176774 Lightning Charging Cable,USB-C Charging Cable
233 176781 iPhone,Lightning Charging Cable

Es fühlt sich gut an. Die Daten sind gut organisiert.

In dieser gruppierten Spalte müssen Sie nachschlagen "welche, welche, in welcher Kombination, wie oft" usw.

Lassen Sie uns zusammenfassen, während Sie eine praktische Bibliothek verwenden. Ein konkretes Bild der Bibliothek finden Sie unten im Stapelüberlauf.

from itertools import combinations
from collections import Counter

count = Counter()
for row in df['Grouped']:
    row_list = row.split(',')
    count.update(Counter(combinations(row_list,2)))
    
count.most_common(10)
[(('iPhone', 'Lightning Charging Cable'), 1005),
 (('Google Phone', 'USB-C Charging Cable'), 987),
 (('iPhone', 'Wired Headphones'), 447),
 (('Google Phone', 'Wired Headphones'), 414),
 (('Vareebadd Phone', 'USB-C Charging Cable'), 361),
 (('iPhone', 'Apple Airpods Headphones'), 360),
 (('Google Phone', 'Bose SoundSport Headphones'), 220),
 (('USB-C Charging Cable', 'Wired Headphones'), 160),
 (('Vareebadd Phone', 'Wired Headphones'), 143),
 (('Lightning Charging Cable', 'Wired Headphones'), 92)]

Die Ausgabe ist etwas verschmutzt, daher werde ich kleinere Korrekturen vornehmen

for key,value in count.most_common(10):
    print(key,value)
('iPhone', 'Lightning Charging Cable') 1005
('Google Phone', 'USB-C Charging Cable') 987
('iPhone', 'Wired Headphones') 447
('Google Phone', 'Wired Headphones') 414
('Vareebadd Phone', 'USB-C Charging Cable') 361
('iPhone', 'Apple Airpods Headphones') 360
('Google Phone', 'Bose SoundSport Headphones') 220
('USB-C Charging Cable', 'Wired Headphones') 160
('Vareebadd Phone', 'Wired Headphones') 143
('Lightning Charging Cable', 'Wired Headphones') 92

iPhone und Ladekabel sind die meisten

Arbeit 5 (Abschlussarbeit): Welches Produkt ist das meistverkaufte? Warum verkauft es sich Ihrer Meinung nach am besten?

Dies ist die letzte Arbeit. Sie sind gekommen, um selbst zu denken (Hypothesenteil). Lassen Sie uns die Daten visualisieren.

Denken Sie quantitativ

product_group = all_data.groupby('Product')
quantity_ordered = product_group.sum()['Quantity Ordered']
products = [product for product,df in product_group]
plt.bar(products,quantity_ordered)
plt.xlabel('Product')
plt.ylabel('Quantity Ordered')
plt.xticks(products,rotation="vertical",size=8)
plt.show()

output_3.png

Gibt es viele Batteriekabel?

Ich denke, das liegt daran, dass der Preis günstig ist. Überprüfen Sie Preise und Verkäufe.

prices = all_data.groupby('Product').mean()['Price Each']

fig, ax1 = plt.subplots()

ax2 = ax1.twinx()
#Diagrammgenerierung, die der x-Achse gemeinsam ist und unterschiedliche Werte für die y-Achse aufweist
ax1.bar(products,quantity_ordered)
ax2.plot(products,prices,'b-')

ax1.set_xlabel('Product Name')
ax1.set_ylabel('Quanity Ordered', color="g")
ax2.set_ylabel('Price', color="b")
ax1.set_xticklabels(products,rotation="vertical",size=8)

plt.show()

output_4.png

Das ist alles.

Recommended Posts

[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich möchte Daten mit Python analysieren können (Teil 3)
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich möchte Daten mit Python analysieren können (Teil 1)
Ich möchte Daten mit Python analysieren können (Teil 4)
[Für Anfänger von Wettkampfprofis] Ich habe versucht, 40 AOJ "ITP I" -Fragen mit Python zu lösen
Ich habe versucht, einen Pandas-Datenrahmen zu erstellen, indem ich mit Python Informationen zum Lebensmittelrückruf abgekratzt habe
Ich möchte Protokolle mit Python analysieren
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
Ich habe versucht, fMRI-Daten mit Python zu analysieren (Einführung in die Dekodierung von Gehirninformationen)
Lassen Sie uns Covid-19 (Corona) -Daten mit Python analysieren [Für Anfänger]
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
[Für Anfänger] So studieren Sie den Python3-Datenanalysetest
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Ich habe versucht zusammenzufassen, wie man Pandas von Python benutzt
100 Pandas klopfen für Python-Anfänger
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Für diejenigen, die neu in der Programmierung sind, sich aber entschieden haben, Daten mit Python zu analysieren
Ich habe versucht, Stückpreisdaten nach Sprache mit Real Gachi von Python zu aggregieren und zu vergleichen
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Ich habe versucht, mit Python (Mac OS X) eine Umgebung für maschinelles Lernen zu erstellen.
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
[Einführung in Pandas] Ich habe versucht, die Austauschdaten durch Dateninterpolation zu erhöhen ♬
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
[Python] Einführung in die Diagrammerstellung mit Corona-Virendaten [Für Anfänger]
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, scRNA-seq-Daten mithilfe der topologischen Datenanalyse (TDA) zu analysieren.
Ich habe versucht, Python zu berühren (Installation)
Ich möchte ○○ mit Pandas machen
Ich möchte mit Python debuggen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Python-Anfänger versuchten es herauszufinden
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 2)
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 1)
Ich habe versucht, die Daten des Fußballturniers der FIFA Fussball-Weltmeisterschaft Russland mit Fußball zu analysieren
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"