C'est un record de lutte pour frapper 100 œufs sans connaître l'œuf du scientifique des données. C'est un mystère si je peux terminer la course. ~~ Même s'il disparaît en cours de route, pensez qu'il n'est pas donné à Qiita. ~~
100 articles frappants 100 Knock Guide
** Faites attention si vous essayez de le faire car cela inclut des spoilers **
Je ne comprends pas le problème des statistiques. (59 ~)
C'est difficile à voir! Cette façon d'écrire est dangereuse! Si vous avez des questions, n'hésitez pas à me le faire savoir. ~~ Je vais l'utiliser comme nourriture tout en souffrant de dommages à mon cœur.
Cette solution est fausse! Cette interprétation est différente! Veuillez commenter si vous en avez.
Cette fois de 52 à 56. [Dernière fois] 45-51 [Première fois avec la table des matières]
P-052: Montant total des ventes (montant) du bloc de données des détails du reçu (df_receipt) pour chaque ID client (customer_id), et 0 pour 2000 yens ou moins et 1 pour plus de 2000 yens pour le montant total des ventes. Ensuite, affichez 10 articles avec l'ID client et le montant total des ventes. Cependant, si l'ID client commence par "Z", il représente un non-membre, excluez-le du calcul.
mine52.py
df=df_receipt[df_receipt['customer_id'].str.contains('^[^Z]')].reset_index()
df=df.groupby('customer_id').agg({'amount':'sum'}).reset_index()
df['amount']=df['amount'].apply(lambda x : 0 if x<=2000 else 1)
df.head(10)
'''Le modèle de réponse'''
df_sales_amount = df_receipt.query('not customer_id.str.startswith("Z")', engine='python')
df_sales_amount = df_sales_amount[['customer_id', 'amount']].groupby('customer_id').sum().reset_index()
df_sales_amount['sales_flg'] = df_sales_amount['amount'].apply(lambda x: 1 if x > 2000 else 0)
df_sales_amount.head(10)
Après avoir fait groupby
, additionnez et divisez-le en 0 et 1 tout en les comparant.
C'était un problème de python après une longue période car il s'agissait de savoir comment maîtriser lambda
.
python n'est pas le seul problème, mais c'est vraiment ennuyeux de devoir être sensible au type et de résoudre avec des instructions indépendantes du type.
Dans ce cas, il a fallu beaucoup de temps pour comprendre quel type de couche de données est contenu dans «x» de «lambda x: ~».
P-053: Pour le postal_cd de la trame de données client (df_customer), binarisez Tokyo (les 3 premiers chiffres vont de 100 à 209) à 1 et les autres à 0. De plus, combinez-le avec le bloc de données du relevé de réception (df_receipt) et comptez le nombre de clients qui ont un enregistrement d'achat pour toute la période pour chacune des deux valeurs créées.
mine53.py
df=df_customer.copy()
df['postal_cd']=df.postal_cd.apply(lambda x: 1 if 100<=int(x[:3])<=209 else 0)
df=pd.merge(df,df_receipt,how='inner',on='customer_id')
df.groupby('postal_cd').agg({'customer_id':'nunique'})
'''Le modèle de réponse'''
df_tmp = df_customer[['customer_id', 'postal_cd']].copy()
df_tmp['postal_flg'] = df_tmp['postal_cd'].apply(lambda x: 1 if 100 <= int(x[0:3]) <= 209 else 0)
pd.merge(df_tmp, df_receipt, how='inner', on='customer_id'). \
groupby('postal_flg').agg({'customer_id':'nunique'})
Il est trop pratique de pouvoir écrire la forme 100 <= x <= 209 dans l'instruction if de lambda
. C'est un secret que j'ai oublié d'écrire «si» parce que je me suis trop concentré sur «sinon».
P-054: L'adresse de la trame de données client (df_customer) est celle de la préfecture de Saitama, de la préfecture de Chiba, de la région métropolitaine de Tokyo et de la préfecture de Kanagawa. Créez une valeur de code pour chaque préfecture et extrayez-la avec l'ID client et l'adresse. Les valeurs doivent être 11 pour la préfecture de Saitama, 12 pour la préfecture de Chiba, 13 pour Tokyo et 14 pour la préfecture de Kanagawa. Vous pouvez afficher 10 résultats.
mine54.py
df=df_customer.copy()
df['to_cd']=df['address'].apply(lambda x:11 if x.startswith('Saitama')\
else 12 if x.startswith('Préfecture de Chiba')\
else 13 if x.startswith('Tokyo') \
else 14 if x.startswith('Préfecture de Kanagawa') else 0)
df[['customer_id','address','to_cd']].head(10)
'''Le modèle de réponse'''
pd.concat([df_customer[['customer_id', 'address']], df_customer['address'].str[0:3].map({'Saitama': '11',
'Préfecture de Chiba':'12',
'Tokyo':'13',
'Kanagawa':'14'})], axis=1).head(10)
Eh bien, c'est pratique pour commencer par ()
(j'ai oublié d'épeler contient
)
Ce que vous devez faire attention est de retourner avec le type bool
.
P-055: Additionnez le montant des ventes (montant) du bloc de données de détail du reçu (df_receipt) pour chaque ID client (customer_id), et trouvez le quadrant du montant total. Ensuite, créez une valeur de catégorie pour le montant total des ventes pour chaque client en fonction des critères suivants et affichez à la fois l'ID client et le montant des ventes. Les valeurs de catégorie vont de 1 à 4 dans l'ordre du haut. Vous pouvez afficher 10 résultats.
-Plus que la valeur minimale et moins que le premier quadrant
mine55.py
df=df_receipt.copy()
df=df.groupby('customer_id')['amount'].sum().reset_index()
si=df.quantile(q=[0.25,0.5,0.75]).T
#float(si[0.25])
df['sibun']=df['amount'].apply(lambda x:1 if x<float(si[0.25])
else 2 if x<float(si[0.5])
else 3 if x<float(si[0.75])
else 4)
df.head(10)
'''Le modèle de réponse'''
#Exemple de code 1
df_sales_amount = df_receipt[['customer_id', 'amount']].groupby('customer_id').sum().reset_index()
pct25 = np.quantile(df_sales_amount['amount'], 0.25)
pct50 = np.quantile(df_sales_amount['amount'], 0.5)
pct75 = np.quantile(df_sales_amount['amount'], 0.75)
def pct_group(x):
if x < pct25:
return 1
elif pct25 <= x < pct50:
return 2
elif pct50 <= x < pct75:
return 3
elif pct75 <= x:
return 4
df_sales_amount['pct_group'] = df_sales_amount['amount'].apply(lambda x: pct_group(x))
df_sales_amount.head(10)
#Exemple de code 2
df_temp = df_receipt.groupby('customer_id')[['amount']].sum()
df_temp['quantile'], bins = pd.qcut(df_receipt.groupby('customer_id')['amount'].sum(), 4, retbins=True)
display(df_temp.head())
print('quantiles:', bins)
À partir du total, donnez un quart de point et divisez par moins de ou plus ...
Cependant, dans l'exemple de code 2, le total est placé dans pd.cut
tel quel et spécifié sous forme de 4 divisions.
Le quadrant était ce que je faisais lors de la 32e manche, mais j'ai oublié comme prévu. Fukushu Shinakan
P-056: Calculez l'âge par incréments de 10 ans en fonction de l'âge de la base de données client (df_customer), et extrayez-la avec l'ID client (customer_id) et la date de naissance (date_anniversaire). Cependant, toutes les personnes âgées de plus de 60 ans devraient être dans la soixantaine. Le nom de la catégorie indiquant l'âge est arbitraire. Les 10 premiers éléments doivent être affichés.
mine56.py
df=df_customer.copy()
df_bins=pd.cut(df.age,[10,20,30,40,50,60,150],right=False,labels=[10,20,30,40,50,60])
df=pd.concat([df[['customer_id','birth_day']],df_bins],axis=1)
df.head(10)
'''Le modèle de réponse'''
#Exemple de code 1
df_customer_era = pd.concat([df_customer[['customer_id', 'birth_day']],
df_customer['age'].apply(lambda x: min(math.floor(x / 10) * 10, 60))],
axis=1)
df_customer_era.head(10)
#Exemple de code 2
df_customer['age_group'] = pd.cut(df_customer['age'], bins=[0, 10, 20, 30, 40, 50, 60, np.inf], right=False)
df_customer[['customer_id', 'birth_day', 'age_group']].head(10)
Cette fois, c'est la 43e revue.
Je ne connaissais pas l'existence de np, inf
, alors j'ai mis le nombre 150, ce qui est évidemment impossible. De plus, j'ai utilisé df.age.min ()
pour obtenir l'âge minimum et j'ai confirmé que 10 ~ était bien, puis j'ai retiré 0.
Il y a un élément appelé labels
dans pd.cut
, donc si vous le mettez, vous obtiendrez un beau nombre.
De plus, right = False prendra la plage «10 <= x <20».
Recommended Posts