Выбор записей из большого кадра данных панд идет медленно - PullRequest
0 голосов
/ 18 октября 2018

У меня есть два кадра данных панда: один с премиум-клиентами, df_premium_customer и один со всеми проданными товарами, df_sold, который имеет в качестве столбцов «customerID» (содержащий идентификаторы как премиум-клиентов, так и других), «ArticleID»,« Свидание »и несколько других.

Так выглядит df_premium_customer

<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
    border: 1px solid black;
}
</style>
</head>
<body>

<h2>Bordered Table</h2>
<p>Use the CSS border property to add a border to the table.</p>

<table style="width:100%">
  <tr>
    <th>Premium_CustomerID</th>
  </tr>
  <tr>
    <td>34674324</td>
  </tr>
  <tr>
    <td>18634345</td>
  </tr>
  <tr>
    <td>99744336</td>
  </tr>
</table>

</body>
</html>

и это df_sold выглядит

<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
    border: 1px solid black;
}
</style>
</head>
<body>

<h2>Bordered Table</h2>
<p>Use the CSS border property to add a border to the table.</p>

<table style="width:100%">
  <tr>
    <th>CustimerID</th>
    <th>ArticleID</th> 
    <th>Date</th>
  </tr>
  <tr>
    <td>34674324</td>
    <td>3467434</td>
    <td>20140302</td>
  </tr>
  <tr>
    <td>98674342</td>
    <td>3454234</td>
    <td>20140822</td>
  </tr>
  <tr>
    <td>74644334</td>
    <td>4444434</td>
    <td>20150321</td>
  </tr>
</table>

</body>
</html>

Для каждого клиента мне нужно создать структуру данных (предварительно я выбрал дикт), которая показывает, что было продано каждому премиум-клиенту.

ИтакПока я использую следующий код Python 3:

sold_to_customer = {}
for customer in df_premium_customer["CustomerID"]: 
    #generate the list of indexes of this this customers appears in df_sold
    cust_index = df_sold.index[df_sold['CustomerID'] == customer].tolist()

    #add this customers as key to the dict                              
    sold_to_customer[customer] = []  

    for ind in cust_index:  
        #add the name of the things he bought,when, and for how much as values to this key     
        sold_to_customer[customer].append(list(df_sold[ind][["ArticleID","Date"]]))

Это очень медленный способ!

Дать ему немного поработать и экстраполировать нужно 16часов до завершения, поскольку у меня 300 000 премиум-клиентов и несколько миллионов строк записей в кадре проданных товаров.

1 Ответ

0 голосов
/ 18 октября 2018

Я считаю, что ваша проблема исходит от панд.В общем, панды очень медленные.Вы можете получить некоторое ускорение, используя метод слияния или группового, но я даже не уверен.Я полагаю, что один простой способ получить ускорение состоит в том, чтобы сделать все это в тупик.Я думаю, что строка

cust_index = df_sold.index[df_sold['CustomerID'] == customer].tolist()

стоит вам очень дорого, поскольку вы делаете это для каждого клиента.

Что вы могли бы сделать, это создать словарь со всеми премиальными идентификаторами клиентов и перейтичерез все ваши данные.Чтобы просмотреть все ваши данные, вы можете использовать цикл for, который все еще будет медленным, но я считаю, что это быстрее, чем то, что вы делали с пандами.

sold_to_customer = {}
for customer in df_premium_customer["CustomerID"]: 
    #Initialize the dict
    sold_to_customer[customer] = []
data = df_sold.values
for i,j,k in data:
    sold_to_customer[i].append([j,k])

Это заставляет вас просматривать данные только один раз,и так как доступ к диктовке должен быть быстрым, вам следует идти вперед.Дайте мне знать, если эта скорость ускорится, и будет ли скорость достаточной или она все еще должна быть оптимизирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...