dask - манипулирование временными рядами CSV - PullRequest
1 голос
/ 24 февраля 2020

У меня есть CSV размером около 5 ГБ, структура и тип данных примерно такие:

              datetime      product name      serial number
0  2017-06-24 14:30:15            orange             123456
1  2017-07-04 21:33:50             apple             123456
2  2017-07-06 06:38:52            orange             123456
3  2017-07-10 15:52:07            banana             123456
4  2017-07-10 15:52:51            banana             123456
5  2017-07-10 15:53:18            banana             123456
6  2017-07-11 11:50:40         pineapple             123456
7  2017-07-11 00:53:43             apple              54321
8  2017-07-11 06:23:52             apple              54321
9  2017-07-11 06:23:52             apple              12454
10 2017-07-11 06:23:52             apple              12454
11 2017-07-11 06:23:52             apple              12454
12 2017-07-11 06:23:52             apple              15039
13 2017-07-11 06:23:52             apple              15037
14 2017-07-11 06:23:52             apple              15039
15 2017-07-11 06:23:52             apple              15190
16 2017-07-11 06:23:52             apple              15039
17 2017-07-11 06:23:52             apple              15037
18 2017-07-11 06:23:52             apple              15037
19 2017-07-11 06:23:52             apple              15037
....
few millions more lines

df.dtypes
Out[134]: 
datetime           datetime64[ns]
name                       object
events                      int64
dtype: object

Вопрос 1. Как сгруппировать по названию продукта, а затем подсчитать количество серийных номеров только для 10 лучших продуктов (с наибольшим количеством вхождений сверху)?

# this does the count, but there are over 10,000 rows, and it is not sorted by counts f
df.groupby(['product name', 'serial number']).agg({'serial number':'count'}).compute()

# expected output (in table form):
product name    serial number       counts
      orange           123456            2
      orange            54321           12
       apple           123456            1
       apple            54321            4
   pineapple           123456           16

Вопрос 2: Как я могу изобразить вхождение каждого серийного номера для одного названия продукта во временной области?

Вопрос 3: Я действительно хочу нанести на график вхождение каждого «серийного номера» для одного имени продукта во временной области, поэтому я могу выбрать «название продукта» из кадра данных, используя:

df_orange = df[df['proudct name'] == 'orange']
# how do I plot it? 

1 Ответ

1 голос
/ 24 февраля 2020

хотя мои два цента были бы для бина с использованием .cut или .resample, я покажу простое решение, которое вы можете запустить для каждого product name.

import pandas as pd
import matplotlib.pyplot as plt

# groupby twice
apple = (df.groupby('product name')    # groupby 'product name'
           .get_group('apple')         # get 'apple' group
           .groupby('datetime'))       # groupby 'datetime'


apple1 = (apple['serial number']       # select 'serial number'
          .agg(['value_counts']        # count the 'serial number's
          .unstack(1)                  # this makes 'serial number's go across columns
          .droplevel(axis=1, level=0)) # drop extra multiindex level name('value_counts')           

apple1.plot(kind='bar')                # plot it
plt.xticks(rotation=0)                 # because your 'datetime' is long and un-formatted
plt.yticks([i for i in range(5)])      # set xticks to  int
plt.show()

One of the possible subplot solutions

повторите это для каждого product name, нанесите их с subplots на Figure, и вы будете установлены

...