[PYTHON] C'est pourquoi j'ai quitté les pandas [Data Science 100 Knock (traitement des données structurées) # 2]

C'est pourquoi j'ai quitté les pandas [Data Science 100 Knock (traitement des données structurées) # 2]

Nous allons résoudre le problème Python de Data Science 100 Knock (traitement des données structurées). Ce groupe de questions utilise des pandas pour le traitement des données dans la réponse du modèle, mais nous le traiterons en utilisant le tableau structuré de NumPy après étude.

: arrow_backward: Article précédent (# 1) : arrow_forward: Article suivant (# 3)

introduction

En tant qu'étude du tableau structuré de NumPy, résolvez le problème Python de Data Science 100 Knock (Structured Data Processing) J'irai.

Beaucoup de gens qui font des activités de science des données en Python sont peut-être des amateurs de pandas, mais en fait, vous pouvez faire de même avec NumPy sans utiliser ** pandas **. Et NumPy est généralement plus rapide. En tant que personne qui aime les pandas, je ne suis toujours pas habitué à utiliser NumPy, donc j'aimerais essayer de sortir des pandas en exploitant ce "Data Science 100 Knock" avec NumPy. C'est une politique de ne pas vectoriser les fonctions par np.vectorize () ou np.frompyfunc ().

Cette fois, je répondrai aux 10e à 16e questions. Cela semble être le thème de l'index conditionnel des chaînes de caractères. Les données initiales ont été lues comme suit (la spécification du type de données est pour le moment reportée).

import numpy as np
import pandas as pd

#Pour la réponse du modèle
df_store = pd.read_csv('data/store.csv')
df_customer = pd.read_csv('data/customer.csv')

#Données que nous traitons
arr_store = np.genfromtxt(
    'data/store.csv', delimiter=',', encoding='utf-8',
    names=True, dtype=None)
arr_customer = np.genfromtxt(
    'data/customer.csv', delimiter=',', encoding='utf-8',
    names=True, dtype=None)

P_010

P-010: À partir de la trame de données de magasin (df_store), extrayez tous les articles dont le code de magasin (store_cd) commence par "S14" et n'affichez que 10 articles.

Utilisez np.char.startswith () pour voir si les débuts des chaînes correspondent. Donnez au premier argument un tableau de chaînes et au deuxième argument le mot à rechercher.

In[010]


arr_store[np.char.startswith(arr_store['store_cd'], 'S14')][:10]

Il est facile d'utiliser une fonction comme np.char.xxx (), mais je ne suis pas doué pour les opérations liées aux chaînes dans NumPy, donc si vous voulez de la * vitesse *, il est préférable d'utiliser le standard Python for loop. Il y a souvent des moments. Dans ce cas, ce sera plus rapide si vous prenez la peine de convertir le tableau NumPy en liste.

In[010]


arr_store[[item[:3] == 'S14'
           for item in arr_store['store_cd'].tolist()]][:10]

Si vous ne voulez voir que les premières lettres, il existe un moyen plus simple et plus rapide de le faire. Si vous vérifiez la colonne du code magasin (store_cd),

arr_store['store_cd']
# array(['S12014', 'S13002', 'S14010', 'S14033', 'S14036', 'S13051',
#        ...
#        'S13003', 'S12053', 'S13037', 'S14024', 'S14006'], dtype='<U6')

Vous pouvez voir qu'ils sont tous composés de chaînes de caractères à 6 chiffres. Tout ce dont vous avez besoin, ce sont les 3 premiers caractères, alors relisez-le avec le type de données ʻU3`. Ensuite, le quatrième caractère et les suivants ne sont pas lus et sont supprimés comme indiqué ci-dessous.

arr_store['store_cd'].astype('<U3')
# array(['S12', 'S13', 'S14', 'S14', 'S14', 'S13', 'S13', 'S14', 'S13',
#        ...
#        'S14', 'S13', 'S12', 'S13', 'S12', 'S13', 'S14', 'S14'],
#       dtype='<U3')

Cela devrait extraire celui de "S14", donc la réponse est:

In[010]


arr_store[arr_store['store_cd'].astype('<U3') == 'S14'][:10]

La sortie est la suivante.

Out[010]


array([('S14010', 'Magasin Kikuna', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市港北区菊名一丁目', 'Ken Kanagawa Ken Yokohama Hokukukikunaichoume', '045-123-4032', 139.6326, 35.50049, 1732.),
       ('S14033', 'Magasin Akuwa', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市瀬谷区阿久和西一丁目', 'Ken Kanagawa Yokohama Shiseyaku Akwanishi Itchoume', '045-123-4043', 139.4961, 35.45918, 1495.),
       ('S14036', 'Magasin central de Sagamihara', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa相模原市中央二丁目', 'Kanagawa Kensagami Harashichu Ounichoume', '042-123-4045', 139.3716, 35.57327, 1679.),
       ('S14040', 'Magasin Nagatsuda', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市緑区長津田みなみ台五丁目', 'Ken Kanagawa Ken Yokohama Shimidori Kunagatsu Taminami Daigochoume', '045-123-4046', 139.4994, 35.52398, 1548.),
       ('S14050', 'Magasin Akuwa Nishi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市瀬谷区阿久和西一丁目', 'Ken Kanagawa Yokohama Shiseyaku Akwanishi Itchoume', '045-123-4053', 139.4961, 35.45918, 1830.),
       ('S14028', 'Magasin Futatsubashi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市瀬谷区二ツ橋町', 'Ken Kanagawa Yokohama Shiseyaku Futatsubashicho', '045-123-4042', 139.4963, 35.46304, 1574.),
       ('S14012', 'Boutique Honmoku Wada', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市中区本牧和田', 'Ken Kanagawa Ken Yokohama Shinakakuhon Mokuwada', '045-123-4034', 139.6582, 35.42156, 1341.),
       ('S14046', 'Magasin Kitayamada', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市都筑区北山田一丁目', 'Ken Kanagawa Yokohama Shitsuzuki Kukitayama Taichoume', '045-123-4049', 139.5916, 35.56189,  831.),
       ('S14022', 'Magasin Zushi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa逗子市逗子一丁目', 'Kanagawa Kenzushizushiichoume', '046-123-4036', 139.5789, 35.29642, 1838.),
       ('S14011', 'Magasin Hiyoshi Honmachi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市港北区日吉本町四丁目', 'Ken Kanagawa Ken Yokohama Hokuhoku Hiyoshi Hongcho Yonchome', '045-123-4033', 139.6316, 35.54655,  890.)],
      dtype=[('store_cd', '<U6'), ('store_name', '<U6'), ('prefecture_cd', '<i4'), ('prefecture', '<U4'), ('address', '<U19'), ('address_kana', '<U30'), ('tel_no', '<U12'), ('longitude', '<f8'), ('latitude', '<f8'), ('floor_area', '<f8')])

Comparons les vitesses de différentes manières.

Time[010]


#Le modèle de réponse
%timeit df_store.query("store_cd.str.startswith('S14')", engine='python').head(10)
# 3.46 ms ± 23.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

#Autres manières de pandas
%timeit df_store[df_store['store_cd'].str.startswith('S14')][:10]
# 876 µs ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df_store.loc[[index for index, item in enumerate(df_store['store_cd']) if item[:3] == 'S14']][:10]
# 732 µs ± 17.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

#Méthode utilisant NumPy
%timeit arr_store[np.char.startswith(arr_store['store_cd'], 'S14')][:10]
# 54.3 µs ± 3.17 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit arr_store[[item[:3] == 'S14' for item in arr_store['store_cd'].tolist()]][:10]
# 22.8 µs ± 377 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit arr_store[arr_store['store_cd'].astype('<U3') == 'S14'][:10]
# 5.55 µs ± 91.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Les index conditionnels de chaîne utilisant pd.DataFrame.query () sont connus pour être lents.

P_011

P-011: Extraire tous les articles du bloc de données client (df_customer) avec un seul ID client (customer_id) se terminant par 1, et n'afficher que 10 articles.

C'est la même chose que la question précédente. Utilisez la fonction np.char.endswith ().

In[011]


arr_customer[np.char.endswith(arr_customer['customer_id'], '1')][:10]

Si vous êtes préoccupé par la vitesse, utilisez la boucle for.

In[011]


arr_customer[[item[-1] == '1'
              for item in arr_customer['customer_id']]][:10]

Pensez à un moyen plus rapide. Vous ne pouvez pas utiliser la tactique .astype () pour voir le dernier caractère d'une chaîne. Cependant, dans cet exemple, il est possible d'effectuer un traitement à grande vitesse d'une autre manière. Si vous vérifiez la colonne ID client (customer_id),

arr_customer['customer_id']
# array(['CS021313000114', 'CS037613000071', 'CS031415000172', ...,
#        'CS012403000043', 'CS033512000184', 'CS009213000022'], dtype='<U14')

Vous pouvez voir que ** toutes les lignes ont le même nombre de caractères ** (14 chiffres). Il vous suffit de chercher celui avec "1" à la fin. Pour ce faire, convertissez d'abord le tableau ʻarr_customer ['customer_id'] en une chaîne d'octets à l'aide de la méthode .tobytes (), puis convertissez ce tableau, qui a été lu avec le type de données'U14', en . Relisez avec le type de données `` U1 '' en utilisant la fonction np.frombuffer () . Quand il est davantage réorganisé en un tableau de 14 colonnes avec la méthode reshape ()`, il devient comme suit.

#Décomposer toutes les données d'identification client en caractères
np.frombuffer(arr_customer['customer_id'].tobytes(), dtype='<U1')
# array(['C', 'S', '0', ..., '0', '2', '2'], dtype='<U1')

#Revenir à 14 caractères par ligne
np.frombuffer(arr_customer['customer_id'].tobytes(), dtype='<U1').reshape(len(arr_customer), -1)
# array([['C', 'S', '0', ..., '1', '1', '4'],
#        ['C', 'S', '0', ..., '0', '7', '1'],
#        ...,
#        ['C', 'S', '0', ..., '1', '8', '4'],
#        ['C', 'S', '0', ..., '0', '2', '2']], dtype='<U1')

Puisque la ligne requise par la "ligne dont la dernière colonne est" 1 "" dans ce tableau est la suivante. Cette technique est tout à fait applicable.

In[011]


arr_customer[np.frombuffer(arr_customer['customer_id'].tobytes(), dtype='<U1')
             .reshape(len(arr_customer), -1)[:, -1]
             == '1'][:10]

La sortie est la suivante.

Out[011]


array([('CS037613000071', 'Masahiko hexagone', 9, 'inconnue', '1952-04-01', 66, '136-0076', 'Minamisago, Koto-ku, Tokyo**********', 'S13037', 20150414, '0-00000000-0'),
       ('CS028811000001', 'Kaori Horii', 1, 'Femme', '1933-03-27', 86, '245-0016', 'Izumi-cho, Izumi-ku, Yokohama-shi, Kanagawa**********', 'S14028', 20160115, '0-00000000-0'),
       ('CS040412000191', 'Ikue Kawai', 1, 'Femme', '1977-01-05', 42, '226-0021', 'Kitahachisakucho, Midori-ku, Yokohama-shi, Kanagawa**********', 'S14040', 20151101, '1-20091025-4'),
       ('CS028314000011', 'Aoi Kosuga', 1, 'Femme', '1983-11-26', 35, '246-0038', 'Miyazawa, Setani-ku, Yokohama-shi, Kanagawa**********', 'S14028', 20151123, '1-20080426-5'),
       ('CS039212000051', 'Erika Fujishima', 1, 'Femme', '1997-02-03', 22, '166-0001', 'Asaya Kita, Suginami-ku, Tokyo**********', 'S13039', 20171121, '1-20100215-4'),
       ('CS015412000111', 'Natsuki Matsui', 1, 'Femme', '1972-10-04', 46, '136-0071', 'Kamedo, Koto-ku, Tokyo**********', 'S13015', 20150629, '0-00000000-0'),
       ('CS004702000041', 'Hiroshi Nojima', 0, 'Masculin', '1943-08-24', 75, '176-0022', 'Mukaiyama, Nerima-ku, Tokyo**********', 'S13004', 20170218, '0-00000000-0'),
       ('CS041515000001', 'Chinatsu Kurita', 1, 'Femme', '1967-01-02', 52, '206-0001', 'Wada, Tama City, Tokyo**********', 'S13041', 20160422, 'E-20100803-F'),
       ('CS029313000221', 'Hikari Hojo', 1, 'Femme', '1987-06-19', 31, '279-0011', 'Mihama, ville d'Urayasu, préfecture de Chiba**********', 'S12029', 20180810, '0-00000000-0'),
       ('CS034312000071', 'Nao Mochizuki', 1, 'Femme', '1980-09-20', 38, '213-0026', 'Kusue, Takatsu-ku, Kawasaki-shi, Kanagawa**********', 'S14034', 20160106, '0-00000000-0')],
      dtype=[('customer_id', '<U14'), ('customer_name', '<U10'), ('gender_cd', '<i4'), ('gender', '<U2'), ('birth_day', '<U10'), ('age', '<i4'), ('postal_cd', '<U8'), ('address', '<U26'), ('application_store_cd', '<U6'), ('application_date', '<i4'), ('status_cd', '<U12')])

Comparons les vitesses.

Time[011]


%timeit df_customer.query("customer_id.str.endswith('1')", engine='python').head(10)
# 12.2 ms ± 454 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit arr_customer[np.char.endswith(arr_customer['customer_id'], '1')][:10]
# 20.7 ms ± 847 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit arr_customer[[item[-1] == '1' for item in arr_customer['customer_id']]][:10]
# 9.44 ms ± 185 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit arr_customer[np.frombuffer(arr_customer['customer_id'].tobytes(), dtype='<U1').reshape(len(arr_customer), -1)[:, -1] == '1'][:10]
# 1.83 ms ± 77 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

np.char.xxx () semble être plus lent que pd.query () dans certains cas ...

P_012

P-012: Afficher tous les éléments du bloc de données du magasin (df_store) uniquement pour les magasins à Yokohama.

In[012]


arr_store[np.char.find(arr_store['address'], 'Yokohama') >= 0]

Ou

In[012]


arr_store[['Yokohama' in item
           for item in arr_store['address'].tolist()]]

Le nombre de caractères dans le champ d'adresse est indéfini, mais "Yokohama City" apparaît toujours dans les 5ème, 6ème et 7ème caractères, donc après l'avoir coupé aux 7 premiers caractères avec .astype ('<U7'), seulement les 3 derniers caractères Faire un tableau de

In[012]


arr_store[np.frombuffer(arr_store['address'].astype('<U7').view('<U1')
                        .reshape(len(arr_store), -1)[:, 4:].tobytes(),
                        dtype='<U3')
          == 'Yokohama']

Vous pouvez également.

Out[012]


array([('S14010', 'Magasin Kikuna', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市港北区菊名一丁目', 'Ken Kanagawa Ken Yokohama Hokukukikunaichoume', '045-123-4032', 139.6326, 35.50049, 1732.),
       ('S14033', 'Magasin Akuwa', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市瀬谷区阿久和西一丁目', 'Ken Kanagawa Yokohama Shiseyaku Akwanishi Itchoume', '045-123-4043', 139.4961, 35.45918, 1495.),
       ('S14040', 'Magasin Nagatsuda', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市緑区長津田みなみ台五丁目', 'Ken Kanagawa Ken Yokohama Shimidori Kunagatsu Taminami Daigochoume', '045-123-4046', 139.4994, 35.52398, 1548.),
       ('S14050', 'Magasin Akuwa Nishi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市瀬谷区阿久和西一丁目', 'Ken Kanagawa Yokohama Shiseyaku Akwanishi Itchoume', '045-123-4053', 139.4961, 35.45918, 1830.),
       ('S14028', 'Magasin Futatsubashi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市瀬谷区二ツ橋町', 'Ken Kanagawa Yokohama Shiseyaku Futatsubashicho', '045-123-4042', 139.4963, 35.46304, 1574.),
       ('S14012', 'Boutique Honmoku Wada', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市中区本牧和田', 'Ken Kanagawa Ken Yokohama Shinakakuhon Mokuwada', '045-123-4034', 139.6582, 35.42156, 1341.),
       ('S14046', 'Magasin Kitayamada', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市都筑区北山田一丁目', 'Ken Kanagawa Yokohama Shitsuzuki Kukitayama Taichoume', '045-123-4049', 139.5916, 35.56189,  831.),
       ('S14011', 'Magasin Hiyoshi Honmachi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市港北区日吉本町四丁目', 'Ken Kanagawa Ken Yokohama Hokuhoku Hiyoshi Hongcho Yonchome', '045-123-4033', 139.6316, 35.54655,  890.),
       ('S14048', 'Magasin Nakagawa Chuo', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市都筑区中川中央二丁目', 'Ken Kanagawa Ken Yokohama Shitsuzuki Kunakagawa Chuo Unichome', '045-123-4051', 139.5758, 35.54912, 1657.),
       ('S14042', 'Magasin Shin Yamashita', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市中区新山下二丁目', 'Ken Kanagawa Yokohama Shinakakushin Yamashitani Chome', '045-123-4047', 139.6593, 35.43894, 1044.),
       ('S14006', 'Magasin Kuzugaya', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市都筑区葛が谷', 'Ken Kanagawa Yokohama Shitsuzuki Kuzugaya', '045-123-4031', 139.5633, 35.53573, 1886.)],
      dtype=[('store_cd', '<U6'), ('store_name', '<U6'), ('prefecture_cd', '<i4'), ('prefecture', '<U4'), ('address', '<U19'), ('address_kana', '<U30'), ('tel_no', '<U12'), ('longitude', '<f8'), ('latitude', '<f8'), ('floor_area', '<f8')])

P_013

P-013: À partir de la trame de données client (df_customer), extraire toutes les données dont le code d'état (status_cd) commence par l'alphabet A à F, et n'afficher que 10 éléments.

C'est gênant. Dans la réponse du modèle, nous recherchons par expression régulière, mais pour le moment, nous le ferons sans utiliser d'expression régulière. Si vous utilisez np.char.startswith (), ce sera comme ça.

In[013]


arr_customer[
    np.char.startswith(arr_customer['status_cd'],
                       np.array(list('ABCDEF'))[:, None])
    .any(0)][:10]

Cela semble assez difficile. C'est plus facile à utiliser pour.

In[013]


arr_customer[[item[0] in set('ABCDEF')
              for item in arr_customer['status_cd'].tolist()]][:10]

Lisez uniquement le début de la chaîne et np.in1d (). C'est simple et rapide.

In[013]


arr_customer[np.in1d(arr_customer['status_cd'].astype('<U1'),
                     np.fromiter('ABCDEF', dtype='<U1'))][:10]

Au fait, le mot de recherche est également un tableau NumPy ici, mais la vitesse n'a pas beaucoup changé même avec list ('ABCDEF').

Out[013]


array([('CS031415000172', 'Kimiko Utada', 1, 'Femme', '1976-10-04', 42, '151-0053', 'Yoyogi, Shibuya-ku, Tokyo**********', 'S13031', 20150529, 'D-20100325-C'),
       ('CS015414000103', 'Yoko Okuno', 1, 'Femme', '1977-08-09', 41, '136-0073', 'Kitasa, Koto-ku, Tokyo**********', 'S13015', 20150722, 'B-20100609-B'),
       ('CS011215000048', 'Saya Ashida', 1, 'Femme', '1992-02-01', 27, '223-0062', 'Hiyoshi Honmachi, Kohoku-ku, Yokohama-shi, Kanagawa**********', 'S14011', 20150228, 'C-20100421-9'),
       ('CS029415000023', 'Riho Umeda', 1, 'Femme', '1976-01-17', 43, '279-0043', 'Fujimi, ville d'Urayasu, préfecture de Chiba**********', 'S12029', 20150610, 'D-20100918-E'),
       ('CS035415000029', 'Maki Terazawa', 9, 'inconnue', '1977-09-27', 41, '158-0096', 'Tamagawadai, Setagaya-ku, Tokyo**********', 'S13035', 20141220, 'F-20101029-F'),
       ('CS031415000106', 'Yumiko Uno', 1, 'Femme', '1970-02-26', 49, '151-0053', 'Yoyogi, Shibuya-ku, Tokyo**********', 'S13031', 20150201, 'F-20100511-E'),
       ('CS029215000025', 'Miho Ishikura', 1, 'Femme', '1993-09-28', 25, '279-0022', 'Imagawa, ville d'Urayasu, préfecture de Chiba**********', 'S12029', 20150708, 'B-20100820-C'),
       ('CS033605000005', 'Yuta Inomata', 0, 'Masculin', '1955-12-05', 63, '246-0031', 'Setani, Setani-ku, Yokohama-shi, Kanagawa**********', 'S14033', 20150425, 'F-20100917-E'),
       ('CS033415000229', 'Nanami Itagaki', 1, 'Femme', '1977-11-07', 41, '246-0021', 'Ville de Futatsuhashi, quartier de Setani, ville de Yokohama, préfecture de Kanagawa**********', 'S14033', 20150712, 'F-20100326-E'),
       ('CS008415000145', 'Mao Kuroya', 1, 'Femme', '1977-06-27', 41, '157-0067', 'Kitami, Setagaya-ku, Tokyo**********', 'S13008', 20150829, 'F-20100622-F')],
      dtype=[('customer_id', '<U14'), ('customer_name', '<U10'), ('gender_cd', '<i4'), ('gender', '<U2'), ('birth_day', '<U10'), ('age', '<i4'), ('postal_cd', '<U8'), ('address', '<U26'), ('application_store_cd', '<U6'), ('application_date', '<i4'), ('status_cd', '<U12')])

P_014

P-014: À partir de la trame de données client (df_customer), extrayez toutes les données dont le code d'état (status_cd) se termine par les chiffres 1 à 9 et n'affichez que 10 éléments.

In[014]


arr_customer[[item[-1] in set('123456789')
              for item in arr_customer['status_cd'].tolist()]][:10]

In[014]


arr_customer[np.in1d(np.frombuffer(arr_customer['status_cd'].tobytes(),
                                   dtype='<U1')
                     .reshape(len(arr_customer), -1)[:, -1],
                     np.fromiter('123456789', dtype='<U1'))][:10]

Out[014]


array([('CS001215000145', 'Miki Tazaki', 1, 'Femme', '1995-03-29', 24, '144-0055', 'Nakarokugo, Ota-ku, Tokyo**********', 'S13001', 20170605, '6-20090929-2'),
       ('CS033513000180', 'Haruka Anzai', 1, 'Femme', '1962-07-11', 56, '241-0823', 'Zenbe-cho, Asahi-ku, Yokohama-shi, Kanagawa**********', 'S14033', 20150728, '6-20080506-5'),
       ('CS011215000048', 'Saya Ashida', 1, 'Femme', '1992-02-01', 27, '223-0062', 'Hiyoshi Honmachi, Kohoku-ku, Yokohama-shi, Kanagawa**********', 'S14011', 20150228, 'C-20100421-9'),
       ('CS040412000191', 'Ikue Kawai', 1, 'Femme', '1977-01-05', 42, '226-0021', 'Kitahachisakucho, Midori-ku, Yokohama-shi, Kanagawa**********', 'S14040', 20151101, '1-20091025-4'),
       ('CS009315000023', 'Fumiyo Minagawa', 1, 'Femme', '1980-04-15', 38, '154-0012', 'Komazawa, Setagaya-ku, Tokyo**********', 'S13009', 20150319, '5-20080322-1'),
       ('CS015315000033', 'Fukushi Rinako', 1, 'Femme', '1983-03-17', 36, '135-0043', 'Shiohama, Koto-ku, Tokyo**********', 'S13015', 20141024, '4-20080219-3'),
       ('CS023513000066', 'Kobe Sora', 1, 'Femme', '1961-12-17', 57, '210-0005', 'Ville de Higashida, quartier de Kawasaki, ville de Kawasaki, préfecture de Kanagawa**********', 'S14023', 20150915, '5-20100524-9'),
       ('CS035513000134', 'Miho Ichikawa', 1, 'Femme', '1960-03-27', 59, '156-0053', 'Sakura, Setagaya-ku, Tokyo**********', 'S13035', 20150227, '8-20100711-9'),
       ('CS001515000263', 'Ciel d'été de Takamatsu', 1, 'Femme', '1962-11-09', 56, '144-0051', 'Nishi Kamata, Ota-ku, Tokyo**********', 'S13001', 20160812, '1-20100804-1'),
       ('CS040314000027', 'Kimiro Tsuruta', 9, 'inconnue', '1986-03-26', 33, '226-0027', 'Nagatsuda, Midori-ku, ville de Yokohama, préfecture de Kanagawa**********', 'S14040', 20150122, '2-20080426-4')],
      dtype=[('customer_id', '<U14'), ('customer_name', '<U10'), ('gender_cd', '<i4'), ('gender', '<U2'), ('birth_day', '<U10'), ('age', '<i4'), ('postal_cd', '<U8'), ('address', '<U26'), ('application_store_cd', '<U6'), ('application_date', '<i4'), ('status_cd', '<U12')])

P_015

P-015: À partir de la trame de données client (df_customer), extrayez toutes les données dont le code d'état (status_cd) commence par les lettres A à F et se termine par les chiffres 1 à 9, et n'affichez que 10 éléments. ..

Même s'il existe plusieurs conditions, vous pouvez facilement les obtenir avec la boucle for.

In[015]


arr_customer[[item[0] in set('ABCDEF') and item[-1] in set('123456789')
              for item in arr_customer['status_cd'].tolist()]][:10]

La méthode de couper une chaîne de caractères et d'utiliser np.in1d () a de nombreuses conditions et est devenue difficile à écrire. Personne ne prendrait la peine d'écrire du code comme celui-ci: (Y a-t-il une meilleure façon ...?)

In[015]


statud_cd_split = np.frombuffer(arr_customer['status_cd'].tobytes(),
                                dtype='<U1').reshape(len(arr_customer), -1)
arr_customer[np.in1d(statud_cd_split[:, 0],
                     np.fromiter('ABCDEF', dtype='<U1'))
             &
             np.in1d(statud_cd_split[:, -1],
                     np.fromiter('123456789', dtype='<U1'))][:10]

Out[015]


array([('CS011215000048', 'Saya Ashida', 1, 'Femme', '1992-02-01', 27, '223-0062', 'Hiyoshi Honmachi, Kohoku-ku, Yokohama-shi, Kanagawa**********', 'S14011', 20150228, 'C-20100421-9'),
       ('CS022513000105', 'Kimiko Shimamura', 1, 'Femme', '1962-03-12', 57, '249-0002', 'Yamane, ville de Zushi, préfecture de Kanagawa**********', 'S14022', 20150320, 'A-20091115-7'),
       ('CS001515000096', 'Yoko Mizuno', 9, 'inconnue', '1960-11-29', 58, '144-0053', 'Kamata Honmachi, Ota-ku, Tokyo**********', 'S13001', 20150614, 'A-20100724-7'),
       ('CS013615000053', 'Kiyo Nishiwaki', 1, 'Femme', '1953-10-18', 65, '261-0026', 'Makuhari Nishi, Mihama-ku, Chiba-shi, Chiba**********', 'S12013', 20150128, 'B-20100329-6'),
       ('CS020412000161', 'Kaoru Komiya', 1, 'Femme', '1974-05-21', 44, '174-0042', 'Higashisakashita, Itabashi-ku, Tokyo**********', 'S13020', 20150822, 'B-20081021-3'),
       ('CS001215000097', 'Asami Takenaka', 1, 'Femme', '1990-07-25', 28, '146-0095', 'Tamagawa, Ota-ku, Tokyo**********', 'S13001', 20170315, 'A-20100211-2'),
       ('CS035212000007', 'Erika Uchimura', 1, 'Femme', '1990-12-04', 28, '152-0023', 'Yakumo, Meguro-ku, Tokyo**********', 'S13035', 20151013, 'B-20101018-6'),
       ('CS002515000386', 'Kou Noda', 1, 'Femme', '1963-05-30', 55, '185-0013', 'Nishikoigakubo, ville de Kokubunji, Tokyo**********', 'S13002', 20160410, 'C-20100127-8'),
       ('CS001615000372', 'Inagaki Suzuka', 1, 'Femme', '1956-10-29', 62, '144-0035', 'Minami Kamata, Ota-ku, Tokyo**********', 'S13001', 20170403, 'A-20100104-1'),
       ('CS032512000121', 'Tomoyo Matsui', 1, 'Femme', '1962-09-04', 56, '210-0011', 'Fujimi, Kawasaki-ku, Kawasaki-shi, Kanagawa**********', 'S13032', 20150727, 'A-20100103-5')],
      dtype=[('customer_id', '<U14'), ('customer_name', '<U10'), ('gender_cd', '<i4'), ('gender', '<U2'), ('birth_day', '<U10'), ('age', '<i4'), ('postal_cd', '<U8'), ('address', '<U26'), ('application_store_cd', '<U6'), ('application_date', '<i4'), ('status_cd', '<U12')])

C'est fastidieux à écrire, mais plus rapide qu'une boucle for.

Time[015]


%timeit df_customer.query("status_cd.str.contains('^[A-F].*[1-9]$', regex=True)", engine='python').head(10)
# 31 ms ± 1.25 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit arr_customer[[item[0] in set('ABCDEF') and item[-1] in set('123456789') for item in arr_customer['status_cd'].tolist()]][:10]
# 16.7 ms ± 1.37 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
statud_cd_split = np.frombuffer(arr_customer['status_cd'].tobytes(), dtype='<U1').reshape(len(arr_customer), -1)
arr_customer[np.in1d(statud_cd_split[:, 0], np.fromiter('ABCDEF', dtype='<U1'))
             & np.in1d(statud_cd_split[:, -1], np.fromiter('123456789', dtype='<U1'))][:10]
# 3.94 ms ± 17.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

P_016

P-016: À partir du bloc de données de stockage (df_store), affichez tous les éléments avec 3 chiffres-3 chiffres-4 chiffres pour le numéro de téléphone (tel_no).

Dois-je utiliser le module d'expression régulière re à ce stade?

In[016]


import re

arr_store[[bool(re.fullmatch(r'[0-9]{3}-[0-9]{3}-[0-9]{4}', item))
           for item in arr_store['tel_no'].tolist()]]

Dans ce cas, en regardant les données, il n'y avait que des numéros de téléphone à 10 chiffres, et il n'y avait pas de valeurs de buggy, donc nous pourrions le remplacer par le problème des "lignes où les 4ème et 8ème caractères sont" - "". C'était. L'une des solutions consiste à lire le problème de manière flexible en fonction des données.

In[016]


tel_no_split = np.frombuffer(arr_store['tel_no'].tobytes(),
                             dtype='<U1').reshape(len(arr_store), -1)
arr_store[(tel_no_split[:, 3] == '-') & (tel_no_split[:, 7] == '-')]

Out[016]


array([('S12014', 'Magasin Chigusadai', 12, 'Préfecture de Chiba', 'Préfecture de Chiba千葉市稲毛区千草台一丁目', 'Cibaken Chibashi Inagekuchigusadai Itchoume', '043-123-4003', 140.118 , 35.63559, 1698.),
       ('S13002', 'Magasin Kokubunji', 13, 'Tokyo', 'Tokyo国分寺市本多二丁目', 'Tokyo Tokoku Bunji Shihondani Choume', '042-123-4008', 139.4802, 35.70566, 1735.),
       ('S14010', 'Magasin Kikuna', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市港北区菊名一丁目', 'Ken Kanagawa Ken Yokohama Hokukukikunaichoume', '045-123-4032', 139.6326, 35.50049, 1732.),
       ('S14033', 'Magasin Akuwa', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市瀬谷区阿久和西一丁目', 'Ken Kanagawa Yokohama Shiseyaku Akwanishi Itchoume', '045-123-4043', 139.4961, 35.45918, 1495.),
       ('S14036', 'Magasin central de Sagamihara', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa相模原市中央二丁目', 'Kanagawa Kensagami Harashichu Ounichoume', '042-123-4045', 139.3716, 35.57327, 1679.),
       ('S14040', 'Magasin Nagatsuda', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市緑区長津田みなみ台五丁目', 'Ken Kanagawa Ken Yokohama Shimidori Kunagatsu Taminami Daigochoume', '045-123-4046', 139.4994, 35.52398, 1548.),
       ('S14050', 'Magasin Akuwa Nishi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市瀬谷区阿久和西一丁目', 'Ken Kanagawa Yokohama Shiseyaku Akwanishi Itchoume', '045-123-4053', 139.4961, 35.45918, 1830.),
       ('S13052', 'Magasin Morino', 13, 'Tokyo', 'Tokyo町田市森野三丁目', 'Tokyo Tomachida Shimorino Sanchoume', '042-123-4030', 139.4383, 35.55293, 1087.),
       ('S14028', 'Magasin Futatsubashi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市瀬谷区二ツ橋町', 'Ken Kanagawa Yokohama Shiseyaku Futatsubashicho', '045-123-4042', 139.4963, 35.46304, 1574.),
       ('S14012', 'Boutique Honmoku Wada', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市中区本牧和田', 'Ken Kanagawa Ken Yokohama Shinakakuhon Mokuwada', '045-123-4034', 139.6582, 35.42156, 1341.),
       ('S14046', 'Magasin Kitayamada', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市都筑区北山田一丁目', 'Ken Kanagawa Yokohama Shitsuzuki Kukitayama Taichoume', '045-123-4049', 139.5916, 35.56189,  831.),
       ('S14022', 'Magasin Zushi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa逗子市逗子一丁目', 'Kanagawa Kenzushizushiichoume', '046-123-4036', 139.5789, 35.29642, 1838.),
       ('S14011', 'Magasin Hiyoshi Honmachi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市港北区日吉本町四丁目', 'Ken Kanagawa Ken Yokohama Hokuhoku Hiyoshi Hongcho Yonchome', '045-123-4033', 139.6316, 35.54655,  890.),
       ('S13016', 'Magasin Koganei', 13, 'Tokyo', 'Tokyo小金井市本町一丁目', 'Tokyo Tokoganei Shihoncho Ichoume', '042-123-4015', 139.5094, 35.70018, 1399.),
       ('S14034', 'Magasin Kawasaki Nogawa', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa川崎市宮前区野川', 'Kanagawa Kenkawa Sakimiyama Ekunogawa', '044-123-4044', 139.5998, 35.57693, 1318.),
       ('S14048', 'Magasin Nakagawa Chuo', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市都筑区中川中央二丁目', 'Ken Kanagawa Ken Yokohama Shitsuzuki Kunakagawa Chuo Unichome', '045-123-4051', 139.5758, 35.54912, 1657.),
       ('S12007', 'Magasin Sakura', 12, 'Préfecture de Chiba', 'Préfecture de Chiba佐倉市上志津', 'Cibaken Sakura Shikamishizu', '043-123-4001', 140.1452, 35.71872, 1895.),
       ('S14026', 'Magasin de la côte ouest de Tsujido', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa藤沢市辻堂西海岸二丁目', 'Kanagawa Ken Fujisawa Shitsuji Dounishi Kaigan Nichome', '046-123-4040', 139.4466, 35.32464, 1732.),
       ('S13041', 'Magasin Hachioji', 13, 'Tokyo', 'Tokyo八王子市大塚', 'Tokyo Hachioujishio Otsuka', '042-123-4026', 139.4235, 35.63787,  810.),
       ('S14049', 'Magasin Kawasaki Daishi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa川崎市川崎区中瀬三丁目', 'Kanagawa Kenkawa Saki Kawasaki Kunakaze Sanchoume', '044-123-4052', 139.7327, 35.53759,  962.),
       ('S14023', 'Magasin Kawasaki', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa川崎市川崎区本町二丁目', 'Kanagawa Kenkawa Saki Kawasaki Kuhoncho Nichome', '044-123-4037', 139.7028, 35.53599, 1804.),
       ('S13018', 'Magasin Kiyose', 13, 'Tokyo', 'Tokyo清瀬市松山一丁目', 'Tokyo Tokiyoshi Matsuyamai', '042-123-4017', 139.5178, 35.76885, 1220.),
       ('S14027', 'Magasin Minami Fujisawa', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa藤沢市南藤沢', 'Kanagawa Ken Fujisawa Shiminami Fujisawa', '046-123-4041', 139.4896, 35.33762, 1521.),
       ('S14021', 'Magasin Isehara', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa伊勢原市伊勢原四丁目', 'Ken Kanagawa Isehara Shiisehara Yonchoume', '046-123-4035', 139.3129, 35.40169,  962.),
       ('S14047', 'Magasin Sagamihara', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa相模原市千代田六丁目', 'Kanagawa Kensagami Harashi Chiyodarokuchoume', '042-123-4050', 139.3748, 35.55959, 1047.),
       ('S12013', 'Magasin Narashino', 12, 'Préfecture de Chiba', 'Préfecture de Chiba習志野市芝園一丁目', 'Ciba Kennarashi no Shishi Bazono Ichoume', '047-123-4002', 140.022 , 35.66122,  808.),
       ('S14042', 'Magasin Shin Yamashita', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市中区新山下二丁目', 'Ken Kanagawa Yokohama Shinakakushin Yamashitani Chome', '045-123-4047', 139.6593, 35.43894, 1044.),
       ('S12030', 'Magasin Yawata', 12, 'Préfecture de Chiba', 'Préfecture de Chiba市川市八幡三丁目', 'Cibaken Ichikawa Shiyawata Sanchoume', '047-123-4005', 139.924 , 35.72318, 1162.),
       ('S14025', 'Magasin Yamato', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa大和市下和田', 'Ken Kanagawa Yamatoshi Shimowada', '046-123-4039', 139.468 , 35.43414, 1011.),
       ('S14045', 'Magasin Atsugi', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa厚木市中町二丁目', 'Kanagawaken Atsugi Shinakacho Nichoume', '046-123-4048', 139.3651, 35.44182,  980.),
       ('S12029', 'Magasin Higashino', 12, 'Préfecture de Chiba', 'Préfecture de Chiba浦安市東野一丁目', 'Cibaken Urayasushi Higashino Itchoume', '047-123-4004', 139.8968, 35.65086, 1101.),
       ('S12053', 'Magasin Takasu', 12, 'Préfecture de Chiba', 'Préfecture de Chiba浦安市高洲五丁目', 'Cibaken Urayasushitakasugochome', '047-123-4006', 139.9176, 35.63755, 1555.),
       ('S14024', 'Magasin Mita', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa川崎市多摩区三田四丁目', 'Kanagawa Kenkawa Saxita Makumaitayon Chome', '044-123-4038', 139.5424, 35.6077 ,  972.),
       ('S14006', 'Magasin Kuzugaya', 14, 'Préfecture de Kanagawa', 'Préfecture de Kanagawa横浜市都筑区葛が谷', 'Ken Kanagawa Yokohama Shitsuzuki Kuzugaya', '045-123-4031', 139.5633, 35.53573, 1886.)],
      dtype=[('store_cd', '<U6'), ('store_name', '<U6'), ('prefecture_cd', '<i4'), ('prefecture', '<U4'), ('address', '<U19'), ('address_kana', '<U30'), ('tel_no', '<U12'), ('longitude', '<f8'), ('latitude', '<f8'), ('floor_area', '<f8')])

Pourquoi dois-je afficher tout ce problème?

Recommended Posts

C'est pourquoi j'ai quitté les pandas [Data Science 100 Knock (traitement des données structurées) # 2]
C'est pourquoi j'ai quitté les pandas [Data Science 100 Knock (traitement des données structurées) # 1]
C'est pourquoi j'ai quitté les pandas [Data Science 100 Knock (traitement des données structurées) # 3]
C'est pourquoi j'ai quitté les pandas [Data Science 100 Knock (traitement des données structurées) # 5]
C'est pourquoi j'ai quitté les pandas [Data Science 100 Knock (traitement des données structurées) # 4]
C'est pourquoi j'ai quitté les pandas [Data Science 100 Knock (traitement des données structurées) # 6]
"Data Science 100 Knock (traitement des données structurées)" Explication Python-006
"Data Science 100 Knock (traitement des données structurées)" Explication Python-001
"Data Science 100 Knock (traitement des données structurées)" Explication Python-002
[Python] 100 coups sur la science des données (traitement de données structurées) 021 Explication
"Data Science 100 Knock (traitement des données structurées)" Explication Python-005
"Data Science 100 Knock (traitement de données structurées)" Explication Python-004
[Python] 100 coups sur la science des données (traitement de données structurées) 020 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 025 Explication
"Data Science 100 Knock (traitement des données structurées)" Explication Python-003
[Python] 100 coups sur la science des données (traitement de données structurées) 019 Explication
Préparation à l’essai de «Data Science 100 Knock (traitement des données structurées)»
Construction d'environnement (Windows 10) pour 100 coups de science des données (traitement de données structurées)
[Python] 100 coups sur la science des données (traitement de données structurées) 001-010 Impressions + résumé du lien de commentaire
C'est pourquoi j'ai quitté pandas [Trois façons de groupby.mean () avec juste NumPy]
[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
100 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
[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
[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
Commentaire sur la science des données à 100 coups (P021 ~ 040)
Commentaire sur la science des données à 100 coups (P061 ~ 080)
Commentaire de la science des données 100 coups (P041 ~ 060)
J'ai essayé 100 traitements linguistiques Knock 2020
Conseils de traitement des données avec Pandas
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 3
100 traitement du langage knock-31 (en utilisant des pandas): verbe
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 2
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 4
100 traitement du langage knock-38 (en utilisant des pandas): histogramme
100 Language Processing Knock-33 (en utilisant des pandas): nom sahen
100 traitement du langage knock-91: Préparation des données d'analogie
J'ai essayé la "Practical Python Data Science" d'Udemy
100 traitement du langage knock-35 (utilisant des pandas): concaténation de nomenclature
100 Language Processing Knock-39 (en utilisant des pandas): la loi de Zipf
Exemple de traitement efficace des données avec PANDAS
100 traitement de langage knock-34 (utilisant des pandas): "B of A"