Auch wenn die ntile-Funktion durchsucht wird, die in SQL während der Decyl-Analyse häufig verwendet wurde, Es kam nicht heraus, also habe ich eine Funktion erstellt.
Widmet sich den Brüdern, die der Meinung waren, dass "ntile das Beste ist. Warum ist es nicht Python .." in SQL.
Nun, als Verwendung, Habe df = pandas dataframe eingefügt, col = Decyl Geben Sie den Spaltennamen ein, den Sie analysieren möchten. n = 10 ist gesetzt, aber wenn Sie 100 Gruppen bilden möchten, setzen Sie n = 100 usw. Wenn n_tile = True, geben Sie den Datenrahmen zurück, der als Spalten für die Anzahl der Dekores angegeben ist. Bei der Einstellung False wird ein Datenrahmen mit verschiedenen Aggregatfunktionen zurückgegeben. agg = Aggregatfunktion, die Sie verwenden möchten, wenn n_tile False oben, Für diejenigen, die "nur Summe" sagen, verwenden Sie agg = ["Summe"] als Argument.
def ntile(df, col, n=10, n_tile=True, ascending=False, aggs=["sum", "count", "min", "max", "median", "mean", "std"]):
# check pandas dataframe type
if type(df) == pd.core.frame.DataFrame:
# check int or float
if type(df[f"{col}"].max()) == np.int64 or type(df[f"{col}"].max()) == np.float64:
ntile_df = pd.DataFrame()
length = len(df)
df = df.sort_values(col, ascending=ascending).reset_index(drop=True)
div_n = math.ceil(len(df) / n)
# mark N group
for idx, num in enumerate(range(0, length, div_n)):
n_df = df[num: num+div_n]
n_df["decile"] = idx + 1
ntile_df = ntile_df.append(n_df)
# return ntile_df if need only decile data
if n_tile:
return ntile_df
# otherwise aggregate col
agg_df = ntile_df.groupby("decile").agg({f"{col}": aggs}).reset_index()
# clean columns
agg_df.columns = ["".join(c) for c in agg_df.columns]
# merge two data
ntile_df = ntile_df.merge(agg_df, on="decile").copy()
return ntile_df
raise TypeError(f"`{col}` must be int or float type")
raise TypeError(f"`{type(df)}` must be pandas.core.frame.DataFrame type")
import pandas as pd
import random
#Erstellen Sie einen zufälligen Preis Kerl
price = random.sample(range(10000, 900000), k=10000)
#Erstellen Sie einen Datenrahmen mit den oben genannten
data = pd.DataFrame(price, columns=["price"])
Der Inhalt ist so.
#Daten in die Funktion einfügen. n=Belassen Sie die Standardeinstellung 10
data = ntile(data, "price")
#Gruppieren Sie nach mit Dezil und wenden Sie verschiedene Aggregatfunktionen an.
data.groupby("decile").agg({"price": ["sum", "count", "min", "max", "median", "mean"]}).reset_index()
n=10
n=100
data = ntile(data, "price", n=5 , n_tile=False)
data.pricemin.value_counts().sort_index().reset_index().rename(columns={"index": "price_segment", "pricemin": "count"})
Und sieh dir das an.
Haben Sie jemals so etwas getan? Und "Gibt es nicht eine Funktion, die eine Klasse mit n% aller Klassen in der Zielspalte erstellt?" Hast du das jemals gefühlt?
Ich bin ein Anfänger, deshalb habe ich mehrmals darüber nachgedacht. Ich habe jedes Mal auf ntile geschaut und es von Hand korrigiert, aber von nun an ist es möglich, es nur durch Ändern des Teils von n = 10 zu ändern. Immerhin hat Python eine kleinere Wendung als SQL.
Ich weiß nicht, ob die Suche unzureichend ist, aber es ist seltsam, dass es in SQL keine ntile-Funktion wie Python gibt. Nun, ich habe versucht, es als Übung zu machen. Wenn Sie also Jobs von SQLer zu Python geändert haben, verwenden Sie es bitte.
Recommended Posts