PANDAS ist die beste Datenverarbeitungsbibliothek für Datenwissenschaftler. Es muss jedoch darauf geachtet werden, Leistungsprobleme beim Umgang mit Millionen von Datenzeilen zu vermeiden. Dieses Mal möchte ich einige Techniken vorstellen, die ich in meiner Arbeit gelernt habe.
DataFrame Da PANDAS eine spaltenorientierte Datenstruktur ist, können wir jede Spalte gut verarbeiten. Es wird empfohlen, einen "DataFrame" im Format "1 Datensatz 1 Zeile" zu erstellen und alle messbaren Werte (Luftfeuchtigkeit, Preis, Koordinaten usw.) für jede Spalte für jede Spalte festzulegen.
Bei einer großen Datenverarbeitungsmenge wird die Leistung jedoch erheblich verringert, wenn für jede Zeile eine Schleifenverarbeitung durchgeführt wird. In diesem Artikel möchte ich eine intelligente Methode zum Hinzufügen von Daten unter Berücksichtigung der Leistung vorstellen.
Erstellen Sie zunächst eine Beispieltabelle.
data = {'Team': ['Tiger', 'Tiger', 'Rabbit', 'Rabbit', 'Cat',
'Cat', 'Cat', 'Cat', 'Tiger', 'Human', 'Human', 'Tiger'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df= pd.DataFrame(data)
print(team_dashboard)
'''
Team Rank Year Points
0 Tiger 1 2014 876
1 Tiger 2 2015 789
2 Rabbit 2 2014 863
3 Rabbit 3 2015 673
4 Cat 3 2014 741
5 Cat 4 2015 812
6 Cat 1 2016 756
7 Cat 1 2017 788
8 Tiger 2 2016 694
9 Human 4 2014 701
10 Human 1 2015 804
11 Tiger 2 2017 690
'''
print(df.columns) #Spaltenbezeichnung abrufen
'''
Index(['Team', 'Rank', 'Year', 'Points'], dtype='object')
'''
print(df.index) #Zeilenindex abrufen
'''
RangeIndex(start=0, stop=12, step=1)
'''
Der DataFrame verfügt über eine spezielle Liste namens index. Im obigen Beispiel sind die Elemente, die jede Spalte darstellen, auf der linken Seite als "[" Team "," Rang "," Jahr "," Punkte "] und 0, 1, 2, 3, ... gekennzeichnet. Hat einen Zeilenindex, der jede Zeile darstellt.
groupby()
groupby
wird verwendet, wenn Sie Daten mit demselben Wert erfassen und gemeinsame Operationen für jede Gruppe ausführen möchten. Obwohl es zu einem Standard in der Datenverarbeitung geworden ist, ist das Gruppieren nach zunächst recht schwierig, da es verschiedene Verwendungszwecke hat.
Schauen wir uns ein Beispiel an. Wenn Sie den Spaltennamen in die Methode "groupby ()" einfügen, wird das Objekt "GroupBy" zurückgegeben.
#1 Ebene
df_g = df.groupby(by=['Team'])
print(df_g.groups)
'''
{'Cat': Int64Index([4, 5, 6, 7], dtype='int64'),
'Human': Int64Index([9, 10], dtype='int64'),
'Rabbit': Int64Index([2, 3], dtype='int64'),
'Tiger': Int64Index([0, 1, 8, 11], dtype='int64')}
'''
#2 (Plural) Etiketten
df_g = df.groupby(by=['Team', 'Year'])
print(df_g.groups)
'''
{('Cat', 2014): Int64Index([4], dtype='int64'),
('Cat', 2015): Int64Index([5], dtype='int64'),
('Cat', 2016): Int64Index([6], dtype='int64'),
('Cat', 2017): Int64Index([7], dtype='int64'),
('Human', 2014): Int64Index([9], dtype='int64'),
('Human', 2015): Int64Index([10], dtype='int64'),
('Rabbit', 2014): Int64Index([2], dtype='int64'),
('Rabbit', 2015): Int64Index([3], dtype='int64'),
('Tiger', 2014): Int64Index([0], dtype='int64'),
('Tiger', 2015): Int64Index([1], dtype='int64'),
('Tiger', 2016): Int64Index([8], dtype='int64'),
('Tiger', 2017): Int64Index([11], dtype='int64')}
'''
Auf diese Weise können Sie sehen, welche Spalte sich in welcher Gruppe in Form von {Spaltenbezeichnung: [Zeilenbezeichnung, Zeilenbezeichnung, ...]}
befindet. Für jedes Etikett wird eine Zeilenindexliste mit Daten gespeichert, die von demselben Etikett gehalten werden.
Um die Daten in der Gruppe abzurufen, übergeben Sie übrigens den Gruppenschlüssel an get_group ().
df_oneGroup = df_g.get_group('Rabbit')
print(df_oneGroup)
'''
Team Rank Year Points
2 Rabbit 2 2014 863
3 Rabbit 3 2015 673
'''
df_oneGroup = df_g.get_group(('Cat', 2014))
print(df_oneGroup)
'''
Team Rank Year Points
4 Cat 3 2014 741
'''
Tatsächlich wird "get_group ()" nur zum Debuggen verwendet, aber mit dem "GroupBy" -Objekt können Sie verschiedene Operationen für jede Gruppe ausführen. Rufen Sie beispielsweise die mean () -Methode auf, um den jährlichen Rang und die Punkte für jedes Team zu mitteln. Es werden viele andere Methoden bereitgestellt, z. B. "sum ()" und "mode ()". Übrigens setzt as_index = False
die Standardgruppenbezeichnung auf [0, 1, 2, ..., n] zurück.
df_mean = team_dashboard.groupby(by=['Team', 'Year']).mean()
print(df_mean)
'''
Rank Points
Team Year
Cat 2014 3 741
2015 4 812
2016 1 756
2017 1 788
Human 2014 4 701
2015 1 804
Rabbit 2014 2 863
2015 3 673
Tiger 2014 1 876
2015 2 789
2016 2 694
2017 2 690
'''
df_mean = team_dashboard.groupby(by=['Team', 'Year'], as_index=False).mean()
print(df_mean)
'''
Team Year Rank Points
0 Cat 2014 3 741
1 Cat 2015 4 812
2 Cat 2016 1 756
3 Cat 2017 1 788
4 Human 2014 4 701
5 Human 2015 1 804
6 Rabbit 2014 2 863
7 Rabbit 2015 3 673
8 Tiger 2014 1 876
9 Tiger 2015 2 789
10 Tiger 2016 2 694
11 Tiger 2017 2 690
'''
agg ()
, um mehrere Zeilen für jede Gruppe zurückzugebenWie beim vorherigen "GroupBy.mean ()" können Sie den numerischen Wert für jede Gruppe abrufen. Wenn Sie jedoch den numerischen Wert für jede Gruppe separat abrufen möchten, verwenden Sie "agg ()" (Aggregration). Für die Aggregation verwendete Funktionen können mit Zeichenfolgen, Numpy-Methoden, selbst erstellten Funktionen und Lambda-Ausdrücken aufgerufen werden. Um "agg ()" zu verwenden, definieren Sie es in "dict ()" und übergeben Sie es wie folgt.
'''
location col1 col2 col3 col4
0 a True 2 1 4
1 a False 6 2 6
2 b True 7 6 3
3 b True 3 3 4
4 b False 8 4 6
5 c True 9 57 8
6 d False 1 74 9
'''
func_dict = {'col1': lambda x: x.any(), #Bestätigung des fehlenden Zustands
'col2': np.mean, #durchschnittlich
'col3': np.sum, #gesamt
'col4': lambda S: S.mode()[0]} #Häufigster Wert
df_agg = df.groupby('location').agg(func_dict).reset_index()
print(df_agg)
'''
location col1 col2 col3 col4
0 a True 4 3 4
1 b True 6 13 3
2 c True 9 57 8
3 d False 1 74 9
'''
cut ()
in Zahlen an beliebigen GrenzwertenEinführung von "cut ()", das Daten nach dem angegebenen Grenzwert kategorisiert. Beispielsweise ist es einfach, die gesamten Daten in fünf Kategorien zu unterteilen, z. B. "Mitternacht, Morgen, Mittag, Nachmittag und Nacht".
prods = pd.DataFrame({'hour':range(0, 24)})
b = [0, 6, 11, 12, 17, 24]
l = ['Mitternacht', 'a.m.','Mittag', 'Nachmittag', 'Nacht']
prods['period'] = pd.cut(prods['hour'], bins=b, labels=l, include_lowest=True)
print(prods)
'''
hour period
0 0 Mitternacht
1 1 Mitternacht
2 2 Mitternacht
3 3 Mitternacht
4 4 Mitternacht
5 5 Mitternacht
6 6 Mitternacht
7 7 Uhr
8 8 Uhr
9 9 Uhr
10 10 Uhr
11 11 Uhr
12 12 mittag
13 13 Uhr
14 14 Uhr
15 15 Uhr
16 16 nachmittag
17 17 Uhr
18 18 Nacht
19 19 Nacht
20 20 Nacht
21 21 Nacht
22 22 Nacht
23 23 Nacht
'''
resample ()
Sagen wir diesmal "Berechnen Sie die kumulierte Anzahl von Fällen pro Stunde". Ich denke, ich werde versuchen, hier "pd.cumsum ()" zu verwenden. Erstellen Sie daher im Voraus eine "num_ride_1h" -Spalte und geben Sie "1" ein. Nach einer stündlichen Gruppierung nach "resample ()" in der Zeitstempelspalte kann jede Gruppe durch Aufrufen der "cumsum ()" - Methode abgeschlossen werden.
df_raw= make_classification(n_samples, n_features+1)
df_raw['timestamp'] = random_datetimes_or_dates(start, end, n=n_samples)
df_raw['num_ride_1h'] = 1
print(df_raw)
'''
var_0 var_1 var_2 class timestamp num_ride_1h
0 1.062513 -0.056001 0.761312 0 2020-09-21 00:01:57 1
1 -2.272391 1.307474 -1.276716 0 2020-09-21 00:14:49 1
2 -1.470793 1.245910 -0.708071 2 2020-09-21 00:17:46 1
3 -1.827838 1.365970 -0.933938 0 2020-09-21 00:25:13 1
4 -1.115794 -0.045542 -0.830372 0 2020-09-21 00:31:45 1
.. ... ... ... ... ... ...
95 0.247010 0.903812 0.448323 0 2020-09-21 23:29:25 1
96 -0.665399 1.861112 0.063642 1 2020-09-21 23:32:51 1
97 0.875282 0.028704 0.649306 2 2020-09-21 23:36:21 1
98 2.159065 -1.155290 1.238786 0 2020-09-21 23:37:23 1
99 1.739777 -1.775147 0.748372 2 2020-09-21 23:56:04 1
'''
df_raw['num_ride_1h'] = df_raw.resample('1H', on='timestamp')['num_ride_1h'].cumsum()
'''
var_0 var_1 var_2 class timestamp num_ride_1h
0 -1.331170 -0.274703 0.809738 1 2020-10-11 00:10:54 1
1 -1.373495 -1.067991 1.738302 1 2020-10-11 00:14:24 2
2 -1.471448 0.216404 0.296618 0 2020-10-11 00:43:29 3
3 -2.282394 -1.528916 2.605747 1 2020-10-11 00:48:52 4
4 0.162427 0.524188 -0.663437 2 2020-10-11 00:51:23 5
.. ... ... ... ... ... ...
95 1.197076 0.274294 -0.759543 1 2020-10-11 22:23:50 3
96 -0.459688 0.646523 -0.573518 0 2020-10-11 23:00:20 1
97 0.212496 0.773962 -0.969428 2 2020-10-11 23:11:43 2
98 1.578519 0.496655 -1.156869 1 2020-10-11 23:14:31 3
99 1.318311 -0.324909 -0.114971 0 2020-10-11 23:46:46 4
'''
Sie können auch pd.Grouper ()
verwenden. Beide können das gleiche Ergebnis erzielen.
df_raw['num_ride_1h'] = df_raw.groupby(pd.Grouper(key='timestamp', freq='1h'))['num_ride_1h'].cumsum()
Es gibt einige andere Beispiele, die ich vorstellen möchte, aber dieses Mal möchte ich hier enden. Wenn ich die nächste Gelegenheit habe, werde ich die Datenverarbeitung einführen, die sich auf Zeitreihendaten konzentriert.
** [Quand Co., Ltd.] ** Quand Co., Ltd., wo ich arbeite, arbeitet an Upgrades der lokalen Industrie. Bitte schau es dir an. http://quando.jp/
Recommended Posts