[PYTHON] Data Science 100 Knock ~ Battle pour moins que les débutants part10

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]

52e

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: ~».

53e

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».

54ème

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.

55ème

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

56ème

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».

Référence

Jusqu'à ici pour cette fois

Recommended Posts

Data Science 100 Knock ~ Bataille pour moins que les débutants part5
Data Science 100 Knock ~ Battle pour moins que les débutants part10
Science des données 100 coups ~ Bataille pour moins que les débutants part8
Data Science 100 Knock ~ Bataille pour moins que les débutants part6
Data Science 100 Knock ~ Bataille pour moins que les débutants part2
Data Science 100 Knock ~ Bataille pour moins que les débutants part1
Data Science 100 Knock ~ Battle pour moins que les débutants part9
Science des données 100 coups ~ Bataille pour moins que les débutants part7
Data Science 100 Knock ~ Bataille pour moins que les débutants part4
Data Science 100 Knock ~ Bataille pour moins que les débutants part11
Comment mettre en œuvre 100 coups de science des données pour les débutants en science des données (pour Windows 10 Home)
Défiez 100 coups de science des données
Essayez «100 coups sur la science des données» ①
Pandas 100 coups pour les débutants en Python
Détection d'anomalies de données chronologiques pour les débutants
[Pratique pour les débutants] Lire ligne par ligne "Prédire les prix des maisons" de kaggle (Partie 1: Lire les données)
[Commande Linux] Liste d'options de commande moins [À voir pour les débutants]
[Python] 100 coups sur la science des données (traitement de données structurées) 018 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 023 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 030 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 022 Explication
Comment utiliser les outils d'analyse de données pour les débutants
[Python] 100 coups sur la science des données (traitement de données structurées) 017 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 026 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 016 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 024 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 027 Explication
Principes de base de Pandas pour les débutants ② Présentation des données de saisie
[Python] 100 coups sur la science des données (traitement de données structurées) 029 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 015 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 028 Explication