In [0]:
def configure_plotly_browser_state():
  import IPython
  display(IPython.core.display.HTML('''
        <script src="/static/components/requirejs/require.js"></script>
        <script>
          requirejs.config({
            paths: {
              base: '/static/base',
              plotly: 'https://cdn.plot.ly/plotly-latest.min.js?noext',
            },
          });
        </script>
        '''))
In [0]:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
from datetime import datetime, date, time, timedelta
from scipy import optimize,stats
from dateutil import relativedelta
from functools import reduce

import operator

plt.rcParams['figure.figsize'] = [20, 10]
init_notebook_mode(connected=True)
In [0]:
datetime.today().strftime("%m.%d.%Y")
Out[0]:
'05.13.2019'
In [0]:
from google.colab import auth
auth.authenticate_user()
print('Authenticated')
Authenticated

Read from BigQuery

In [334]:
%%bigquery --project dashappsanalytics df
  select * from `dashappsanalytics.app_store.SUBSCRIPTION_EVENT` ;
Out[334]:
event_date event app_name app_apple_id subscription_name subscription_apple_id subscription_group_id subscription_duration introductory_price_type introductory_price_duration ... client device state country previous_subscription_name previous_subscription_apple_id days_before_canceling cancellation_reason days_canceled quantity
0 2019-05-11 Renew U Beats: Beat Maker & Drum Pad 1238153568 Month subscription with 7 days trial 1262732920 20403689 1 Month None None ... None iPhone NSW AUS None None None None None 1
1 2019-05-11 Renew U Beats: Beat Maker & Drum Pad 1238153568 Month subscription 1262734122 20403689 1 Month None None ... None iPhone NY USA None None None None None 1
2 2019-05-11 Renewal from Billing Retry U Beats: Beat Maker & Drum Pad 1238153568 Year subscription 1262735182 20403689 1 Year None None ... None iPad FL USA None None None None None 1
3 2019-05-11 Renew Piano keyboard - music maker 1276147378 Month subscription 1293321244 20414142 1 Month None None ... None iPhone None GBR None None None None None 1
4 2019-05-11 Renew Piano keyboard - music maker 1276147378 Month subscription with 7 days trial 1293327412 20414142 1 Month None None ... None iPhone AT ITA None None None None None 1
5 2019-05-11 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days None None ... None iPhone None RUS None None None None None 1
6 2019-05-11 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days None None ... None iPhone NY USA None None None None None 1
7 2019-05-11 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days None None ... None iPhone None NOR None None None None None 1
8 2019-05-11 Cancel U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days None None ... None iPhone FL USA None None 429 Canceled None 1
9 2019-05-11 Cancel U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days Free Trial 3 Days ... None iPhone WA AUS None None 0 Canceled None 1
10 2019-05-11 Start Introductory Offer U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days Free Trial 3 Days ... None iPhone None UKR None None None None None 1
11 2019-05-11 Renewal from Billing Retry U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days None None ... None iPod touch LIM PER None None None None None 1
12 2019-05-11 Renewal from Billing Retry U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days None None ... None iPhone 广东 CHN None None None None None 1
13 2019-05-11 Billing Retry from Paid Subscription U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days None None ... None iPhone QLD AUS None None None None None 1
14 2019-05-11 Billing Retry from Paid Subscription U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days None None ... None iPhone 福建 CHN None None None None None 1
15 2019-05-11 Billing Retry from Paid Subscription U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 3.99 1342643870 20403689 7 Days None None ... None iPhone None RUS None None None None None 1
16 2019-05-12 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial 1362026259 20403689 7 Days None None ... None iPhone CA USA None None None None None 1
17 2019-05-12 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial 1362026259 20403689 7 Days None None ... None iPhone None ISR None None None None None 1
18 2019-05-11 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial 1362026259 20403689 7 Days None None ... None iPhone None TUR None None None None None 1
19 2019-05-11 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial 1362026259 20403689 7 Days None None ... None iPhone OR USA None None None None None 1
20 2019-05-11 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial 1362026259 20403689 7 Days None None ... None iPhone QLD AUS None None None None None 1
21 2019-05-12 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial 1362026259 20403689 7 Days None None ... None iPhone CA USA None None None None None 1
22 2019-05-11 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial 1362026259 20403689 7 Days None None ... None iPhone FL USA None None None None None 1
23 2019-05-11 Renew Music Mix Maker: Pro DJ Studio 1355347116 Week with 3 days trial 1373717831 20442867 7 Days None None ... None iPhone None LVA None None None None None 1
24 2019-05-11 Renew Music Mix Maker: Pro DJ Studio 1355347116 Week with 3 days trial 1373717831 20442867 7 Days None None ... None iPhone None UKR None None None None None 1
25 2019-05-11 Renew Music Mix Maker: Pro DJ Studio 1355347116 Week with 3 days trial 1373717831 20442867 7 Days None None ... None iPhone MA USA None None None None None 1
26 2019-05-11 Renew Music Mix Maker: Pro DJ Studio 1355347116 Week with 3 days trial 1373717831 20442867 7 Days None None ... None iPhone None GBR None None None None None 1
27 2019-05-12 Renew Music Mix Maker: Pro DJ Studio 1355347116 Week with 3 days trial 1373717831 20442867 7 Days None None ... None iPhone KS USA None None None None None 1
28 2019-05-11 Renew Music Mix Maker: Pro DJ Studio 1355347116 Week with 3 days trial 1373717831 20442867 7 Days None None ... None iPhone None GBR None None None None None 1
29 2019-05-12 Renew Music Mix Maker: Pro DJ Studio 1355347116 Week with 3 days trial 1373717831 20442867 7 Days None None ... None iPad CA USA None None None None None 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
227510 2018-12-22 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone CA USA None None None None None 3
227511 2018-12-21 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone CA USA None None None None None 3
227512 2018-12-18 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone CA USA None None None None None 3
227513 2018-12-11 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone CA USA None None None None None 3
227514 2018-12-28 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone FL USA None None None None None 3
227515 2018-12-24 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone FL USA None None None None None 3
227516 2018-12-21 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone FL USA None None None None None 3
227517 2018-12-20 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone FL USA None None None None None 3
227518 2018-12-18 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone FL USA None None None None None 3
227519 2018-12-19 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone MA USA None None None None None 3
227520 2018-12-24 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone NC USA None None None None None 3
227521 2018-12-20 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone SP BRA None None None None None 3
227522 2018-12-15 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone SP BRA None None None None None 3
227523 2018-12-13 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone TX USA None None None None None 3
227524 2018-12-08 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone TX USA None None None None None 3
227525 2018-12-10 Billing Retry from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone NSW AUS None None None None None 3
227526 2018-12-11 Introductory Price from Introductory Price U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial by 8.99 1443526453 20450526 7 Days Free Trial 3 Days ... None iPhone Bangkok THA None None None None None 3
227527 2019-01-18 Renew U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 0.99 1447405911 20403689 7 Days None None ... None iPhone None RUS None None None None None 3
227528 2019-01-18 Cancel U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 0.99 1447405911 20403689 7 Days None None ... None iPhone None RUS None None 0 Canceled None 3
227529 2019-02-01 Cancel U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 0.99 1447405911 20403689 7 Days None None ... None iPhone None RUS None None 0 Canceled None 3
227530 2019-01-12 Subscribe U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 0.99 1447405911 20403689 7 Days None None ... None iPhone None DEU None None None None None 3
227531 2019-01-21 Subscribe U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 0.99 1447405911 20403689 7 Days None None ... None iPhone None RUS None None None None None 3
227532 2019-01-14 Subscribe U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 0.99 1447405911 20403689 7 Days None None ... None iPhone None RUS None None None None None 3
227533 2019-01-13 Subscribe U Beats: Beat Maker & Drum Pad 1238153568 Week subscription with 3 days trial by 0.99 1447405911 20403689 7 Days None None ... None iPhone None RUS None None None None None 3
227534 2019-05-08 Cancelled from Billing Retry U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial 1376753465 20450526 7 Days Free Trial 3 Days ... None iPhone None RUS None None None Billing issue None 3
227535 2019-05-08 Start Introductory Offer U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial 1376753465 20450526 7 Days Free Trial 3 Days ... None iPhone None TUR None None None None None 3
227536 2019-05-07 Renew U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial 1376753465 20450526 7 Days None None ... None iPhone None GBR None None None None None 3
227537 2019-05-07 Cancel U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial 1376753465 20450526 7 Days Free Trial 3 Days ... None iPhone CA USA None None 0 Canceled None 3
227538 2019-05-07 Cancel U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial 1376753465 20450526 7 Days Free Trial 3 Days ... None iPhone None RUS None None 0 Canceled None 3
227539 2019-05-07 Cancelled from Billing Retry U Beats: Beat Maker & Drum Pad 1238153568 Weekly subscription with 3-day trial 1376753465 20450526 7 Days Free Trial 3 Days ... None iPhone None RUS None None None Billing issue None 3

227540 rows × 26 columns

In [335]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 227540 entries, 0 to 227539
Data columns (total 26 columns):
event_date                        227540 non-null object
event                             227540 non-null object
app_name                          227540 non-null object
app_apple_id                      227540 non-null object
subscription_name                 227540 non-null object
subscription_apple_id             227540 non-null object
subscription_group_id             227540 non-null object
subscription_duration             227540 non-null object
introductory_price_type           81576 non-null object
introductory_price_duration       81576 non-null object
marketing_opt_in                  0 non-null object
marketing_opt_in_duration         0 non-null object
preserved_pricing                 86 non-null object
proceeds_reason                   351 non-null object
consecutive_paid_periods          227540 non-null object
original_start_date               227540 non-null object
client                            0 non-null object
device                            227540 non-null object
state                             141995 non-null object
country                           227540 non-null object
previous_subscription_name        524 non-null object
previous_subscription_apple_id    524 non-null object
days_before_canceling             28970 non-null object
cancellation_reason               46846 non-null object
days_canceled                     1377 non-null object
quantity                          227540 non-null object
dtypes: object(26)
memory usage: 45.1+ MB
In [0]:
def data_preparation(df):

  #df[df['app_apple_id'].isin([ubeats_app_id])]

  df['event_date'] = pd.to_datetime(df['event_date'])
  df['original_start_date'] = pd.to_datetime(df['original_start_date'])
  df['time_range'] = df['event_date'] - df['original_start_date']
  return df

Constants

In [0]:
df = data_preparation(df)
In [0]:
ubeats_app_id = '1238153568'
mmm_app_id = '1355347116'
piano_app_id= '1276147378'

weekly_subscriptions_price_7_99 = 7.99
weekly_subscriptions_price_8_99 = 8.99
weekly_subscriptions_price_3_99 = 3.99

monthly_subscriptions_price = 16.99
annual_subscriptions_price = 39.99

    
weekly_subscription_names = [
    'Weekly subscription with 3-day trial',
    'Week subscription with 3 days trial',
    'Weekly subscription with 3-day trial by 8.99',
    'Week subscription with 7 days trial',
    'Week subscription with 3 days trial by 3.99',
    'Week subscription with 3 days trial by 0.99',
]

weekly_subscription_names_7_99 = [
    'Weekly subscription with 3-day trial',
    'Week subscription with 3 days trial',
    'Week subscription with 7 days trial',
]

weekly_subscription_names_8_99 = [
    'Weekly subscription with 3-day trial by 8.99',
]

weekly_subscription_names_3_99 = [
    'Week subscription with 3 days trial by 3.99',
]

monthly_subscription_names = [
    'Month subscription new',
    'Month subscription with 7 days trial',
    'Month subscription',
]

annual_subscription_names = [
    'Year subscription new',
    'Year subscription',
]

billing_retry_events = [
    'Billing Retry from Introductory Offer',
    'Billing Retry from Introductory Price',
    'Billing Retry from Paid Subscription',
]

payment_events = [
#  'Billing Retry from Introductory Offer',
#  'Billing Retry from Introductory Price',
#  'Billing Retry from Paid Subscription',
#  'Cancel',
#  'Cancelled from Billing Retry',
#  'Crossgrade',
#  'Crossgrade from Billing Retry',
#  'Crossgrade from Introductory Price',
#  'Introductory Price Crossgrade from Billing Retry',
#  'Introductory Price from Introductory Price',
 'Paid Subscription from Introductory Offer',
 'Paid Subscription from Introductory Price',
 'Reactivate',
 'Reactivate with Crossgrade',
#  'Reactivate with Introductory Price',
#  'Refund',
 'Renew',
 'Renewal from Billing Retry',
#  'Start Introductory Offer',
#  'Start Introductory Price',
#  'Subscribe'
]

trial_started_events = [
    "Start Introductory Offer",
    "Start Introductory Price",
]

subscription_names = [
  'Month subscription',
  'Month subscription new',
  'Month subscription with 7 days trial',
  'Week subscription with 3 days trial',
  'Week subscription with 3 days trial by 0.99',
  'Week subscription with 3 days trial by 3.99',
  'Week subscription with 7 days trial',
  'Week with 3 days trial',
  'Week with 3 days trial by 2.99',
  'Weekly subscription with 3-day trial',
  'Weekly subscription with 3-day trial by 8.99',
  'Year subscription',
  'Year subscription new',
]
In [0]:
ubeats = df[df['app_apple_id']== ubeats_app_id]
In [0]:
 
In [340]:
df.head(4).T
Out[340]:
0 1 2 3
event_date 2019-05-11 00:00:00 2019-05-11 00:00:00 2019-05-11 00:00:00 2019-05-11 00:00:00
event Renew Renew Renewal from Billing Retry Renew
app_name U Beats: Beat Maker & Drum Pad U Beats: Beat Maker & Drum Pad U Beats: Beat Maker & Drum Pad Piano keyboard - music maker
app_apple_id 1238153568 1238153568 1238153568 1276147378
subscription_name Month subscription with 7 days trial Month subscription Year subscription Month subscription
subscription_apple_id 1262732920 1262734122 1262735182 1293321244
subscription_group_id 20403689 20403689 20403689 20414142
subscription_duration 1 Month 1 Month 1 Year 1 Month
introductory_price_type None None None None
introductory_price_duration None None None None
marketing_opt_in None None None None
marketing_opt_in_duration None None None None
preserved_pricing None None None None
proceeds_reason Rate After One Year Rate After One Year Rate After One Year None
consecutive_paid_periods 19 15 2 2
original_start_date 2017-11-04 00:00:00 2018-03-11 00:00:00 2018-04-17 00:00:00 2019-04-11 00:00:00
client None None None None
device iPhone iPhone iPad iPhone
state NSW NY FL None
country AUS USA USA GBR
previous_subscription_name None None None None
previous_subscription_apple_id None None None None
days_before_canceling None None None None
cancellation_reason None None None None
days_canceled None None None None
quantity 1 1 1 1
time_range 553 days 00:00:00 426 days 00:00:00 389 days 00:00:00 30 days 00:00:00

Events

In [341]:
ubeats['event'].value_counts()
Out[341]:
Renew                                               70277
Start Introductory Price                            28062
Cancel                                              26858
Billing Retry from Paid Subscription                19220
Renewal from Billing Retry                          18092
Cancelled from Billing Retry                        16188
Billing Retry from Introductory Price               12741
Paid Subscription from Introductory Price            9433
Start Introductory Offer                             2664
Refund                                               1295
Billing Retry from Introductory Offer                1161
Reactivate                                           1087
Paid Subscription from Introductory Offer             795
Subscribe                                             608
Introductory Price from Introductory Price            408
Reactivate with Crossgrade                            242
Crossgrade                                            149
Crossgrade from Billing Retry                          63
Crossgrade from Introductory Price                     45
Reactivate with Introductory Price                      3
Crossgrade from Introductory Offer                      3
Introductory Price Crossgrade from Billing Retry        2
Name: event, dtype: int64
In [342]:
ubeats[ubeats['event'] == 'Subscribe'].head(5).T
Out[342]:
1214 1816 4304 4305 4306
event_date 2019-05-09 00:00:00 2019-05-10 00:00:00 2019-01-25 00:00:00 2019-01-24 00:00:00 2019-01-11 00:00:00
event Subscribe Subscribe Subscribe Subscribe Subscribe
app_name U Beats: Beat Maker & Drum Pad U Beats: Beat Maker & Drum Pad U Beats: Beat Maker & Drum Pad U Beats: Beat Maker & Drum Pad U Beats: Beat Maker & Drum Pad
app_apple_id 1238153568 1238153568 1238153568 1238153568 1238153568
subscription_name Year subscription new Weekly subscription with 3-day trial Week subscription with 3 days trial by 0.99 Week subscription with 3 days trial by 0.99 Week subscription with 3 days trial by 0.99
subscription_apple_id 1376766115 1376753465 1447405911 1447405911 1447405911
subscription_group_id 20450526 20450526 20403689 20403689 20403689
subscription_duration 1 Year 7 Days 7 Days 7 Days 7 Days
introductory_price_type None None None None None
introductory_price_duration None None None None None
marketing_opt_in None None None None None
marketing_opt_in_duration None None None None None
preserved_pricing None None None None None
proceeds_reason None None None None None
consecutive_paid_periods 1 1 1 1 1
original_start_date 2019-05-09 00:00:00 2019-05-10 00:00:00 2019-01-25 00:00:00 2019-01-24 00:00:00 2019-01-11 00:00:00
client None None None None None
device iPhone iPhone iPhone iPhone iPhone
state NY AZ None None None
country USA ARE RUS RUS RUS
previous_subscription_name None None None None None
previous_subscription_apple_id None None None None None
days_before_canceling None None None None None
cancellation_reason None None None None None
days_canceled None None None None None
quantity 1 1 7 5 6
time_range 0 days 00:00:00 0 days 00:00:00 0 days 00:00:00 0 days 00:00:00 0 days 00:00:00
In [343]:
ubeats[ubeats['time_range'] == timedelta(0)]['event'].value_counts()
Out[343]:
Start Introductory Price                      28029
Start Introductory Offer                       2661
Reactivate                                     1087
Subscribe                                       608
Introductory Price from Introductory Price      376
Reactivate with Crossgrade                      242
Refund                                           24
Crossgrade                                        6
Reactivate with Introductory Price                3
Name: event, dtype: int64
In [0]:
# arr = []
# for original_start_date, group in ubeats[ubeats['event'] == 'Cancel'].groupby('original_start_date'):
#   arr.append(ubeats[(ubeats['original_start_date'] == original_start_date) & (ubeats['event_date'] > original_start_date)]['event'].value_counts())

# reduce(lambda a, x: a.add(x, fill_value=0), arr)

Предположение: Subscribe - подписка без триала

In [0]:
# np.sort(ubeats[ubeats['event'] == 'Start Introductory Price']['event_date'].value_counts().keys())
In [0]:
# np.sort(ubeats[ubeats['event'] == 'Start Introductory Price']['original_start_date'].value_counts().keys())
In [0]:
# np.sort(ubeats[ubeats['event'] == 'Start Introductory Offer']['original_start_date'].value_counts().keys())
In [0]:
# np.sort(ubeats[ubeats['event'] == 'Start Introductory Offer']['event_date'].value_counts().keys())

2019-03-25 ивент Start Introductory Price сменился на Start Introductory Offer

Start Introductory Price & Start Introductory Offer

In [0]:
def show_plot(start_date, days_count):
  data = [[], [], []]
  for i in range(days_count):
    data[0].append(ubeats[(ubeats['event'] == 'Start Introductory Price') & (ubeats['original_start_date'] == start_date + timedelta(i))]['quantity'].sum())
    data[1].append(ubeats[(ubeats['event'] == 'Start Introductory Offer') & (ubeats['original_start_date'] == start_date + timedelta(i))]['quantity'].sum())
    data[2].append(start_date + timedelta(i))
    

  data = [
    go.Scatter(x = data[2], y = data[0], name='Price'),
    go.Scatter(x = data[2], y = data[1], name='Offer'),   
  ]

  fig = go.Figure(data=data)

  configure_plotly_browser_state()
  iplot(fig)
  
In [350]:
show_plot(datetime(2019, 3, 1), 70)

Start Introductory Price = Start Introductory Offer

Subscriptions

In [438]:
ubeats['subscription_name'].value_counts()
Out[438]:
Weekly subscription with 3-day trial            160957
Week subscription with 3 days trial              18377
Weekly subscription with 3-day trial by 8.99     17618
Week subscription with 7 days trial               6850
Week subscription with 3 days trial by 3.99       2297
Month subscription new                            1045
Month subscription with 7 days trial               839
Month subscription                                 601
Week subscription with 3 days trial by 0.99        379
Year subscription new                              330
Year subscription                                  103
Name: subscription_name, dtype: int64

Functions definition

In [0]:
# points = [[days],[values]]

def calc_points(start_date, end_date, df, events):
  counter = 0
  points = [[],[]]
  cohort = df[(df['original_start_date'] >= start_date) & (df['original_start_date'] < end_date)]
  cohort_size = cohort[cohort['event'].isin(trial_started_events)]['quantity'].sum()
  
  for time_range, group in cohort[cohort['event'].isin(events)].groupby('time_range'):
    counter += group['quantity'].sum() / cohort_size
    points[0].append(time_range.days)
    points[1].append(counter)
  return points
  
def getPointByDay(points, day):
  for i in range(len(points[0])):
    if points[0][i] >= day:
      return [points[0][i], points[1][i]]
  return [[day], [0]]
    
def getPointByValue(points, value):
    for i in range(len(points[0])):
      if points[1][i] >= value:
        return [points[0][i], points[1][i]]
    return [['not exist'], ['not exist']]

Отношение количества покупок сделанных за период $\Delta{x}$ к количеству триалов.

Данные с 01-03-2018 по 01-05-2019

In [440]:
points = calc_points(datetime(2018, 3, 1), datetime(2019, 5, 1), ubeats, payment_events)
data = [go.Scatter(x = points[0], y = points[1])]

layout=go.Layout(xaxis={'title':'Dx'}, yaxis={'title':'Purchases / Start Introductory Price'})
fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig)

Отношение количества покупок сделанных за период $\Delta{x}$ к количеству триалов по месяцам.

Данные с 01-06-2018 по 01-05-2019

In [441]:
june_points = calc_points(datetime(2018, 6, 1), datetime(2018, 7, 1), ubeats, payment_events)
july_points = calc_points(datetime(2018, 7, 1), datetime(2018, 8, 1), ubeats, payment_events)
aug_points = calc_points(datetime(2018, 8, 1), datetime(2018, 9, 1), ubeats, payment_events)
sep_points = calc_points(datetime(2018, 9, 1), datetime(2018, 10, 1), ubeats, payment_events)
oct_points = calc_points(datetime(2018, 10, 1), datetime(2018, 11, 1), ubeats, payment_events)
nov_points = calc_points(datetime(2018, 11, 1), datetime(2018, 12, 1), ubeats, payment_events)
dec_points = calc_points(datetime(2018, 12, 1), datetime(2019, 1, 1), ubeats, payment_events)
jan_points = calc_points(datetime(2019, 1, 1), datetime(2019, 2, 1), ubeats, payment_events)
feb_points = calc_points(datetime(2019, 2, 1), datetime(2019, 3, 1), ubeats, payment_events)
mar_points = calc_points(datetime(2019, 3, 1), datetime(2019, 4, 1), ubeats, payment_events)
apr_points = calc_points(datetime(2019, 4, 1), datetime(2019, 5, 1), ubeats, payment_events)

data = [
  go.Scatter(x = june_points[0], y = june_points[1], name='June'),
  go.Scatter(x = july_points[0], y = july_points[1], name='July'),
  go.Scatter(x = aug_points[0], y = aug_points[1], name='Aug'),
  go.Scatter(x = sep_points[0], y = sep_points[1], name='Sept'),
  go.Scatter(x = oct_points[0], y = oct_points[1], name='Oct'),
  go.Scatter(x = nov_points[0], y = nov_points[1], name='Nov'),
  go.Scatter(x = dec_points[0], y = dec_points[1], name='Dec'),
  go.Scatter(x = jan_points[0], y = jan_points[1], name='Jan'),
  go.Scatter(x = feb_points[0], y = feb_points[1], name='Feb'),
  go.Scatter(x = mar_points[0], y = mar_points[1], name='Mar'),
  go.Scatter(x = apr_points[0], y = apr_points[1], name='Apr'),
    
]

layout=go.Layout(xaxis={'title':'Dx'}, yaxis={'title':'Purchases / Start Introductory Price'})
fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig)

График описывает скорость окупаемости триалов.

В апреле упала конверсия триалов.

Отношение количества покупок сделанных за период Δ𝑥 к количеству триалов по неделям

на графике представлены 1ая и 2ая неделя марта и апреля

In [442]:
mar_points_week_1 = calc_points(datetime(2019, 3, 1), datetime(2019, 3, 8), ubeats, payment_events)
mar_points_week_2 = calc_points(datetime(2019, 3, 8), datetime(2019, 3, 15), ubeats, payment_events)
mar_points_week_3 = calc_points(datetime(2019, 3, 15), datetime(2019, 3, 22), ubeats, payment_events)
mar_points_week_4 = calc_points(datetime(2019, 3, 22), datetime(2019, 3, 29), ubeats, payment_events)
apr_points_week_1 = calc_points(datetime(2019, 4, 1), datetime(2019, 4, 8), ubeats, payment_events)
apr_points_week_2 = calc_points(datetime(2019, 4, 8), datetime(2019, 4, 15), ubeats, payment_events)
apr_points_week_3 = calc_points(datetime(2019, 4, 15), datetime(2019, 4, 22), ubeats, payment_events)

data = [
  go.Scatter(x = mar_points_week_1[0], y = mar_points_week_1[1], name='Mar_1'),
  go.Scatter(x = mar_points_week_2[0], y = mar_points_week_2[1], name='Mar_2'),
  go.Scatter(x = mar_points_week_3[0], y = mar_points_week_3[1], name='Mar_3'),
  go.Scatter(x = mar_points_week_4[0], y = mar_points_week_4[1], name='Mar_4'),
    
  go.Scatter(x = apr_points_week_1[0], y = apr_points_week_1[1], name='Apr_1'),
  go.Scatter(x = apr_points_week_2[0], y = apr_points_week_2[1], name='Apr_2'),
  go.Scatter(x = apr_points_week_3[0], y = apr_points_week_3[1], name='Apr_3'),   
]

layout=go.Layout(xaxis={'title':'Dx'}, yaxis={'title':'Purchases / Start Introductory Price'})
fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig)

Апрель ~ Март

Отношение количества покупок сделанных за период $\Delta{x}$ к количеству пользователей совершивших покупки.

Данные с 01-03-2018 по 01-05-2019

In [0]:
def calc_points_paid_only(start_date, end_date, df, events):
  counter = 0
  points = [[],[]]
  cohort = df[(df['original_start_date'] >= start_date) & (df['original_start_date'] < end_date)]
  cohort_size = cohort[(cohort['consecutive_paid_periods'] == 1) & (cohort['event'].isin(events))]['quantity'].sum()
    
  for time_range, group in cohort[cohort['event'].isin(events)].groupby('time_range'):
    counter += group['quantity'].sum() / cohort_size
    points[0].append(time_range.days)
    points[1].append(counter)
  return points
In [444]:
points_paid_only = calc_points_paid_only(datetime(2018, 3, 1), datetime(2019, 5, 1), ubeats, payment_events)


data = [go.Scatter(x = points_paid_only[0], y = points_paid_only[1])]

fig = go.Figure(data=data)

configure_plotly_browser_state()
iplot(fig)

Отношение количества покупок сделанных за период Δ𝑥 к количеству пользователей совершивших покупки по месяцам.

Данные с 01-06-2018 по 01-05-2019

In [445]:
june_points = calc_points_paid_only(datetime(2018, 6, 1), datetime(2018, 7, 1), ubeats, payment_events)
july_points = calc_points_paid_only(datetime(2018, 7, 1), datetime(2018, 8, 1), ubeats, payment_events)
aug_points = calc_points_paid_only(datetime(2018, 8, 1), datetime(2018, 9, 1), ubeats, payment_events)
sep_points = calc_points_paid_only(datetime(2018, 9, 1), datetime(2018, 10, 1), ubeats, payment_events)
oct_points = calc_points_paid_only(datetime(2018, 10, 1), datetime(2018, 11, 1), ubeats, payment_events)
nov_points = calc_points_paid_only(datetime(2018, 11, 1), datetime(2018, 12, 1), ubeats, payment_events)
dec_points = calc_points_paid_only(datetime(2018, 12, 1), datetime(2019, 1, 1), ubeats, payment_events)
jan_points = calc_points_paid_only(datetime(2019, 1, 1), datetime(2019, 2, 1), ubeats, payment_events)
feb_points = calc_points_paid_only(datetime(2019, 2, 1), datetime(2019, 3, 1), ubeats, payment_events)
mar_points = calc_points_paid_only(datetime(2019, 3, 1), datetime(2019, 4, 1), ubeats, payment_events)
apr_points = calc_points_paid_only(datetime(2019, 4, 1), datetime(2019, 5, 1), ubeats, payment_events)

data = [
  go.Scatter(x = june_points[0], y = june_points[1], name='June'),
  go.Scatter(x = july_points[0], y = july_points[1], name='July'),
  go.Scatter(x = aug_points[0], y = aug_points[1], name='Aug'),
  go.Scatter(x = sep_points[0], y = sep_points[1], name='Sept'),
  go.Scatter(x = oct_points[0], y = oct_points[1], name='Oct'),
  go.Scatter(x = nov_points[0], y = nov_points[1], name='Nov'),
  go.Scatter(x = dec_points[0], y = dec_points[1], name='Dec'),
  go.Scatter(x = jan_points[0], y = jan_points[1], name='Jan'),
  go.Scatter(x = feb_points[0], y = feb_points[1], name='Feb'),
  go.Scatter(x = mar_points[0], y = mar_points[1], name='Mar'),
  go.Scatter(x = apr_points[0], y = apr_points[1], name='Apr'),    
]


layout = go.Layout()
fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig, filename='evts-by-month-paid')

График описывает скорость окупаемости платящий пользователей.

Качество платящих пользователей в марте - апреле возросло.

In [446]:
print('Количество пользователей совершивших покупки в апреле (первая неделя):', ubeats[(ubeats['original_start_date'] >= datetime(2019, 4, 1)) & (ubeats['original_start_date'] < datetime(2019, 4, 7)) & (ubeats['event_date'] < datetime(2019, 4, 15)) & (ubeats['event'].isin(payment_events)) & ubeats['consecutive_paid_periods'] == 1]['quantity'].sum())
print('Количество пользователей совершивших покупки в марте (первая неделя):', ubeats[(ubeats['original_start_date'] >= datetime(2019, 3, 1)) & (ubeats['original_start_date'] < datetime(2019, 3, 7)) & (ubeats['event_date'] < datetime(2019, 3, 15)) & (ubeats['event'].isin(payment_events)) & ubeats['consecutive_paid_periods'] == 1]['quantity'].sum())
Количество пользователей совершивших покупки в апреле (первая неделя): 266
Количество пользователей совершивших покупки в марте (первая неделя): 286
In [447]:
print('Количество триалов в апреле (первая неделя):', ubeats[(ubeats['original_start_date'] >= datetime(2019, 4, 1)) & (ubeats['original_start_date'] < datetime(2019, 4, 7)) & (ubeats['event_date'] < datetime(2019, 4, 15)) & (ubeats['event'].isin(trial_started_events))]['quantity'].sum())
print('Количество триалов в марте (первая неделя):', ubeats[(ubeats['original_start_date'] >= datetime(2019, 3, 1)) & (ubeats['original_start_date'] < datetime(2019, 3, 7)) & (ubeats['event_date'] < datetime(2019, 3, 15)) & (ubeats['event'].isin(trial_started_events))]['quantity'].sum())
Количество триалов в апреле (первая неделя): 605
Количество триалов в марте (первая неделя): 657
In [0]:
 

Распределение первой покупки по дням.

In [448]:
y = list(map(lambda x: x.days, ubeats[(ubeats['consecutive_paid_periods'] == 1) & (ubeats['event'].isin(payment_events))]['time_range']))

data = [go.Box(y=y)]
layout = go.Layout(title='')
fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig, filename='1')
In [449]:
print('8: ', len(list(filter(lambda x: x <= 8, y)))/ len(y))
print('5: ', len(list(filter(lambda x: x <= 5, y)))/ len(y))
print('3: ', len(list(filter(lambda x: x <= 3, y)))/ len(y))
8:  0.8185459400412671
5:  0.7666585750697901
3:  0.699296031071732

Первая покупка совершается на 0-ой день.

На первые 3 дня приходится 69% первых покупок.

На первые 5 дней приходится 76% первых покупок.

На первые 8 дней приходится 81% всех первых покупок, остальные совершаются в течении 67 дней.

In [0]:
 

Распределение количества покупок по периодам оплаты.

In [0]:
def get_points(df, start_date, end_date):
  group = df[(df['original_start_date'] >= start_date) & (df['original_start_date'] < end_date)]
  points = [[], []]
  
  for pay_period, data in group[(group['event'].isin(events))].groupby('consecutive_paid_periods'):
    points[0].append(pay_period)
    points[1].append(data['quantity'].sum())
  return points

def probability(points):
  result = [[], [], []]
  for i in range(1, len(points[0])):
    result[0].append(points[0][i])
    result[2].append(points[1][i])
    result[1].append(points[1][i] / points[1][i-1])
  return result

def hist(title, _x, _y):
  print(title)
  data = [go.Bar(x=_x, y=_y)]
  layout = go.Layout(title=title)
  fig = go.Figure(data=data, layout=layout)
  return iplot(fig, filename='1')
In [0]:
x = {}
y = {}
for name, group in df.groupby('subscription_name'):
  x[name] = []
  y[name] = []
  for pay_period, data in group[(group['event'].isin(payment_events))].groupby('consecutive_paid_periods'):
    x[name].append(pay_period)
    y[name].append(data['quantity'].sum())

Month subscription

за все время

In [452]:
configure_plotly_browser_state()
hist(subscription_names[0], x[subscription_names[0]], y[subscription_names[0]])
Month subscription

Аномалии в наблюдениях, покупок второго периода больше чем первого, горбы в наблюдениях. TODO: Найти причину

Month subscription new

за все время

In [453]:
configure_plotly_browser_state()
hist(subscription_names[1], x[subscription_names[1]], y[subscription_names[1]])
Month subscription new

Аномалии в наблюдениях, покупок второго периода больше чем первого. TODO: Найти причину

Month subscription with 7 days trial

за все время

In [454]:
configure_plotly_browser_state()
hist(subscription_names[2], x[subscription_names[2]], y[subscription_names[2]])
Month subscription with 7 days trial

Аномалии в наблюдениях, встречаются горбы. TODO: Найти причину

Week subscription with 3 days trial

за все время

In [455]:
configure_plotly_browser_state()
hist(subscription_names[3], x[subscription_names[3]], y[subscription_names[3]])
Week subscription with 3 days trial

Распределение количества покупок по периодам оплаты имеет вид $P(\lambda)$. TODO: определить $\lambda$

Week subscription with 3 days trial by 0.99

за все время

In [456]:
configure_plotly_browser_state()
hist(subscription_names[4], x[subscription_names[4]], y[subscription_names[4]])
Week subscription with 3 days trial by 0.99

Аномалии в наблюдениях, покупок второго периода больше чем первого, горбы в наблюдениях. TODO: Найти причину

Week subscription with 3 days trial by 3.99

за все время

In [457]:
configure_plotly_browser_state()
hist(subscription_names[5], x[subscription_names[5]], y[subscription_names[5]])
Week subscription with 3 days trial by 3.99

Аномалии в наблюдениях (горбы). TODO: Найти причину

Week subscription with 7 days trial

за все время

In [458]:
configure_plotly_browser_state()
hist(subscription_names[6], x[subscription_names[6]], y[subscription_names[6]])
Week subscription with 7 days trial

Распределение количества покупок по периодам оплаты имеет вид $P(\lambda)$. TODO: определить $\lambda$

In [0]:
 

Week with 3 days trial by 2.99

за все время

In [459]:
configure_plotly_browser_state()
hist(subscription_names[8], x[subscription_names[8]], y[subscription_names[8]])
Week with 3 days trial by 2.99

Распределение количества покупок по периодам оплаты имеет вид $P(\lambda)$. TODO: определить $\lambda$

Weekly subscription with 3-day trial

за все время

In [460]:
configure_plotly_browser_state()
hist(subscription_names[9], x[subscription_names[9]], y[subscription_names[9]])
Weekly subscription with 3-day trial

Распределение количества покупок по периодам оплаты имеет вид $P(\lambda)$. TODO: определить $\lambda$

Weekly subscription with 3-day trial by 8.99

за все время

In [461]:
configure_plotly_browser_state()
hist(subscription_names[10], x[subscription_names[10]], y[subscription_names[10]])
Weekly subscription with 3-day trial by 8.99

Распределение количества покупок по периодам оплаты имеет вид $P(\lambda)$. TODO: определить $\lambda$

Year subscription

за все время

In [462]:
configure_plotly_browser_state()
hist(subscription_names[11], x[subscription_names[11]], y[subscription_names[11]])
Year subscription

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

Возможно, пользователь сменил тип потписки.

TODO: Проверить original_start_date на 2ой оплате.

In [0]:
 

Year subscription new

за все время

In [463]:
configure_plotly_browser_state()
hist(subscription_names[12], x[subscription_names[12]], y[subscription_names[12]])
Year subscription new

нельзя сделать какие-либо выводы

на 24.04.19 подписок = 29

Анализ стран.

Количество триалов по странам

за все время

In [464]:
def points_comparator(x):
  return -x[1]

group = ubeats[ubeats['event'].isin(trial_started_events)]

start_introductory_price_points = list(map(lambda x: [x[0], x[1]['quantity'].sum()], group.groupby('country')))
start_introductory_price_points = sorted(start_introductory_price_points, key=points_comparator)

trace = go.Pie(labels=list(map(lambda x: x[0], start_introductory_price_points)), values=list(map(lambda x: x[1], start_introductory_price_points)))

configure_plotly_browser_state()
iplot([trace])

На диаграмме представлено соотношение стран по количеству триалов.

Из диаграммы можем сделать вывод откуда приходит большая часть трафика.

In [0]:
 

Количество платящих пользователей по странам

за все время

In [465]:
group = ubeats[(ubeats['consecutive_paid_periods'] == 1) & (ubeats['event'].isin(payment_events))]

points = list(map(lambda x: [x[0], x[1]['quantity'].sum()], group.groupby('country')))
points = sorted(points, key=points_comparator)

trace = go.Pie(labels=list(map(lambda x: x[0], points)), values=list(map(lambda x: x[1], points)))

configure_plotly_browser_state()
iplot([trace])

На диаграмме представлено соотношение стран по количеству платящих пользователей.

По диаграмме можем сказать в каких странах находится большая часть платящих пользователей.

Конверсии по странам

график конверсии по неделям (для стран).

график построен для стран, в которых не менее 100 триалов за рассматриваемое время.

с 01.01.19 по 01.05.19

In [0]:
def get_convert_by_week(df, start_date, week_count):
  data = []
  for i in range(week_count):
    trials = df[(df['original_start_date'] >= start_date + timedelta(7*i)) & (df['original_start_date'] < start_date + timedelta( 7*(i+1) )) & (df['event'].isin(trial_started_events))]['quantity'].sum()
    payments = df[(df['original_start_date'] >= start_date + timedelta(7*i)) & (df['original_start_date'] < start_date + timedelta( 7*(i+1) )) & (df['consecutive_paid_periods'] == 1) ]['quantity'].sum()
    
    if trials == 0:
      data.append([0, start_date + timedelta(7*i)])
    if trials > 0:
      data.append([payments / trials, start_date + timedelta(7*i)])
  return data

def show_bar(df, start_date, week_count):
 
  data = []
  
  for name, group in df.groupby('country'):
    trials = group[(ubeats['event'].isin(trial_started_events))]['quantity'].sum()
    if  trials > 100:
      points = get_convert_by_week(group, start_date, week_count)
      data.append(go.Scatter(x = list(map(lambda x: x[1], points)) , y = list(map(lambda x: x[0], points)), name=name, visible='legendonly'))

  fig = go.Figure(data=data)
  configure_plotly_browser_state()
  iplot(fig)
In [467]:
show_bar(ubeats[(ubeats['original_start_date'] >= datetime(2019, 1, 1)) & (ubeats['original_start_date'] < datetime(2019, 5, 1))], datetime(2019, 2, 10), 12)
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:18: UserWarning:

Boolean Series key will be reindexed to match DataFrame index.

График построен по данным с 01.01.19 по 01.05.19

Из графика видно, как менялась конверсия по странам в течении времени.

По графику можем сравнить конверсию между странами.

По умолчанию графики спрятаны. Нажмите на страну, чтобы открыть/скрыть график.

Billing Retry

In [0]:
 

All billing retry events

для стран, в которых > 100 триалов

In [0]:
def get_data(df):
  d = {}
  for name, group in df.groupby('country'):
    billing_retry = group[group['event'].isin(billing_retry_events)]['quantity'].sum()
    trials = group[group['event'].isin(trial_started_events)]['quantity'].sum()

    if trials > 100:
      d[name] = billing_retry / trials
  return d
In [469]:
d = get_data(ubeats)
d = sorted(d.items(), key=operator.itemgetter(1), reverse=True)

trace1 = go.Bar(
    x=list(map(lambda x: x[0], d)),
    y=list(map(lambda x: x[1], d)),
    name='with refund'
)

data = [trace1]
layout = go.Layout(
    barmode='group'
)

fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig)

Billing Retry from Introductory Offer & Billing Retry from Introductory Price events

Billing Retry from Introductory Offer & Billing Retry from Introductory Price к количеству триалов

Для стран > 100 триалов

In [0]:
def get_data(df):
  events = [
    'Billing Retry from Introductory Offer',
    'Billing Retry from Introductory Price',
  ]
  d = {}
  for name, group in df.groupby('country'):
    billing_retry = group[group['event'].isin(events)]['quantity'].sum()
    trials = group[group['event'].isin(trial_started_events)]['quantity'].sum()

    if trials > 100:
      d[name] = billing_retry / trials
  return d
In [471]:
d = get_data(ubeats)
d = sorted(d.items(), key=operator.itemgetter(1), reverse=True)

trace1 = go.Bar(
    x=list(map(lambda x: x[0], d)),
    y=list(map(lambda x: x[1], d)),
    name='with refund'
)

data = [trace1]
layout = go.Layout(
    barmode='group'
)

fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig)
In [0]:
 

Billing Retry from Paid Subscription events

Отношение Billing Retry from Paid Subscription к количеству платящих пользователей.

Для стран, в которых > 30 платящих пользователей.

In [0]:
def get_billing_retry_from_paid_subscription_data(df):
  events = [
    'Billing Retry from Paid Subscription',
  ]
  d = {}
  for name, group in df.groupby('country'):
    billing_retry = group[group['event'].isin(events)]['quantity'].sum()
    payments = group[(group['event'].isin(payment_events)) & (group['consecutive_paid_periods'] == 1)]['quantity'].sum()

    if payments > 30:
      d[name] = billing_retry / payments
  return d
In [473]:
d = get_billing_retry_from_paid_subscription_data(ubeats)
d = sorted(d.items(), key=operator.itemgetter(1), reverse=True)

trace1 = go.Bar(
    x=list(map(lambda x: x[0], d)),
    y=list(map(lambda x: x[1], d)),
    name='with refund'
)

data = [trace1]
layout = go.Layout(
    barmode='group'
)

fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig)

Уход в Billing Retry по дням (all events)

Oy - количество ивентов.

Ox - дата, в которою произошел ивент.

In [0]:
def getEventsByDay(df, day, events):
  return df[(df['event'].isin(events)) & (df['event_date'] == day)]['quantity'].sum()

def show_plot(df, start_date, end_date, events):
  data = [[],[]]
  current_date = start_date
  while current_date < end_date:
    data[0].append(current_date)
    data[1].append(getEventsByDay(df, current_date, events))
    current_date += timedelta(1)
    
  print(data)
  fig = go.Figure(data=[go.Scatter(x = data[0], y = data[1])], layout=layout)

  configure_plotly_browser_state()
  iplot(fig)
In [475]:
show_plot(ubeats, datetime(2018, 3, 1), datetime.today(), billing_retry_events)
[[datetime.datetime(2018, 3, 1, 0, 0), datetime.datetime(2018, 3, 2, 0, 0), datetime.datetime(2018, 3, 3, 0, 0), datetime.datetime(2018, 3, 4, 0, 0), datetime.datetime(2018, 3, 5, 0, 0), datetime.datetime(2018, 3, 6, 0, 0), datetime.datetime(2018, 3, 7, 0, 0), datetime.datetime(2018, 3, 8, 0, 0), datetime.datetime(2018, 3, 9, 0, 0), datetime.datetime(2018, 3, 10, 0, 0), datetime.datetime(2018, 3, 11, 0, 0), datetime.datetime(2018, 3, 12, 0, 0), datetime.datetime(2018, 3, 13, 0, 0), datetime.datetime(2018, 3, 14, 0, 0), datetime.datetime(2018, 3, 15, 0, 0), datetime.datetime(2018, 3, 16, 0, 0), datetime.datetime(2018, 3, 17, 0, 0), datetime.datetime(2018, 3, 18, 0, 0), datetime.datetime(2018, 3, 19, 0, 0), datetime.datetime(2018, 3, 20, 0, 0), datetime.datetime(2018, 3, 21, 0, 0), datetime.datetime(2018, 3, 22, 0, 0), datetime.datetime(2018, 3, 23, 0, 0), datetime.datetime(2018, 3, 24, 0, 0), datetime.datetime(2018, 3, 25, 0, 0), datetime.datetime(2018, 3, 26, 0, 0), datetime.datetime(2018, 3, 27, 0, 0), datetime.datetime(2018, 3, 28, 0, 0), datetime.datetime(2018, 3, 29, 0, 0), datetime.datetime(2018, 3, 30, 0, 0), datetime.datetime(2018, 3, 31, 0, 0), datetime.datetime(2018, 4, 1, 0, 0), datetime.datetime(2018, 4, 2, 0, 0), datetime.datetime(2018, 4, 3, 0, 0), datetime.datetime(2018, 4, 4, 0, 0), datetime.datetime(2018, 4, 5, 0, 0), datetime.datetime(2018, 4, 6, 0, 0), datetime.datetime(2018, 4, 7, 0, 0), datetime.datetime(2018, 4, 8, 0, 0), datetime.datetime(2018, 4, 9, 0, 0), datetime.datetime(2018, 4, 10, 0, 0), datetime.datetime(2018, 4, 11, 0, 0), datetime.datetime(2018, 4, 12, 0, 0), datetime.datetime(2018, 4, 13, 0, 0), datetime.datetime(2018, 4, 14, 0, 0), datetime.datetime(2018, 4, 15, 0, 0), datetime.datetime(2018, 4, 16, 0, 0), datetime.datetime(2018, 4, 17, 0, 0), datetime.datetime(2018, 4, 18, 0, 0), datetime.datetime(2018, 4, 19, 0, 0), datetime.datetime(2018, 4, 20, 0, 0), datetime.datetime(2018, 4, 21, 0, 0), datetime.datetime(2018, 4, 22, 0, 0), datetime.datetime(2018, 4, 23, 0, 0), datetime.datetime(2018, 4, 24, 0, 0), datetime.datetime(2018, 4, 25, 0, 0), datetime.datetime(2018, 4, 26, 0, 0), datetime.datetime(2018, 4, 27, 0, 0), datetime.datetime(2018, 4, 28, 0, 0), datetime.datetime(2018, 4, 29, 0, 0), datetime.datetime(2018, 4, 30, 0, 0), datetime.datetime(2018, 5, 1, 0, 0), datetime.datetime(2018, 5, 2, 0, 0), datetime.datetime(2018, 5, 3, 0, 0), datetime.datetime(2018, 5, 4, 0, 0), datetime.datetime(2018, 5, 5, 0, 0), datetime.datetime(2018, 5, 6, 0, 0), datetime.datetime(2018, 5, 7, 0, 0), datetime.datetime(2018, 5, 8, 0, 0), datetime.datetime(2018, 5, 9, 0, 0), datetime.datetime(2018, 5, 10, 0, 0), datetime.datetime(2018, 5, 11, 0, 0), datetime.datetime(2018, 5, 12, 0, 0), datetime.datetime(2018, 5, 13, 0, 0), datetime.datetime(2018, 5, 14, 0, 0), datetime.datetime(2018, 5, 15, 0, 0), datetime.datetime(2018, 5, 16, 0, 0), datetime.datetime(2018, 5, 17, 0, 0), datetime.datetime(2018, 5, 18, 0, 0), datetime.datetime(2018, 5, 19, 0, 0), datetime.datetime(2018, 5, 20, 0, 0), datetime.datetime(2018, 5, 21, 0, 0), datetime.datetime(2018, 5, 22, 0, 0), datetime.datetime(2018, 5, 23, 0, 0), datetime.datetime(2018, 5, 24, 0, 0), datetime.datetime(2018, 5, 25, 0, 0), datetime.datetime(2018, 5, 26, 0, 0), datetime.datetime(2018, 5, 27, 0, 0), datetime.datetime(2018, 5, 28, 0, 0), datetime.datetime(2018, 5, 29, 0, 0), datetime.datetime(2018, 5, 30, 0, 0), datetime.datetime(2018, 5, 31, 0, 0), datetime.datetime(2018, 6, 1, 0, 0), datetime.datetime(2018, 6, 2, 0, 0), datetime.datetime(2018, 6, 3, 0, 0), datetime.datetime(2018, 6, 4, 0, 0), datetime.datetime(2018, 6, 5, 0, 0), datetime.datetime(2018, 6, 6, 0, 0), datetime.datetime(2018, 6, 7, 0, 0), datetime.datetime(2018, 6, 8, 0, 0), datetime.datetime(2018, 6, 9, 0, 0), datetime.datetime(2018, 6, 10, 0, 0), datetime.datetime(2018, 6, 11, 0, 0), datetime.datetime(2018, 6, 12, 0, 0), datetime.datetime(2018, 6, 13, 0, 0), datetime.datetime(2018, 6, 14, 0, 0), datetime.datetime(2018, 6, 15, 0, 0), datetime.datetime(2018, 6, 16, 0, 0), datetime.datetime(2018, 6, 17, 0, 0), datetime.datetime(2018, 6, 18, 0, 0), datetime.datetime(2018, 6, 19, 0, 0), datetime.datetime(2018, 6, 20, 0, 0), datetime.datetime(2018, 6, 21, 0, 0), datetime.datetime(2018, 6, 22, 0, 0), datetime.datetime(2018, 6, 23, 0, 0), datetime.datetime(2018, 6, 24, 0, 0), datetime.datetime(2018, 6, 25, 0, 0), datetime.datetime(2018, 6, 26, 0, 0), datetime.datetime(2018, 6, 27, 0, 0), datetime.datetime(2018, 6, 28, 0, 0), datetime.datetime(2018, 6, 29, 0, 0), datetime.datetime(2018, 6, 30, 0, 0), datetime.datetime(2018, 7, 1, 0, 0), datetime.datetime(2018, 7, 2, 0, 0), datetime.datetime(2018, 7, 3, 0, 0), datetime.datetime(2018, 7, 4, 0, 0), datetime.datetime(2018, 7, 5, 0, 0), datetime.datetime(2018, 7, 6, 0, 0), datetime.datetime(2018, 7, 7, 0, 0), datetime.datetime(2018, 7, 8, 0, 0), datetime.datetime(2018, 7, 9, 0, 0), datetime.datetime(2018, 7, 10, 0, 0), datetime.datetime(2018, 7, 11, 0, 0), datetime.datetime(2018, 7, 12, 0, 0), datetime.datetime(2018, 7, 13, 0, 0), datetime.datetime(2018, 7, 14, 0, 0), datetime.datetime(2018, 7, 15, 0, 0), datetime.datetime(2018, 7, 16, 0, 0), datetime.datetime(2018, 7, 17, 0, 0), datetime.datetime(2018, 7, 18, 0, 0), datetime.datetime(2018, 7, 19, 0, 0), datetime.datetime(2018, 7, 20, 0, 0), datetime.datetime(2018, 7, 21, 0, 0), datetime.datetime(2018, 7, 22, 0, 0), datetime.datetime(2018, 7, 23, 0, 0), datetime.datetime(2018, 7, 24, 0, 0), datetime.datetime(2018, 7, 25, 0, 0), datetime.datetime(2018, 7, 26, 0, 0), datetime.datetime(2018, 7, 27, 0, 0), datetime.datetime(2018, 7, 28, 0, 0), datetime.datetime(2018, 7, 29, 0, 0), datetime.datetime(2018, 7, 30, 0, 0), datetime.datetime(2018, 7, 31, 0, 0), datetime.datetime(2018, 8, 1, 0, 0), datetime.datetime(2018, 8, 2, 0, 0), datetime.datetime(2018, 8, 3, 0, 0), datetime.datetime(2018, 8, 4, 0, 0), datetime.datetime(2018, 8, 5, 0, 0), datetime.datetime(2018, 8, 6, 0, 0), datetime.datetime(2018, 8, 7, 0, 0), datetime.datetime(2018, 8, 8, 0, 0), datetime.datetime(2018, 8, 9, 0, 0), datetime.datetime(2018, 8, 10, 0, 0), datetime.datetime(2018, 8, 11, 0, 0), datetime.datetime(2018, 8, 12, 0, 0), datetime.datetime(2018, 8, 13, 0, 0), datetime.datetime(2018, 8, 14, 0, 0), datetime.datetime(2018, 8, 15, 0, 0), datetime.datetime(2018, 8, 16, 0, 0), datetime.datetime(2018, 8, 17, 0, 0), datetime.datetime(2018, 8, 18, 0, 0), datetime.datetime(2018, 8, 19, 0, 0), datetime.datetime(2018, 8, 20, 0, 0), datetime.datetime(2018, 8, 21, 0, 0), datetime.datetime(2018, 8, 22, 0, 0), datetime.datetime(2018, 8, 23, 0, 0), datetime.datetime(2018, 8, 24, 0, 0), datetime.datetime(2018, 8, 25, 0, 0), datetime.datetime(2018, 8, 26, 0, 0), datetime.datetime(2018, 8, 27, 0, 0), datetime.datetime(2018, 8, 28, 0, 0), datetime.datetime(2018, 8, 29, 0, 0), datetime.datetime(2018, 8, 30, 0, 0), datetime.datetime(2018, 8, 31, 0, 0), datetime.datetime(2018, 9, 1, 0, 0), datetime.datetime(2018, 9, 2, 0, 0), datetime.datetime(2018, 9, 3, 0, 0), datetime.datetime(2018, 9, 4, 0, 0), datetime.datetime(2018, 9, 5, 0, 0), datetime.datetime(2018, 9, 6, 0, 0), datetime.datetime(2018, 9, 7, 0, 0), datetime.datetime(2018, 9, 8, 0, 0), datetime.datetime(2018, 9, 9, 0, 0), datetime.datetime(2018, 9, 10, 0, 0), datetime.datetime(2018, 9, 11, 0, 0), datetime.datetime(2018, 9, 12, 0, 0), datetime.datetime(2018, 9, 13, 0, 0), datetime.datetime(2018, 9, 14, 0, 0), datetime.datetime(2018, 9, 15, 0, 0), datetime.datetime(2018, 9, 16, 0, 0), datetime.datetime(2018, 9, 17, 0, 0), datetime.datetime(2018, 9, 18, 0, 0), datetime.datetime(2018, 9, 19, 0, 0), datetime.datetime(2018, 9, 20, 0, 0), datetime.datetime(2018, 9, 21, 0, 0), datetime.datetime(2018, 9, 22, 0, 0), datetime.datetime(2018, 9, 23, 0, 0), datetime.datetime(2018, 9, 24, 0, 0), datetime.datetime(2018, 9, 25, 0, 0), datetime.datetime(2018, 9, 26, 0, 0), datetime.datetime(2018, 9, 27, 0, 0), datetime.datetime(2018, 9, 28, 0, 0), datetime.datetime(2018, 9, 29, 0, 0), datetime.datetime(2018, 9, 30, 0, 0), datetime.datetime(2018, 10, 1, 0, 0), datetime.datetime(2018, 10, 2, 0, 0), datetime.datetime(2018, 10, 3, 0, 0), datetime.datetime(2018, 10, 4, 0, 0), datetime.datetime(2018, 10, 5, 0, 0), datetime.datetime(2018, 10, 6, 0, 0), datetime.datetime(2018, 10, 7, 0, 0), datetime.datetime(2018, 10, 8, 0, 0), datetime.datetime(2018, 10, 9, 0, 0), datetime.datetime(2018, 10, 10, 0, 0), datetime.datetime(2018, 10, 11, 0, 0), datetime.datetime(2018, 10, 12, 0, 0), datetime.datetime(2018, 10, 13, 0, 0), datetime.datetime(2018, 10, 14, 0, 0), datetime.datetime(2018, 10, 15, 0, 0), datetime.datetime(2018, 10, 16, 0, 0), datetime.datetime(2018, 10, 17, 0, 0), datetime.datetime(2018, 10, 18, 0, 0), datetime.datetime(2018, 10, 19, 0, 0), datetime.datetime(2018, 10, 20, 0, 0), datetime.datetime(2018, 10, 21, 0, 0), datetime.datetime(2018, 10, 22, 0, 0), datetime.datetime(2018, 10, 23, 0, 0), datetime.datetime(2018, 10, 24, 0, 0), datetime.datetime(2018, 10, 25, 0, 0), datetime.datetime(2018, 10, 26, 0, 0), datetime.datetime(2018, 10, 27, 0, 0), datetime.datetime(2018, 10, 28, 0, 0), datetime.datetime(2018, 10, 29, 0, 0), datetime.datetime(2018, 10, 30, 0, 0), datetime.datetime(2018, 10, 31, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 11, 2, 0, 0), datetime.datetime(2018, 11, 3, 0, 0), datetime.datetime(2018, 11, 4, 0, 0), datetime.datetime(2018, 11, 5, 0, 0), datetime.datetime(2018, 11, 6, 0, 0), datetime.datetime(2018, 11, 7, 0, 0), datetime.datetime(2018, 11, 8, 0, 0), datetime.datetime(2018, 11, 9, 0, 0), datetime.datetime(2018, 11, 10, 0, 0), datetime.datetime(2018, 11, 11, 0, 0), datetime.datetime(2018, 11, 12, 0, 0), datetime.datetime(2018, 11, 13, 0, 0), datetime.datetime(2018, 11, 14, 0, 0), datetime.datetime(2018, 11, 15, 0, 0), datetime.datetime(2018, 11, 16, 0, 0), datetime.datetime(2018, 11, 17, 0, 0), datetime.datetime(2018, 11, 18, 0, 0), datetime.datetime(2018, 11, 19, 0, 0), datetime.datetime(2018, 11, 20, 0, 0), datetime.datetime(2018, 11, 21, 0, 0), datetime.datetime(2018, 11, 22, 0, 0), datetime.datetime(2018, 11, 23, 0, 0), datetime.datetime(2018, 11, 24, 0, 0), datetime.datetime(2018, 11, 25, 0, 0), datetime.datetime(2018, 11, 26, 0, 0), datetime.datetime(2018, 11, 27, 0, 0), datetime.datetime(2018, 11, 28, 0, 0), datetime.datetime(2018, 11, 29, 0, 0), datetime.datetime(2018, 11, 30, 0, 0), datetime.datetime(2018, 12, 1, 0, 0), datetime.datetime(2018, 12, 2, 0, 0), datetime.datetime(2018, 12, 3, 0, 0), datetime.datetime(2018, 12, 4, 0, 0), datetime.datetime(2018, 12, 5, 0, 0), datetime.datetime(2018, 12, 6, 0, 0), datetime.datetime(2018, 12, 7, 0, 0), datetime.datetime(2018, 12, 8, 0, 0), datetime.datetime(2018, 12, 9, 0, 0), datetime.datetime(2018, 12, 10, 0, 0), datetime.datetime(2018, 12, 11, 0, 0), datetime.datetime(2018, 12, 12, 0, 0), datetime.datetime(2018, 12, 13, 0, 0), datetime.datetime(2018, 12, 14, 0, 0), datetime.datetime(2018, 12, 15, 0, 0), datetime.datetime(2018, 12, 16, 0, 0), datetime.datetime(2018, 12, 17, 0, 0), datetime.datetime(2018, 12, 18, 0, 0), datetime.datetime(2018, 12, 19, 0, 0), datetime.datetime(2018, 12, 20, 0, 0), datetime.datetime(2018, 12, 21, 0, 0), datetime.datetime(2018, 12, 22, 0, 0), datetime.datetime(2018, 12, 23, 0, 0), datetime.datetime(2018, 12, 24, 0, 0), datetime.datetime(2018, 12, 25, 0, 0), datetime.datetime(2018, 12, 26, 0, 0), datetime.datetime(2018, 12, 27, 0, 0), datetime.datetime(2018, 12, 28, 0, 0), datetime.datetime(2018, 12, 29, 0, 0), datetime.datetime(2018, 12, 30, 0, 0), datetime.datetime(2018, 12, 31, 0, 0), datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 1, 2, 0, 0), datetime.datetime(2019, 1, 3, 0, 0), datetime.datetime(2019, 1, 4, 0, 0), datetime.datetime(2019, 1, 5, 0, 0), datetime.datetime(2019, 1, 6, 0, 0), datetime.datetime(2019, 1, 7, 0, 0), datetime.datetime(2019, 1, 8, 0, 0), datetime.datetime(2019, 1, 9, 0, 0), datetime.datetime(2019, 1, 10, 0, 0), datetime.datetime(2019, 1, 11, 0, 0), datetime.datetime(2019, 1, 12, 0, 0), datetime.datetime(2019, 1, 13, 0, 0), datetime.datetime(2019, 1, 14, 0, 0), datetime.datetime(2019, 1, 15, 0, 0), datetime.datetime(2019, 1, 16, 0, 0), datetime.datetime(2019, 1, 17, 0, 0), datetime.datetime(2019, 1, 18, 0, 0), datetime.datetime(2019, 1, 19, 0, 0), datetime.datetime(2019, 1, 20, 0, 0), datetime.datetime(2019, 1, 21, 0, 0), datetime.datetime(2019, 1, 22, 0, 0), datetime.datetime(2019, 1, 23, 0, 0), datetime.datetime(2019, 1, 24, 0, 0), datetime.datetime(2019, 1, 25, 0, 0), datetime.datetime(2019, 1, 26, 0, 0), datetime.datetime(2019, 1, 27, 0, 0), datetime.datetime(2019, 1, 28, 0, 0), datetime.datetime(2019, 1, 29, 0, 0), datetime.datetime(2019, 1, 30, 0, 0), datetime.datetime(2019, 1, 31, 0, 0), datetime.datetime(2019, 2, 1, 0, 0), datetime.datetime(2019, 2, 2, 0, 0), datetime.datetime(2019, 2, 3, 0, 0), datetime.datetime(2019, 2, 4, 0, 0), datetime.datetime(2019, 2, 5, 0, 0), datetime.datetime(2019, 2, 6, 0, 0), datetime.datetime(2019, 2, 7, 0, 0), datetime.datetime(2019, 2, 8, 0, 0), datetime.datetime(2019, 2, 9, 0, 0), datetime.datetime(2019, 2, 10, 0, 0), datetime.datetime(2019, 2, 11, 0, 0), datetime.datetime(2019, 2, 12, 0, 0), datetime.datetime(2019, 2, 13, 0, 0), datetime.datetime(2019, 2, 14, 0, 0), datetime.datetime(2019, 2, 15, 0, 0), datetime.datetime(2019, 2, 16, 0, 0), datetime.datetime(2019, 2, 17, 0, 0), datetime.datetime(2019, 2, 18, 0, 0), datetime.datetime(2019, 2, 19, 0, 0), datetime.datetime(2019, 2, 20, 0, 0), datetime.datetime(2019, 2, 21, 0, 0), datetime.datetime(2019, 2, 22, 0, 0), datetime.datetime(2019, 2, 23, 0, 0), datetime.datetime(2019, 2, 24, 0, 0), datetime.datetime(2019, 2, 25, 0, 0), datetime.datetime(2019, 2, 26, 0, 0), datetime.datetime(2019, 2, 27, 0, 0), datetime.datetime(2019, 2, 28, 0, 0), datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 3, 2, 0, 0), datetime.datetime(2019, 3, 3, 0, 0), datetime.datetime(2019, 3, 4, 0, 0), datetime.datetime(2019, 3, 5, 0, 0), datetime.datetime(2019, 3, 6, 0, 0), datetime.datetime(2019, 3, 7, 0, 0), datetime.datetime(2019, 3, 8, 0, 0), datetime.datetime(2019, 3, 9, 0, 0), datetime.datetime(2019, 3, 10, 0, 0), datetime.datetime(2019, 3, 11, 0, 0), datetime.datetime(2019, 3, 12, 0, 0), datetime.datetime(2019, 3, 13, 0, 0), datetime.datetime(2019, 3, 14, 0, 0), datetime.datetime(2019, 3, 15, 0, 0), datetime.datetime(2019, 3, 16, 0, 0), datetime.datetime(2019, 3, 17, 0, 0), datetime.datetime(2019, 3, 18, 0, 0), datetime.datetime(2019, 3, 19, 0, 0), datetime.datetime(2019, 3, 20, 0, 0), datetime.datetime(2019, 3, 21, 0, 0), datetime.datetime(2019, 3, 22, 0, 0), datetime.datetime(2019, 3, 23, 0, 0), datetime.datetime(2019, 3, 24, 0, 0), datetime.datetime(2019, 3, 25, 0, 0), datetime.datetime(2019, 3, 26, 0, 0), datetime.datetime(2019, 3, 27, 0, 0), datetime.datetime(2019, 3, 28, 0, 0), datetime.datetime(2019, 3, 29, 0, 0), datetime.datetime(2019, 3, 30, 0, 0), datetime.datetime(2019, 3, 31, 0, 0), datetime.datetime(2019, 4, 1, 0, 0), datetime.datetime(2019, 4, 2, 0, 0), datetime.datetime(2019, 4, 3, 0, 0), datetime.datetime(2019, 4, 4, 0, 0), datetime.datetime(2019, 4, 5, 0, 0), datetime.datetime(2019, 4, 6, 0, 0), datetime.datetime(2019, 4, 7, 0, 0), datetime.datetime(2019, 4, 8, 0, 0), datetime.datetime(2019, 4, 9, 0, 0), datetime.datetime(2019, 4, 10, 0, 0), datetime.datetime(2019, 4, 11, 0, 0), datetime.datetime(2019, 4, 12, 0, 0), datetime.datetime(2019, 4, 13, 0, 0), datetime.datetime(2019, 4, 14, 0, 0), datetime.datetime(2019, 4, 15, 0, 0), datetime.datetime(2019, 4, 16, 0, 0), datetime.datetime(2019, 4, 17, 0, 0), datetime.datetime(2019, 4, 18, 0, 0), datetime.datetime(2019, 4, 19, 0, 0), datetime.datetime(2019, 4, 20, 0, 0), datetime.datetime(2019, 4, 21, 0, 0), datetime.datetime(2019, 4, 22, 0, 0), datetime.datetime(2019, 4, 23, 0, 0), datetime.datetime(2019, 4, 24, 0, 0), datetime.datetime(2019, 4, 25, 0, 0), datetime.datetime(2019, 4, 26, 0, 0), datetime.datetime(2019, 4, 27, 0, 0), datetime.datetime(2019, 4, 28, 0, 0), datetime.datetime(2019, 4, 29, 0, 0), datetime.datetime(2019, 4, 30, 0, 0), datetime.datetime(2019, 5, 1, 0, 0), datetime.datetime(2019, 5, 2, 0, 0), datetime.datetime(2019, 5, 3, 0, 0), datetime.datetime(2019, 5, 4, 0, 0), datetime.datetime(2019, 5, 5, 0, 0), datetime.datetime(2019, 5, 6, 0, 0), datetime.datetime(2019, 5, 7, 0, 0), datetime.datetime(2019, 5, 8, 0, 0), datetime.datetime(2019, 5, 9, 0, 0), datetime.datetime(2019, 5, 10, 0, 0), datetime.datetime(2019, 5, 11, 0, 0), datetime.datetime(2019, 5, 12, 0, 0), datetime.datetime(2019, 5, 13, 0, 0)], [0, 0, 0, 0, 0, 0, 0, 0, Decimal('8'), Decimal('17'), Decimal('21'), Decimal('14'), Decimal('17'), Decimal('22'), Decimal('27'), Decimal('15'), Decimal('18'), Decimal('19'), Decimal('18'), Decimal('15'), Decimal('24'), Decimal('22'), Decimal('27'), Decimal('16'), Decimal('18'), Decimal('17'), Decimal('20'), Decimal('34'), Decimal('30'), Decimal('22'), Decimal('23'), Decimal('23'), Decimal('22'), Decimal('32'), Decimal('28'), Decimal('33'), Decimal('24'), Decimal('34'), Decimal('22'), Decimal('19'), Decimal('21'), Decimal('30'), Decimal('33'), Decimal('19'), Decimal('35'), Decimal('60'), Decimal('49'), Decimal('58'), Decimal('88'), Decimal('91'), Decimal('76'), Decimal('64'), Decimal('79'), Decimal('62'), Decimal('71'), Decimal('95'), Decimal('69'), Decimal('48'), Decimal('34'), Decimal('35'), Decimal('26'), Decimal('45'), Decimal('44'), Decimal('69'), Decimal('41'), Decimal('30'), Decimal('24'), Decimal('29'), Decimal('33'), Decimal('41'), Decimal('56'), Decimal('31'), Decimal('28'), Decimal('38'), Decimal('22'), Decimal('31'), Decimal('40'), Decimal('48'), Decimal('43'), Decimal('30'), Decimal('25'), Decimal('56'), Decimal('68'), Decimal('67'), Decimal('73'), Decimal('64'), Decimal('57'), Decimal('56'), Decimal('52'), Decimal('53'), Decimal('47'), Decimal('71'), Decimal('54'), Decimal('44'), Decimal('35'), Decimal('57'), Decimal('76'), Decimal('85'), Decimal('83'), Decimal('68'), Decimal('59'), Decimal('48'), Decimal('74'), Decimal('44'), Decimal('38'), Decimal('71'), Decimal('62'), Decimal('46'), Decimal('48'), Decimal('51'), Decimal('45'), Decimal('51'), Decimal('70'), Decimal('66'), Decimal('61'), Decimal('51'), Decimal('42'), Decimal('56'), Decimal('64'), Decimal('84'), Decimal('68'), Decimal('32'), Decimal('65'), Decimal('45'), Decimal('42'), Decimal('61'), Decimal('80'), Decimal('73'), Decimal('43'), Decimal('42'), Decimal('40'), Decimal('45'), Decimal('58'), Decimal('89'), Decimal('55'), Decimal('47'), Decimal('38'), Decimal('44'), Decimal('58'), Decimal('50'), Decimal('89'), Decimal('66'), Decimal('68'), Decimal('51'), Decimal('56'), Decimal('77'), Decimal('81'), Decimal('95'), Decimal('93'), Decimal('64'), Decimal('60'), Decimal('46'), Decimal('58'), Decimal('68'), Decimal('88'), Decimal('79'), Decimal('68'), Decimal('57'), Decimal('62'), Decimal('65'), Decimal('86'), Decimal('115'), Decimal('85'), Decimal('65'), Decimal('94'), Decimal('86'), Decimal('66'), Decimal('76'), Decimal('139'), Decimal('96'), Decimal('74'), Decimal('61'), Decimal('48'), Decimal('83'), Decimal('93'), Decimal('85'), Decimal('103'), Decimal('63'), Decimal('65'), Decimal('56'), Decimal('84'), Decimal('98'), Decimal('103'), Decimal('79'), Decimal('70'), Decimal('89'), Decimal('109'), Decimal('123'), Decimal('129'), Decimal('133'), Decimal('112'), Decimal('90'), Decimal('91'), Decimal('95'), Decimal('132'), Decimal('140'), Decimal('166'), Decimal('121'), Decimal('74'), Decimal('78'), Decimal('73'), Decimal('101'), Decimal('97'), Decimal('145'), Decimal('108'), Decimal('99'), Decimal('77'), Decimal('107'), Decimal('92'), Decimal('93'), Decimal('163'), Decimal('131'), Decimal('98'), Decimal('118'), Decimal('93'), Decimal('90'), Decimal('101'), Decimal('147'), Decimal('136'), Decimal('116'), Decimal('113'), Decimal('111'), Decimal('108'), Decimal('101'), Decimal('192'), Decimal('147'), Decimal('149'), Decimal('114'), Decimal('126'), Decimal('125'), Decimal('135'), Decimal('201'), Decimal('154'), Decimal('114'), Decimal('116'), Decimal('108'), Decimal('108'), Decimal('99'), Decimal('198'), Decimal('135'), Decimal('97'), Decimal('103'), Decimal('105'), Decimal('86'), Decimal('89'), Decimal('180'), Decimal('106'), Decimal('109'), Decimal('82'), Decimal('81'), Decimal('111'), Decimal('120'), Decimal('159'), Decimal('134'), Decimal('96'), Decimal('108'), Decimal('75'), Decimal('94'), Decimal('101'), Decimal('145'), Decimal('113'), Decimal('86'), Decimal('91'), Decimal('93'), Decimal('85'), Decimal('118'), Decimal('137'), Decimal('133'), Decimal('107'), Decimal('95'), Decimal('85'), Decimal('104'), Decimal('88'), Decimal('180'), Decimal('129'), Decimal('84'), Decimal('93'), Decimal('97'), Decimal('113'), Decimal('106'), Decimal('163'), Decimal('150'), Decimal('105'), Decimal('113'), Decimal('114'), Decimal('135'), Decimal('153'), Decimal('153'), Decimal('137'), Decimal('127'), Decimal('145'), Decimal('104'), Decimal('108'), Decimal('123'), Decimal('164'), Decimal('158'), Decimal('109'), Decimal('113'), Decimal('97'), Decimal('107'), Decimal('112'), Decimal('170'), Decimal('150'), Decimal('101'), Decimal('89'), Decimal('101'), Decimal('120'), Decimal('118'), Decimal('168'), Decimal('141'), Decimal('133'), Decimal('155'), Decimal('137'), Decimal('139'), Decimal('143'), Decimal('167'), Decimal('145'), Decimal('120'), Decimal('114'), Decimal('122'), Decimal('127'), Decimal('148'), Decimal('273'), Decimal('204'), Decimal('136'), Decimal('113'), Decimal('157'), Decimal('138'), Decimal('114'), Decimal('181'), Decimal('151'), Decimal('112'), Decimal('118'), Decimal('115'), Decimal('138'), Decimal('140'), Decimal('206'), Decimal('184'), Decimal('128'), Decimal('141'), Decimal('139'), Decimal('124'), Decimal('152'), Decimal('196'), Decimal('143'), Decimal('130'), Decimal('139'), Decimal('168'), Decimal('154'), Decimal('156'), Decimal('194'), Decimal('159'), Decimal('104'), Decimal('99'), Decimal('109'), Decimal('126'), Decimal('127'), Decimal('200'), Decimal('155'), Decimal('112'), Decimal('98'), Decimal('106'), Decimal('100'), Decimal('104'), Decimal('166'), Decimal('133'), Decimal('122'), Decimal('92'), Decimal('87'), Decimal('106'), Decimal('100'), Decimal('151'), Decimal('128'), Decimal('72'), Decimal('94'), Decimal('102'), Decimal('97'), Decimal('91'), Decimal('168'), Decimal('104'), Decimal('87'), Decimal('73'), Decimal('80'), Decimal('87'), Decimal('80'), Decimal('165'), Decimal('114'), Decimal('84'), Decimal('76'), Decimal('76'), Decimal('89'), Decimal('65'), Decimal('153'), Decimal('127'), Decimal('70'), Decimal('65'), Decimal('75'), Decimal('77'), Decimal('76'), Decimal('152'), Decimal('127'), Decimal('74'), Decimal('73'), Decimal('71'), Decimal('78'), Decimal('79'), Decimal('122'), Decimal('114'), Decimal('68'), Decimal('61'), Decimal('49'), Decimal('64'), Decimal('71'), Decimal('145'), Decimal('99'), Decimal('59'), Decimal('78'), Decimal('82'), Decimal('103'), Decimal('77'), Decimal('112'), Decimal('95'), Decimal('69'), Decimal('60'), Decimal('56'), Decimal('70'), Decimal('64'), Decimal('113'), Decimal('70'), Decimal('75'), Decimal('57'), Decimal('53'), Decimal('81'), Decimal('62'), Decimal('112'), Decimal('71'), Decimal('87'), Decimal('1'), 0]]

Чаще всего в billing retry уходят по четвергам.

Не понятна причина, почему именно четверги.

Уход в Billing Retry по дням (Billing Retry from Paid Subscription)

Oy - количество ивентов.

Ox - дата, в которою произошел ивент.

In [476]:
show_plot(ubeats, datetime(2018, 3, 1), datetime.today(), ['Billing Retry from Paid Subscription'])
[[datetime.datetime(2018, 3, 1, 0, 0), datetime.datetime(2018, 3, 2, 0, 0), datetime.datetime(2018, 3, 3, 0, 0), datetime.datetime(2018, 3, 4, 0, 0), datetime.datetime(2018, 3, 5, 0, 0), datetime.datetime(2018, 3, 6, 0, 0), datetime.datetime(2018, 3, 7, 0, 0), datetime.datetime(2018, 3, 8, 0, 0), datetime.datetime(2018, 3, 9, 0, 0), datetime.datetime(2018, 3, 10, 0, 0), datetime.datetime(2018, 3, 11, 0, 0), datetime.datetime(2018, 3, 12, 0, 0), datetime.datetime(2018, 3, 13, 0, 0), datetime.datetime(2018, 3, 14, 0, 0), datetime.datetime(2018, 3, 15, 0, 0), datetime.datetime(2018, 3, 16, 0, 0), datetime.datetime(2018, 3, 17, 0, 0), datetime.datetime(2018, 3, 18, 0, 0), datetime.datetime(2018, 3, 19, 0, 0), datetime.datetime(2018, 3, 20, 0, 0), datetime.datetime(2018, 3, 21, 0, 0), datetime.datetime(2018, 3, 22, 0, 0), datetime.datetime(2018, 3, 23, 0, 0), datetime.datetime(2018, 3, 24, 0, 0), datetime.datetime(2018, 3, 25, 0, 0), datetime.datetime(2018, 3, 26, 0, 0), datetime.datetime(2018, 3, 27, 0, 0), datetime.datetime(2018, 3, 28, 0, 0), datetime.datetime(2018, 3, 29, 0, 0), datetime.datetime(2018, 3, 30, 0, 0), datetime.datetime(2018, 3, 31, 0, 0), datetime.datetime(2018, 4, 1, 0, 0), datetime.datetime(2018, 4, 2, 0, 0), datetime.datetime(2018, 4, 3, 0, 0), datetime.datetime(2018, 4, 4, 0, 0), datetime.datetime(2018, 4, 5, 0, 0), datetime.datetime(2018, 4, 6, 0, 0), datetime.datetime(2018, 4, 7, 0, 0), datetime.datetime(2018, 4, 8, 0, 0), datetime.datetime(2018, 4, 9, 0, 0), datetime.datetime(2018, 4, 10, 0, 0), datetime.datetime(2018, 4, 11, 0, 0), datetime.datetime(2018, 4, 12, 0, 0), datetime.datetime(2018, 4, 13, 0, 0), datetime.datetime(2018, 4, 14, 0, 0), datetime.datetime(2018, 4, 15, 0, 0), datetime.datetime(2018, 4, 16, 0, 0), datetime.datetime(2018, 4, 17, 0, 0), datetime.datetime(2018, 4, 18, 0, 0), datetime.datetime(2018, 4, 19, 0, 0), datetime.datetime(2018, 4, 20, 0, 0), datetime.datetime(2018, 4, 21, 0, 0), datetime.datetime(2018, 4, 22, 0, 0), datetime.datetime(2018, 4, 23, 0, 0), datetime.datetime(2018, 4, 24, 0, 0), datetime.datetime(2018, 4, 25, 0, 0), datetime.datetime(2018, 4, 26, 0, 0), datetime.datetime(2018, 4, 27, 0, 0), datetime.datetime(2018, 4, 28, 0, 0), datetime.datetime(2018, 4, 29, 0, 0), datetime.datetime(2018, 4, 30, 0, 0), datetime.datetime(2018, 5, 1, 0, 0), datetime.datetime(2018, 5, 2, 0, 0), datetime.datetime(2018, 5, 3, 0, 0), datetime.datetime(2018, 5, 4, 0, 0), datetime.datetime(2018, 5, 5, 0, 0), datetime.datetime(2018, 5, 6, 0, 0), datetime.datetime(2018, 5, 7, 0, 0), datetime.datetime(2018, 5, 8, 0, 0), datetime.datetime(2018, 5, 9, 0, 0), datetime.datetime(2018, 5, 10, 0, 0), datetime.datetime(2018, 5, 11, 0, 0), datetime.datetime(2018, 5, 12, 0, 0), datetime.datetime(2018, 5, 13, 0, 0), datetime.datetime(2018, 5, 14, 0, 0), datetime.datetime(2018, 5, 15, 0, 0), datetime.datetime(2018, 5, 16, 0, 0), datetime.datetime(2018, 5, 17, 0, 0), datetime.datetime(2018, 5, 18, 0, 0), datetime.datetime(2018, 5, 19, 0, 0), datetime.datetime(2018, 5, 20, 0, 0), datetime.datetime(2018, 5, 21, 0, 0), datetime.datetime(2018, 5, 22, 0, 0), datetime.datetime(2018, 5, 23, 0, 0), datetime.datetime(2018, 5, 24, 0, 0), datetime.datetime(2018, 5, 25, 0, 0), datetime.datetime(2018, 5, 26, 0, 0), datetime.datetime(2018, 5, 27, 0, 0), datetime.datetime(2018, 5, 28, 0, 0), datetime.datetime(2018, 5, 29, 0, 0), datetime.datetime(2018, 5, 30, 0, 0), datetime.datetime(2018, 5, 31, 0, 0), datetime.datetime(2018, 6, 1, 0, 0), datetime.datetime(2018, 6, 2, 0, 0), datetime.datetime(2018, 6, 3, 0, 0), datetime.datetime(2018, 6, 4, 0, 0), datetime.datetime(2018, 6, 5, 0, 0), datetime.datetime(2018, 6, 6, 0, 0), datetime.datetime(2018, 6, 7, 0, 0), datetime.datetime(2018, 6, 8, 0, 0), datetime.datetime(2018, 6, 9, 0, 0), datetime.datetime(2018, 6, 10, 0, 0), datetime.datetime(2018, 6, 11, 0, 0), datetime.datetime(2018, 6, 12, 0, 0), datetime.datetime(2018, 6, 13, 0, 0), datetime.datetime(2018, 6, 14, 0, 0), datetime.datetime(2018, 6, 15, 0, 0), datetime.datetime(2018, 6, 16, 0, 0), datetime.datetime(2018, 6, 17, 0, 0), datetime.datetime(2018, 6, 18, 0, 0), datetime.datetime(2018, 6, 19, 0, 0), datetime.datetime(2018, 6, 20, 0, 0), datetime.datetime(2018, 6, 21, 0, 0), datetime.datetime(2018, 6, 22, 0, 0), datetime.datetime(2018, 6, 23, 0, 0), datetime.datetime(2018, 6, 24, 0, 0), datetime.datetime(2018, 6, 25, 0, 0), datetime.datetime(2018, 6, 26, 0, 0), datetime.datetime(2018, 6, 27, 0, 0), datetime.datetime(2018, 6, 28, 0, 0), datetime.datetime(2018, 6, 29, 0, 0), datetime.datetime(2018, 6, 30, 0, 0), datetime.datetime(2018, 7, 1, 0, 0), datetime.datetime(2018, 7, 2, 0, 0), datetime.datetime(2018, 7, 3, 0, 0), datetime.datetime(2018, 7, 4, 0, 0), datetime.datetime(2018, 7, 5, 0, 0), datetime.datetime(2018, 7, 6, 0, 0), datetime.datetime(2018, 7, 7, 0, 0), datetime.datetime(2018, 7, 8, 0, 0), datetime.datetime(2018, 7, 9, 0, 0), datetime.datetime(2018, 7, 10, 0, 0), datetime.datetime(2018, 7, 11, 0, 0), datetime.datetime(2018, 7, 12, 0, 0), datetime.datetime(2018, 7, 13, 0, 0), datetime.datetime(2018, 7, 14, 0, 0), datetime.datetime(2018, 7, 15, 0, 0), datetime.datetime(2018, 7, 16, 0, 0), datetime.datetime(2018, 7, 17, 0, 0), datetime.datetime(2018, 7, 18, 0, 0), datetime.datetime(2018, 7, 19, 0, 0), datetime.datetime(2018, 7, 20, 0, 0), datetime.datetime(2018, 7, 21, 0, 0), datetime.datetime(2018, 7, 22, 0, 0), datetime.datetime(2018, 7, 23, 0, 0), datetime.datetime(2018, 7, 24, 0, 0), datetime.datetime(2018, 7, 25, 0, 0), datetime.datetime(2018, 7, 26, 0, 0), datetime.datetime(2018, 7, 27, 0, 0), datetime.datetime(2018, 7, 28, 0, 0), datetime.datetime(2018, 7, 29, 0, 0), datetime.datetime(2018, 7, 30, 0, 0), datetime.datetime(2018, 7, 31, 0, 0), datetime.datetime(2018, 8, 1, 0, 0), datetime.datetime(2018, 8, 2, 0, 0), datetime.datetime(2018, 8, 3, 0, 0), datetime.datetime(2018, 8, 4, 0, 0), datetime.datetime(2018, 8, 5, 0, 0), datetime.datetime(2018, 8, 6, 0, 0), datetime.datetime(2018, 8, 7, 0, 0), datetime.datetime(2018, 8, 8, 0, 0), datetime.datetime(2018, 8, 9, 0, 0), datetime.datetime(2018, 8, 10, 0, 0), datetime.datetime(2018, 8, 11, 0, 0), datetime.datetime(2018, 8, 12, 0, 0), datetime.datetime(2018, 8, 13, 0, 0), datetime.datetime(2018, 8, 14, 0, 0), datetime.datetime(2018, 8, 15, 0, 0), datetime.datetime(2018, 8, 16, 0, 0), datetime.datetime(2018, 8, 17, 0, 0), datetime.datetime(2018, 8, 18, 0, 0), datetime.datetime(2018, 8, 19, 0, 0), datetime.datetime(2018, 8, 20, 0, 0), datetime.datetime(2018, 8, 21, 0, 0), datetime.datetime(2018, 8, 22, 0, 0), datetime.datetime(2018, 8, 23, 0, 0), datetime.datetime(2018, 8, 24, 0, 0), datetime.datetime(2018, 8, 25, 0, 0), datetime.datetime(2018, 8, 26, 0, 0), datetime.datetime(2018, 8, 27, 0, 0), datetime.datetime(2018, 8, 28, 0, 0), datetime.datetime(2018, 8, 29, 0, 0), datetime.datetime(2018, 8, 30, 0, 0), datetime.datetime(2018, 8, 31, 0, 0), datetime.datetime(2018, 9, 1, 0, 0), datetime.datetime(2018, 9, 2, 0, 0), datetime.datetime(2018, 9, 3, 0, 0), datetime.datetime(2018, 9, 4, 0, 0), datetime.datetime(2018, 9, 5, 0, 0), datetime.datetime(2018, 9, 6, 0, 0), datetime.datetime(2018, 9, 7, 0, 0), datetime.datetime(2018, 9, 8, 0, 0), datetime.datetime(2018, 9, 9, 0, 0), datetime.datetime(2018, 9, 10, 0, 0), datetime.datetime(2018, 9, 11, 0, 0), datetime.datetime(2018, 9, 12, 0, 0), datetime.datetime(2018, 9, 13, 0, 0), datetime.datetime(2018, 9, 14, 0, 0), datetime.datetime(2018, 9, 15, 0, 0), datetime.datetime(2018, 9, 16, 0, 0), datetime.datetime(2018, 9, 17, 0, 0), datetime.datetime(2018, 9, 18, 0, 0), datetime.datetime(2018, 9, 19, 0, 0), datetime.datetime(2018, 9, 20, 0, 0), datetime.datetime(2018, 9, 21, 0, 0), datetime.datetime(2018, 9, 22, 0, 0), datetime.datetime(2018, 9, 23, 0, 0), datetime.datetime(2018, 9, 24, 0, 0), datetime.datetime(2018, 9, 25, 0, 0), datetime.datetime(2018, 9, 26, 0, 0), datetime.datetime(2018, 9, 27, 0, 0), datetime.datetime(2018, 9, 28, 0, 0), datetime.datetime(2018, 9, 29, 0, 0), datetime.datetime(2018, 9, 30, 0, 0), datetime.datetime(2018, 10, 1, 0, 0), datetime.datetime(2018, 10, 2, 0, 0), datetime.datetime(2018, 10, 3, 0, 0), datetime.datetime(2018, 10, 4, 0, 0), datetime.datetime(2018, 10, 5, 0, 0), datetime.datetime(2018, 10, 6, 0, 0), datetime.datetime(2018, 10, 7, 0, 0), datetime.datetime(2018, 10, 8, 0, 0), datetime.datetime(2018, 10, 9, 0, 0), datetime.datetime(2018, 10, 10, 0, 0), datetime.datetime(2018, 10, 11, 0, 0), datetime.datetime(2018, 10, 12, 0, 0), datetime.datetime(2018, 10, 13, 0, 0), datetime.datetime(2018, 10, 14, 0, 0), datetime.datetime(2018, 10, 15, 0, 0), datetime.datetime(2018, 10, 16, 0, 0), datetime.datetime(2018, 10, 17, 0, 0), datetime.datetime(2018, 10, 18, 0, 0), datetime.datetime(2018, 10, 19, 0, 0), datetime.datetime(2018, 10, 20, 0, 0), datetime.datetime(2018, 10, 21, 0, 0), datetime.datetime(2018, 10, 22, 0, 0), datetime.datetime(2018, 10, 23, 0, 0), datetime.datetime(2018, 10, 24, 0, 0), datetime.datetime(2018, 10, 25, 0, 0), datetime.datetime(2018, 10, 26, 0, 0), datetime.datetime(2018, 10, 27, 0, 0), datetime.datetime(2018, 10, 28, 0, 0), datetime.datetime(2018, 10, 29, 0, 0), datetime.datetime(2018, 10, 30, 0, 0), datetime.datetime(2018, 10, 31, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 11, 2, 0, 0), datetime.datetime(2018, 11, 3, 0, 0), datetime.datetime(2018, 11, 4, 0, 0), datetime.datetime(2018, 11, 5, 0, 0), datetime.datetime(2018, 11, 6, 0, 0), datetime.datetime(2018, 11, 7, 0, 0), datetime.datetime(2018, 11, 8, 0, 0), datetime.datetime(2018, 11, 9, 0, 0), datetime.datetime(2018, 11, 10, 0, 0), datetime.datetime(2018, 11, 11, 0, 0), datetime.datetime(2018, 11, 12, 0, 0), datetime.datetime(2018, 11, 13, 0, 0), datetime.datetime(2018, 11, 14, 0, 0), datetime.datetime(2018, 11, 15, 0, 0), datetime.datetime(2018, 11, 16, 0, 0), datetime.datetime(2018, 11, 17, 0, 0), datetime.datetime(2018, 11, 18, 0, 0), datetime.datetime(2018, 11, 19, 0, 0), datetime.datetime(2018, 11, 20, 0, 0), datetime.datetime(2018, 11, 21, 0, 0), datetime.datetime(2018, 11, 22, 0, 0), datetime.datetime(2018, 11, 23, 0, 0), datetime.datetime(2018, 11, 24, 0, 0), datetime.datetime(2018, 11, 25, 0, 0), datetime.datetime(2018, 11, 26, 0, 0), datetime.datetime(2018, 11, 27, 0, 0), datetime.datetime(2018, 11, 28, 0, 0), datetime.datetime(2018, 11, 29, 0, 0), datetime.datetime(2018, 11, 30, 0, 0), datetime.datetime(2018, 12, 1, 0, 0), datetime.datetime(2018, 12, 2, 0, 0), datetime.datetime(2018, 12, 3, 0, 0), datetime.datetime(2018, 12, 4, 0, 0), datetime.datetime(2018, 12, 5, 0, 0), datetime.datetime(2018, 12, 6, 0, 0), datetime.datetime(2018, 12, 7, 0, 0), datetime.datetime(2018, 12, 8, 0, 0), datetime.datetime(2018, 12, 9, 0, 0), datetime.datetime(2018, 12, 10, 0, 0), datetime.datetime(2018, 12, 11, 0, 0), datetime.datetime(2018, 12, 12, 0, 0), datetime.datetime(2018, 12, 13, 0, 0), datetime.datetime(2018, 12, 14, 0, 0), datetime.datetime(2018, 12, 15, 0, 0), datetime.datetime(2018, 12, 16, 0, 0), datetime.datetime(2018, 12, 17, 0, 0), datetime.datetime(2018, 12, 18, 0, 0), datetime.datetime(2018, 12, 19, 0, 0), datetime.datetime(2018, 12, 20, 0, 0), datetime.datetime(2018, 12, 21, 0, 0), datetime.datetime(2018, 12, 22, 0, 0), datetime.datetime(2018, 12, 23, 0, 0), datetime.datetime(2018, 12, 24, 0, 0), datetime.datetime(2018, 12, 25, 0, 0), datetime.datetime(2018, 12, 26, 0, 0), datetime.datetime(2018, 12, 27, 0, 0), datetime.datetime(2018, 12, 28, 0, 0), datetime.datetime(2018, 12, 29, 0, 0), datetime.datetime(2018, 12, 30, 0, 0), datetime.datetime(2018, 12, 31, 0, 0), datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 1, 2, 0, 0), datetime.datetime(2019, 1, 3, 0, 0), datetime.datetime(2019, 1, 4, 0, 0), datetime.datetime(2019, 1, 5, 0, 0), datetime.datetime(2019, 1, 6, 0, 0), datetime.datetime(2019, 1, 7, 0, 0), datetime.datetime(2019, 1, 8, 0, 0), datetime.datetime(2019, 1, 9, 0, 0), datetime.datetime(2019, 1, 10, 0, 0), datetime.datetime(2019, 1, 11, 0, 0), datetime.datetime(2019, 1, 12, 0, 0), datetime.datetime(2019, 1, 13, 0, 0), datetime.datetime(2019, 1, 14, 0, 0), datetime.datetime(2019, 1, 15, 0, 0), datetime.datetime(2019, 1, 16, 0, 0), datetime.datetime(2019, 1, 17, 0, 0), datetime.datetime(2019, 1, 18, 0, 0), datetime.datetime(2019, 1, 19, 0, 0), datetime.datetime(2019, 1, 20, 0, 0), datetime.datetime(2019, 1, 21, 0, 0), datetime.datetime(2019, 1, 22, 0, 0), datetime.datetime(2019, 1, 23, 0, 0), datetime.datetime(2019, 1, 24, 0, 0), datetime.datetime(2019, 1, 25, 0, 0), datetime.datetime(2019, 1, 26, 0, 0), datetime.datetime(2019, 1, 27, 0, 0), datetime.datetime(2019, 1, 28, 0, 0), datetime.datetime(2019, 1, 29, 0, 0), datetime.datetime(2019, 1, 30, 0, 0), datetime.datetime(2019, 1, 31, 0, 0), datetime.datetime(2019, 2, 1, 0, 0), datetime.datetime(2019, 2, 2, 0, 0), datetime.datetime(2019, 2, 3, 0, 0), datetime.datetime(2019, 2, 4, 0, 0), datetime.datetime(2019, 2, 5, 0, 0), datetime.datetime(2019, 2, 6, 0, 0), datetime.datetime(2019, 2, 7, 0, 0), datetime.datetime(2019, 2, 8, 0, 0), datetime.datetime(2019, 2, 9, 0, 0), datetime.datetime(2019, 2, 10, 0, 0), datetime.datetime(2019, 2, 11, 0, 0), datetime.datetime(2019, 2, 12, 0, 0), datetime.datetime(2019, 2, 13, 0, 0), datetime.datetime(2019, 2, 14, 0, 0), datetime.datetime(2019, 2, 15, 0, 0), datetime.datetime(2019, 2, 16, 0, 0), datetime.datetime(2019, 2, 17, 0, 0), datetime.datetime(2019, 2, 18, 0, 0), datetime.datetime(2019, 2, 19, 0, 0), datetime.datetime(2019, 2, 20, 0, 0), datetime.datetime(2019, 2, 21, 0, 0), datetime.datetime(2019, 2, 22, 0, 0), datetime.datetime(2019, 2, 23, 0, 0), datetime.datetime(2019, 2, 24, 0, 0), datetime.datetime(2019, 2, 25, 0, 0), datetime.datetime(2019, 2, 26, 0, 0), datetime.datetime(2019, 2, 27, 0, 0), datetime.datetime(2019, 2, 28, 0, 0), datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 3, 2, 0, 0), datetime.datetime(2019, 3, 3, 0, 0), datetime.datetime(2019, 3, 4, 0, 0), datetime.datetime(2019, 3, 5, 0, 0), datetime.datetime(2019, 3, 6, 0, 0), datetime.datetime(2019, 3, 7, 0, 0), datetime.datetime(2019, 3, 8, 0, 0), datetime.datetime(2019, 3, 9, 0, 0), datetime.datetime(2019, 3, 10, 0, 0), datetime.datetime(2019, 3, 11, 0, 0), datetime.datetime(2019, 3, 12, 0, 0), datetime.datetime(2019, 3, 13, 0, 0), datetime.datetime(2019, 3, 14, 0, 0), datetime.datetime(2019, 3, 15, 0, 0), datetime.datetime(2019, 3, 16, 0, 0), datetime.datetime(2019, 3, 17, 0, 0), datetime.datetime(2019, 3, 18, 0, 0), datetime.datetime(2019, 3, 19, 0, 0), datetime.datetime(2019, 3, 20, 0, 0), datetime.datetime(2019, 3, 21, 0, 0), datetime.datetime(2019, 3, 22, 0, 0), datetime.datetime(2019, 3, 23, 0, 0), datetime.datetime(2019, 3, 24, 0, 0), datetime.datetime(2019, 3, 25, 0, 0), datetime.datetime(2019, 3, 26, 0, 0), datetime.datetime(2019, 3, 27, 0, 0), datetime.datetime(2019, 3, 28, 0, 0), datetime.datetime(2019, 3, 29, 0, 0), datetime.datetime(2019, 3, 30, 0, 0), datetime.datetime(2019, 3, 31, 0, 0), datetime.datetime(2019, 4, 1, 0, 0), datetime.datetime(2019, 4, 2, 0, 0), datetime.datetime(2019, 4, 3, 0, 0), datetime.datetime(2019, 4, 4, 0, 0), datetime.datetime(2019, 4, 5, 0, 0), datetime.datetime(2019, 4, 6, 0, 0), datetime.datetime(2019, 4, 7, 0, 0), datetime.datetime(2019, 4, 8, 0, 0), datetime.datetime(2019, 4, 9, 0, 0), datetime.datetime(2019, 4, 10, 0, 0), datetime.datetime(2019, 4, 11, 0, 0), datetime.datetime(2019, 4, 12, 0, 0), datetime.datetime(2019, 4, 13, 0, 0), datetime.datetime(2019, 4, 14, 0, 0), datetime.datetime(2019, 4, 15, 0, 0), datetime.datetime(2019, 4, 16, 0, 0), datetime.datetime(2019, 4, 17, 0, 0), datetime.datetime(2019, 4, 18, 0, 0), datetime.datetime(2019, 4, 19, 0, 0), datetime.datetime(2019, 4, 20, 0, 0), datetime.datetime(2019, 4, 21, 0, 0), datetime.datetime(2019, 4, 22, 0, 0), datetime.datetime(2019, 4, 23, 0, 0), datetime.datetime(2019, 4, 24, 0, 0), datetime.datetime(2019, 4, 25, 0, 0), datetime.datetime(2019, 4, 26, 0, 0), datetime.datetime(2019, 4, 27, 0, 0), datetime.datetime(2019, 4, 28, 0, 0), datetime.datetime(2019, 4, 29, 0, 0), datetime.datetime(2019, 4, 30, 0, 0), datetime.datetime(2019, 5, 1, 0, 0), datetime.datetime(2019, 5, 2, 0, 0), datetime.datetime(2019, 5, 3, 0, 0), datetime.datetime(2019, 5, 4, 0, 0), datetime.datetime(2019, 5, 5, 0, 0), datetime.datetime(2019, 5, 6, 0, 0), datetime.datetime(2019, 5, 7, 0, 0), datetime.datetime(2019, 5, 8, 0, 0), datetime.datetime(2019, 5, 9, 0, 0), datetime.datetime(2019, 5, 10, 0, 0), datetime.datetime(2019, 5, 11, 0, 0), datetime.datetime(2019, 5, 12, 0, 0), datetime.datetime(2019, 5, 13, 0, 0)], [0, 0, 0, 0, 0, 0, 0, 0, Decimal('3'), Decimal('4'), Decimal('5'), Decimal('3'), Decimal('5'), Decimal('5'), Decimal('6'), Decimal('4'), Decimal('6'), Decimal('9'), Decimal('8'), Decimal('6'), Decimal('10'), Decimal('15'), Decimal('17'), Decimal('9'), Decimal('7'), Decimal('10'), Decimal('10'), Decimal('9'), Decimal('17'), Decimal('9'), Decimal('4'), Decimal('7'), Decimal('6'), Decimal('9'), Decimal('10'), Decimal('24'), Decimal('15'), Decimal('12'), Decimal('9'), Decimal('6'), Decimal('8'), Decimal('10'), Decimal('21'), Decimal('9'), Decimal('13'), Decimal('11'), Decimal('9'), Decimal('8'), Decimal('11'), Decimal('14'), Decimal('15'), Decimal('18'), Decimal('19'), Decimal('16'), Decimal('15'), Decimal('19'), Decimal('39'), Decimal('27'), Decimal('22'), Decimal('21'), Decimal('16'), Decimal('29'), Decimal('33'), Decimal('52'), Decimal('30'), Decimal('20'), Decimal('19'), Decimal('18'), Decimal('22'), Decimal('25'), Decimal('47'), Decimal('25'), Decimal('20'), Decimal('22'), Decimal('14'), Decimal('17'), Decimal('25'), Decimal('36'), Decimal('29'), Decimal('18'), Decimal('9'), Decimal('23'), Decimal('21'), Decimal('25'), Decimal('43'), Decimal('34'), Decimal('22'), Decimal('19'), Decimal('33'), Decimal('20'), Decimal('22'), Decimal('42'), Decimal('34'), Decimal('26'), Decimal('16'), Decimal('20'), Decimal('21'), Decimal('27'), Decimal('47'), Decimal('39'), Decimal('30'), Decimal('20'), Decimal('40'), Decimal('25'), Decimal('23'), Decimal('56'), Decimal('32'), Decimal('24'), Decimal('19'), Decimal('16'), Decimal('17'), Decimal('17'), Decimal('60'), Decimal('46'), Decimal('31'), Decimal('21'), Decimal('25'), Decimal('21'), Decimal('24'), Decimal('63'), Decimal('44'), Decimal('16'), Decimal('23'), Decimal('23'), Decimal('25'), Decimal('31'), Decimal('56'), Decimal('40'), Decimal('20'), Decimal('17'), Decimal('22'), Decimal('25'), Decimal('30'), Decimal('50'), Decimal('37'), Decimal('21'), Decimal('19'), Decimal('21'), Decimal('22'), Decimal('28'), Decimal('65'), Decimal('35'), Decimal('38'), Decimal('17'), Decimal('25'), Decimal('31'), Decimal('31'), Decimal('60'), Decimal('49'), Decimal('26'), Decimal('30'), Decimal('25'), Decimal('25'), Decimal('35'), Decimal('55'), Decimal('44'), Decimal('45'), Decimal('25'), Decimal('31'), Decimal('26'), Decimal('39'), Decimal('71'), Decimal('45'), Decimal('34'), Decimal('39'), Decimal('41'), Decimal('24'), Decimal('33'), Decimal('87'), Decimal('55'), Decimal('42'), Decimal('31'), Decimal('22'), Decimal('53'), Decimal('60'), Decimal('47'), Decimal('58'), Decimal('40'), Decimal('33'), Decimal('32'), Decimal('45'), Decimal('51'), Decimal('68'), Decimal('48'), Decimal('37'), Decimal('41'), Decimal('19'), Decimal('36'), Decimal('35'), Decimal('66'), Decimal('62'), Decimal('36'), Decimal('36'), Decimal('53'), Decimal('63'), Decimal('48'), Decimal('89'), Decimal('59'), Decimal('33'), Decimal('43'), Decimal('26'), Decimal('60'), Decimal('48'), Decimal('100'), Decimal('70'), Decimal('56'), Decimal('31'), Decimal('44'), Decimal('42'), Decimal('42'), Decimal('109'), Decimal('69'), Decimal('38'), Decimal('36'), Decimal('36'), Decimal('30'), Decimal('37'), Decimal('90'), Decimal('78'), Decimal('48'), Decimal('50'), Decimal('35'), Decimal('35'), Decimal('36'), Decimal('107'), Decimal('76'), Decimal('52'), Decimal('38'), Decimal('35'), Decimal('40'), Decimal('47'), Decimal('120'), Decimal('85'), Decimal('48'), Decimal('54'), Decimal('44'), Decimal('40'), Decimal('47'), Decimal('118'), Decimal('76'), Decimal('47'), Decimal('53'), Decimal('56'), Decimal('33'), Decimal('45'), Decimal('113'), Decimal('66'), Decimal('51'), Decimal('35'), Decimal('36'), Decimal('61'), Decimal('46'), Decimal('110'), Decimal('80'), Decimal('51'), Decimal('58'), Decimal('24'), Decimal('46'), Decimal('53'), Decimal('98'), Decimal('67'), Decimal('42'), Decimal('45'), Decimal('44'), Decimal('41'), Decimal('67'), Decimal('83'), Decimal('87'), Decimal('47'), Decimal('42'), Decimal('41'), Decimal('39'), Decimal('46'), Decimal('126'), Decimal('72'), Decimal('43'), Decimal('43'), Decimal('42'), Decimal('44'), Decimal('45'), Decimal('106'), Decimal('85'), Decimal('43'), Decimal('37'), Decimal('31'), Decimal('58'), Decimal('70'), Decimal('76'), Decimal('79'), Decimal('58'), Decimal('54'), Decimal('38'), Decimal('49'), Decimal('49'), Decimal('103'), Decimal('79'), Decimal('53'), Decimal('54'), Decimal('35'), Decimal('53'), Decimal('48'), Decimal('107'), Decimal('91'), Decimal('43'), Decimal('40'), Decimal('35'), Decimal('48'), Decimal('43'), Decimal('106'), Decimal('84'), Decimal('54'), Decimal('52'), Decimal('45'), Decimal('45'), Decimal('49'), Decimal('102'), Decimal('73'), Decimal('55'), Decimal('34'), Decimal('45'), Decimal('41'), Decimal('45'), Decimal('206'), Decimal('128'), Decimal('66'), Decimal('56'), Decimal('91'), Decimal('72'), Decimal('58'), Decimal('106'), Decimal('81'), Decimal('46'), Decimal('46'), Decimal('47'), Decimal('57'), Decimal('57'), Decimal('126'), Decimal('84'), Decimal('37'), Decimal('42'), Decimal('35'), Decimal('43'), Decimal('73'), Decimal('123'), Decimal('85'), Decimal('53'), Decimal('46'), Decimal('70'), Decimal('62'), Decimal('45'), Decimal('118'), Decimal('90'), Decimal('41'), Decimal('32'), Decimal('38'), Decimal('48'), Decimal('56'), Decimal('129'), Decimal('84'), Decimal('62'), Decimal('43'), Decimal('51'), Decimal('36'), Decimal('29'), Decimal('121'), Decimal('78'), Decimal('51'), Decimal('30'), Decimal('38'), Decimal('43'), Decimal('48'), Decimal('121'), Decimal('96'), Decimal('32'), Decimal('38'), Decimal('48'), Decimal('52'), Decimal('40'), Decimal('125'), Decimal('79'), Decimal('46'), Decimal('32'), Decimal('46'), Decimal('46'), Decimal('45'), Decimal('129'), Decimal('73'), Decimal('42'), Decimal('20'), Decimal('39'), Decimal('38'), Decimal('33'), Decimal('111'), Decimal('81'), Decimal('33'), Decimal('37'), Decimal('27'), Decimal('43'), Decimal('50'), Decimal('110'), Decimal('88'), Decimal('46'), Decimal('41'), Decimal('45'), Decimal('39'), Decimal('41'), Decimal('93'), Decimal('89'), Decimal('47'), Decimal('38'), Decimal('31'), Decimal('35'), Decimal('32'), Decimal('112'), Decimal('72'), Decimal('37'), Decimal('44'), Decimal('44'), Decimal('44'), Decimal('48'), Decimal('81'), Decimal('70'), Decimal('37'), Decimal('38'), Decimal('30'), Decimal('35'), Decimal('44'), Decimal('89'), Decimal('56'), Decimal('48'), Decimal('33'), Decimal('33'), Decimal('60'), Decimal('41'), Decimal('91'), Decimal('53'), Decimal('51'), 0, 0]]

Чаще всего в billing retry уходят по четвергам.

Не понятна причина, почему именно четверги.

Выход из Billing Retry по дням (Renewal from Billing Retry)

Oy - количество ивентов.

Ox - дата, в которою произошел ивент.

In [477]:
show_plot(ubeats, datetime(2018, 3, 1), datetime.today(), ['Renewal from Billing Retry'])
[[datetime.datetime(2018, 3, 1, 0, 0), datetime.datetime(2018, 3, 2, 0, 0), datetime.datetime(2018, 3, 3, 0, 0), datetime.datetime(2018, 3, 4, 0, 0), datetime.datetime(2018, 3, 5, 0, 0), datetime.datetime(2018, 3, 6, 0, 0), datetime.datetime(2018, 3, 7, 0, 0), datetime.datetime(2018, 3, 8, 0, 0), datetime.datetime(2018, 3, 9, 0, 0), datetime.datetime(2018, 3, 10, 0, 0), datetime.datetime(2018, 3, 11, 0, 0), datetime.datetime(2018, 3, 12, 0, 0), datetime.datetime(2018, 3, 13, 0, 0), datetime.datetime(2018, 3, 14, 0, 0), datetime.datetime(2018, 3, 15, 0, 0), datetime.datetime(2018, 3, 16, 0, 0), datetime.datetime(2018, 3, 17, 0, 0), datetime.datetime(2018, 3, 18, 0, 0), datetime.datetime(2018, 3, 19, 0, 0), datetime.datetime(2018, 3, 20, 0, 0), datetime.datetime(2018, 3, 21, 0, 0), datetime.datetime(2018, 3, 22, 0, 0), datetime.datetime(2018, 3, 23, 0, 0), datetime.datetime(2018, 3, 24, 0, 0), datetime.datetime(2018, 3, 25, 0, 0), datetime.datetime(2018, 3, 26, 0, 0), datetime.datetime(2018, 3, 27, 0, 0), datetime.datetime(2018, 3, 28, 0, 0), datetime.datetime(2018, 3, 29, 0, 0), datetime.datetime(2018, 3, 30, 0, 0), datetime.datetime(2018, 3, 31, 0, 0), datetime.datetime(2018, 4, 1, 0, 0), datetime.datetime(2018, 4, 2, 0, 0), datetime.datetime(2018, 4, 3, 0, 0), datetime.datetime(2018, 4, 4, 0, 0), datetime.datetime(2018, 4, 5, 0, 0), datetime.datetime(2018, 4, 6, 0, 0), datetime.datetime(2018, 4, 7, 0, 0), datetime.datetime(2018, 4, 8, 0, 0), datetime.datetime(2018, 4, 9, 0, 0), datetime.datetime(2018, 4, 10, 0, 0), datetime.datetime(2018, 4, 11, 0, 0), datetime.datetime(2018, 4, 12, 0, 0), datetime.datetime(2018, 4, 13, 0, 0), datetime.datetime(2018, 4, 14, 0, 0), datetime.datetime(2018, 4, 15, 0, 0), datetime.datetime(2018, 4, 16, 0, 0), datetime.datetime(2018, 4, 17, 0, 0), datetime.datetime(2018, 4, 18, 0, 0), datetime.datetime(2018, 4, 19, 0, 0), datetime.datetime(2018, 4, 20, 0, 0), datetime.datetime(2018, 4, 21, 0, 0), datetime.datetime(2018, 4, 22, 0, 0), datetime.datetime(2018, 4, 23, 0, 0), datetime.datetime(2018, 4, 24, 0, 0), datetime.datetime(2018, 4, 25, 0, 0), datetime.datetime(2018, 4, 26, 0, 0), datetime.datetime(2018, 4, 27, 0, 0), datetime.datetime(2018, 4, 28, 0, 0), datetime.datetime(2018, 4, 29, 0, 0), datetime.datetime(2018, 4, 30, 0, 0), datetime.datetime(2018, 5, 1, 0, 0), datetime.datetime(2018, 5, 2, 0, 0), datetime.datetime(2018, 5, 3, 0, 0), datetime.datetime(2018, 5, 4, 0, 0), datetime.datetime(2018, 5, 5, 0, 0), datetime.datetime(2018, 5, 6, 0, 0), datetime.datetime(2018, 5, 7, 0, 0), datetime.datetime(2018, 5, 8, 0, 0), datetime.datetime(2018, 5, 9, 0, 0), datetime.datetime(2018, 5, 10, 0, 0), datetime.datetime(2018, 5, 11, 0, 0), datetime.datetime(2018, 5, 12, 0, 0), datetime.datetime(2018, 5, 13, 0, 0), datetime.datetime(2018, 5, 14, 0, 0), datetime.datetime(2018, 5, 15, 0, 0), datetime.datetime(2018, 5, 16, 0, 0), datetime.datetime(2018, 5, 17, 0, 0), datetime.datetime(2018, 5, 18, 0, 0), datetime.datetime(2018, 5, 19, 0, 0), datetime.datetime(2018, 5, 20, 0, 0), datetime.datetime(2018, 5, 21, 0, 0), datetime.datetime(2018, 5, 22, 0, 0), datetime.datetime(2018, 5, 23, 0, 0), datetime.datetime(2018, 5, 24, 0, 0), datetime.datetime(2018, 5, 25, 0, 0), datetime.datetime(2018, 5, 26, 0, 0), datetime.datetime(2018, 5, 27, 0, 0), datetime.datetime(2018, 5, 28, 0, 0), datetime.datetime(2018, 5, 29, 0, 0), datetime.datetime(2018, 5, 30, 0, 0), datetime.datetime(2018, 5, 31, 0, 0), datetime.datetime(2018, 6, 1, 0, 0), datetime.datetime(2018, 6, 2, 0, 0), datetime.datetime(2018, 6, 3, 0, 0), datetime.datetime(2018, 6, 4, 0, 0), datetime.datetime(2018, 6, 5, 0, 0), datetime.datetime(2018, 6, 6, 0, 0), datetime.datetime(2018, 6, 7, 0, 0), datetime.datetime(2018, 6, 8, 0, 0), datetime.datetime(2018, 6, 9, 0, 0), datetime.datetime(2018, 6, 10, 0, 0), datetime.datetime(2018, 6, 11, 0, 0), datetime.datetime(2018, 6, 12, 0, 0), datetime.datetime(2018, 6, 13, 0, 0), datetime.datetime(2018, 6, 14, 0, 0), datetime.datetime(2018, 6, 15, 0, 0), datetime.datetime(2018, 6, 16, 0, 0), datetime.datetime(2018, 6, 17, 0, 0), datetime.datetime(2018, 6, 18, 0, 0), datetime.datetime(2018, 6, 19, 0, 0), datetime.datetime(2018, 6, 20, 0, 0), datetime.datetime(2018, 6, 21, 0, 0), datetime.datetime(2018, 6, 22, 0, 0), datetime.datetime(2018, 6, 23, 0, 0), datetime.datetime(2018, 6, 24, 0, 0), datetime.datetime(2018, 6, 25, 0, 0), datetime.datetime(2018, 6, 26, 0, 0), datetime.datetime(2018, 6, 27, 0, 0), datetime.datetime(2018, 6, 28, 0, 0), datetime.datetime(2018, 6, 29, 0, 0), datetime.datetime(2018, 6, 30, 0, 0), datetime.datetime(2018, 7, 1, 0, 0), datetime.datetime(2018, 7, 2, 0, 0), datetime.datetime(2018, 7, 3, 0, 0), datetime.datetime(2018, 7, 4, 0, 0), datetime.datetime(2018, 7, 5, 0, 0), datetime.datetime(2018, 7, 6, 0, 0), datetime.datetime(2018, 7, 7, 0, 0), datetime.datetime(2018, 7, 8, 0, 0), datetime.datetime(2018, 7, 9, 0, 0), datetime.datetime(2018, 7, 10, 0, 0), datetime.datetime(2018, 7, 11, 0, 0), datetime.datetime(2018, 7, 12, 0, 0), datetime.datetime(2018, 7, 13, 0, 0), datetime.datetime(2018, 7, 14, 0, 0), datetime.datetime(2018, 7, 15, 0, 0), datetime.datetime(2018, 7, 16, 0, 0), datetime.datetime(2018, 7, 17, 0, 0), datetime.datetime(2018, 7, 18, 0, 0), datetime.datetime(2018, 7, 19, 0, 0), datetime.datetime(2018, 7, 20, 0, 0), datetime.datetime(2018, 7, 21, 0, 0), datetime.datetime(2018, 7, 22, 0, 0), datetime.datetime(2018, 7, 23, 0, 0), datetime.datetime(2018, 7, 24, 0, 0), datetime.datetime(2018, 7, 25, 0, 0), datetime.datetime(2018, 7, 26, 0, 0), datetime.datetime(2018, 7, 27, 0, 0), datetime.datetime(2018, 7, 28, 0, 0), datetime.datetime(2018, 7, 29, 0, 0), datetime.datetime(2018, 7, 30, 0, 0), datetime.datetime(2018, 7, 31, 0, 0), datetime.datetime(2018, 8, 1, 0, 0), datetime.datetime(2018, 8, 2, 0, 0), datetime.datetime(2018, 8, 3, 0, 0), datetime.datetime(2018, 8, 4, 0, 0), datetime.datetime(2018, 8, 5, 0, 0), datetime.datetime(2018, 8, 6, 0, 0), datetime.datetime(2018, 8, 7, 0, 0), datetime.datetime(2018, 8, 8, 0, 0), datetime.datetime(2018, 8, 9, 0, 0), datetime.datetime(2018, 8, 10, 0, 0), datetime.datetime(2018, 8, 11, 0, 0), datetime.datetime(2018, 8, 12, 0, 0), datetime.datetime(2018, 8, 13, 0, 0), datetime.datetime(2018, 8, 14, 0, 0), datetime.datetime(2018, 8, 15, 0, 0), datetime.datetime(2018, 8, 16, 0, 0), datetime.datetime(2018, 8, 17, 0, 0), datetime.datetime(2018, 8, 18, 0, 0), datetime.datetime(2018, 8, 19, 0, 0), datetime.datetime(2018, 8, 20, 0, 0), datetime.datetime(2018, 8, 21, 0, 0), datetime.datetime(2018, 8, 22, 0, 0), datetime.datetime(2018, 8, 23, 0, 0), datetime.datetime(2018, 8, 24, 0, 0), datetime.datetime(2018, 8, 25, 0, 0), datetime.datetime(2018, 8, 26, 0, 0), datetime.datetime(2018, 8, 27, 0, 0), datetime.datetime(2018, 8, 28, 0, 0), datetime.datetime(2018, 8, 29, 0, 0), datetime.datetime(2018, 8, 30, 0, 0), datetime.datetime(2018, 8, 31, 0, 0), datetime.datetime(2018, 9, 1, 0, 0), datetime.datetime(2018, 9, 2, 0, 0), datetime.datetime(2018, 9, 3, 0, 0), datetime.datetime(2018, 9, 4, 0, 0), datetime.datetime(2018, 9, 5, 0, 0), datetime.datetime(2018, 9, 6, 0, 0), datetime.datetime(2018, 9, 7, 0, 0), datetime.datetime(2018, 9, 8, 0, 0), datetime.datetime(2018, 9, 9, 0, 0), datetime.datetime(2018, 9, 10, 0, 0), datetime.datetime(2018, 9, 11, 0, 0), datetime.datetime(2018, 9, 12, 0, 0), datetime.datetime(2018, 9, 13, 0, 0), datetime.datetime(2018, 9, 14, 0, 0), datetime.datetime(2018, 9, 15, 0, 0), datetime.datetime(2018, 9, 16, 0, 0), datetime.datetime(2018, 9, 17, 0, 0), datetime.datetime(2018, 9, 18, 0, 0), datetime.datetime(2018, 9, 19, 0, 0), datetime.datetime(2018, 9, 20, 0, 0), datetime.datetime(2018, 9, 21, 0, 0), datetime.datetime(2018, 9, 22, 0, 0), datetime.datetime(2018, 9, 23, 0, 0), datetime.datetime(2018, 9, 24, 0, 0), datetime.datetime(2018, 9, 25, 0, 0), datetime.datetime(2018, 9, 26, 0, 0), datetime.datetime(2018, 9, 27, 0, 0), datetime.datetime(2018, 9, 28, 0, 0), datetime.datetime(2018, 9, 29, 0, 0), datetime.datetime(2018, 9, 30, 0, 0), datetime.datetime(2018, 10, 1, 0, 0), datetime.datetime(2018, 10, 2, 0, 0), datetime.datetime(2018, 10, 3, 0, 0), datetime.datetime(2018, 10, 4, 0, 0), datetime.datetime(2018, 10, 5, 0, 0), datetime.datetime(2018, 10, 6, 0, 0), datetime.datetime(2018, 10, 7, 0, 0), datetime.datetime(2018, 10, 8, 0, 0), datetime.datetime(2018, 10, 9, 0, 0), datetime.datetime(2018, 10, 10, 0, 0), datetime.datetime(2018, 10, 11, 0, 0), datetime.datetime(2018, 10, 12, 0, 0), datetime.datetime(2018, 10, 13, 0, 0), datetime.datetime(2018, 10, 14, 0, 0), datetime.datetime(2018, 10, 15, 0, 0), datetime.datetime(2018, 10, 16, 0, 0), datetime.datetime(2018, 10, 17, 0, 0), datetime.datetime(2018, 10, 18, 0, 0), datetime.datetime(2018, 10, 19, 0, 0), datetime.datetime(2018, 10, 20, 0, 0), datetime.datetime(2018, 10, 21, 0, 0), datetime.datetime(2018, 10, 22, 0, 0), datetime.datetime(2018, 10, 23, 0, 0), datetime.datetime(2018, 10, 24, 0, 0), datetime.datetime(2018, 10, 25, 0, 0), datetime.datetime(2018, 10, 26, 0, 0), datetime.datetime(2018, 10, 27, 0, 0), datetime.datetime(2018, 10, 28, 0, 0), datetime.datetime(2018, 10, 29, 0, 0), datetime.datetime(2018, 10, 30, 0, 0), datetime.datetime(2018, 10, 31, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 11, 2, 0, 0), datetime.datetime(2018, 11, 3, 0, 0), datetime.datetime(2018, 11, 4, 0, 0), datetime.datetime(2018, 11, 5, 0, 0), datetime.datetime(2018, 11, 6, 0, 0), datetime.datetime(2018, 11, 7, 0, 0), datetime.datetime(2018, 11, 8, 0, 0), datetime.datetime(2018, 11, 9, 0, 0), datetime.datetime(2018, 11, 10, 0, 0), datetime.datetime(2018, 11, 11, 0, 0), datetime.datetime(2018, 11, 12, 0, 0), datetime.datetime(2018, 11, 13, 0, 0), datetime.datetime(2018, 11, 14, 0, 0), datetime.datetime(2018, 11, 15, 0, 0), datetime.datetime(2018, 11, 16, 0, 0), datetime.datetime(2018, 11, 17, 0, 0), datetime.datetime(2018, 11, 18, 0, 0), datetime.datetime(2018, 11, 19, 0, 0), datetime.datetime(2018, 11, 20, 0, 0), datetime.datetime(2018, 11, 21, 0, 0), datetime.datetime(2018, 11, 22, 0, 0), datetime.datetime(2018, 11, 23, 0, 0), datetime.datetime(2018, 11, 24, 0, 0), datetime.datetime(2018, 11, 25, 0, 0), datetime.datetime(2018, 11, 26, 0, 0), datetime.datetime(2018, 11, 27, 0, 0), datetime.datetime(2018, 11, 28, 0, 0), datetime.datetime(2018, 11, 29, 0, 0), datetime.datetime(2018, 11, 30, 0, 0), datetime.datetime(2018, 12, 1, 0, 0), datetime.datetime(2018, 12, 2, 0, 0), datetime.datetime(2018, 12, 3, 0, 0), datetime.datetime(2018, 12, 4, 0, 0), datetime.datetime(2018, 12, 5, 0, 0), datetime.datetime(2018, 12, 6, 0, 0), datetime.datetime(2018, 12, 7, 0, 0), datetime.datetime(2018, 12, 8, 0, 0), datetime.datetime(2018, 12, 9, 0, 0), datetime.datetime(2018, 12, 10, 0, 0), datetime.datetime(2018, 12, 11, 0, 0), datetime.datetime(2018, 12, 12, 0, 0), datetime.datetime(2018, 12, 13, 0, 0), datetime.datetime(2018, 12, 14, 0, 0), datetime.datetime(2018, 12, 15, 0, 0), datetime.datetime(2018, 12, 16, 0, 0), datetime.datetime(2018, 12, 17, 0, 0), datetime.datetime(2018, 12, 18, 0, 0), datetime.datetime(2018, 12, 19, 0, 0), datetime.datetime(2018, 12, 20, 0, 0), datetime.datetime(2018, 12, 21, 0, 0), datetime.datetime(2018, 12, 22, 0, 0), datetime.datetime(2018, 12, 23, 0, 0), datetime.datetime(2018, 12, 24, 0, 0), datetime.datetime(2018, 12, 25, 0, 0), datetime.datetime(2018, 12, 26, 0, 0), datetime.datetime(2018, 12, 27, 0, 0), datetime.datetime(2018, 12, 28, 0, 0), datetime.datetime(2018, 12, 29, 0, 0), datetime.datetime(2018, 12, 30, 0, 0), datetime.datetime(2018, 12, 31, 0, 0), datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 1, 2, 0, 0), datetime.datetime(2019, 1, 3, 0, 0), datetime.datetime(2019, 1, 4, 0, 0), datetime.datetime(2019, 1, 5, 0, 0), datetime.datetime(2019, 1, 6, 0, 0), datetime.datetime(2019, 1, 7, 0, 0), datetime.datetime(2019, 1, 8, 0, 0), datetime.datetime(2019, 1, 9, 0, 0), datetime.datetime(2019, 1, 10, 0, 0), datetime.datetime(2019, 1, 11, 0, 0), datetime.datetime(2019, 1, 12, 0, 0), datetime.datetime(2019, 1, 13, 0, 0), datetime.datetime(2019, 1, 14, 0, 0), datetime.datetime(2019, 1, 15, 0, 0), datetime.datetime(2019, 1, 16, 0, 0), datetime.datetime(2019, 1, 17, 0, 0), datetime.datetime(2019, 1, 18, 0, 0), datetime.datetime(2019, 1, 19, 0, 0), datetime.datetime(2019, 1, 20, 0, 0), datetime.datetime(2019, 1, 21, 0, 0), datetime.datetime(2019, 1, 22, 0, 0), datetime.datetime(2019, 1, 23, 0, 0), datetime.datetime(2019, 1, 24, 0, 0), datetime.datetime(2019, 1, 25, 0, 0), datetime.datetime(2019, 1, 26, 0, 0), datetime.datetime(2019, 1, 27, 0, 0), datetime.datetime(2019, 1, 28, 0, 0), datetime.datetime(2019, 1, 29, 0, 0), datetime.datetime(2019, 1, 30, 0, 0), datetime.datetime(2019, 1, 31, 0, 0), datetime.datetime(2019, 2, 1, 0, 0), datetime.datetime(2019, 2, 2, 0, 0), datetime.datetime(2019, 2, 3, 0, 0), datetime.datetime(2019, 2, 4, 0, 0), datetime.datetime(2019, 2, 5, 0, 0), datetime.datetime(2019, 2, 6, 0, 0), datetime.datetime(2019, 2, 7, 0, 0), datetime.datetime(2019, 2, 8, 0, 0), datetime.datetime(2019, 2, 9, 0, 0), datetime.datetime(2019, 2, 10, 0, 0), datetime.datetime(2019, 2, 11, 0, 0), datetime.datetime(2019, 2, 12, 0, 0), datetime.datetime(2019, 2, 13, 0, 0), datetime.datetime(2019, 2, 14, 0, 0), datetime.datetime(2019, 2, 15, 0, 0), datetime.datetime(2019, 2, 16, 0, 0), datetime.datetime(2019, 2, 17, 0, 0), datetime.datetime(2019, 2, 18, 0, 0), datetime.datetime(2019, 2, 19, 0, 0), datetime.datetime(2019, 2, 20, 0, 0), datetime.datetime(2019, 2, 21, 0, 0), datetime.datetime(2019, 2, 22, 0, 0), datetime.datetime(2019, 2, 23, 0, 0), datetime.datetime(2019, 2, 24, 0, 0), datetime.datetime(2019, 2, 25, 0, 0), datetime.datetime(2019, 2, 26, 0, 0), datetime.datetime(2019, 2, 27, 0, 0), datetime.datetime(2019, 2, 28, 0, 0), datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 3, 2, 0, 0), datetime.datetime(2019, 3, 3, 0, 0), datetime.datetime(2019, 3, 4, 0, 0), datetime.datetime(2019, 3, 5, 0, 0), datetime.datetime(2019, 3, 6, 0, 0), datetime.datetime(2019, 3, 7, 0, 0), datetime.datetime(2019, 3, 8, 0, 0), datetime.datetime(2019, 3, 9, 0, 0), datetime.datetime(2019, 3, 10, 0, 0), datetime.datetime(2019, 3, 11, 0, 0), datetime.datetime(2019, 3, 12, 0, 0), datetime.datetime(2019, 3, 13, 0, 0), datetime.datetime(2019, 3, 14, 0, 0), datetime.datetime(2019, 3, 15, 0, 0), datetime.datetime(2019, 3, 16, 0, 0), datetime.datetime(2019, 3, 17, 0, 0), datetime.datetime(2019, 3, 18, 0, 0), datetime.datetime(2019, 3, 19, 0, 0), datetime.datetime(2019, 3, 20, 0, 0), datetime.datetime(2019, 3, 21, 0, 0), datetime.datetime(2019, 3, 22, 0, 0), datetime.datetime(2019, 3, 23, 0, 0), datetime.datetime(2019, 3, 24, 0, 0), datetime.datetime(2019, 3, 25, 0, 0), datetime.datetime(2019, 3, 26, 0, 0), datetime.datetime(2019, 3, 27, 0, 0), datetime.datetime(2019, 3, 28, 0, 0), datetime.datetime(2019, 3, 29, 0, 0), datetime.datetime(2019, 3, 30, 0, 0), datetime.datetime(2019, 3, 31, 0, 0), datetime.datetime(2019, 4, 1, 0, 0), datetime.datetime(2019, 4, 2, 0, 0), datetime.datetime(2019, 4, 3, 0, 0), datetime.datetime(2019, 4, 4, 0, 0), datetime.datetime(2019, 4, 5, 0, 0), datetime.datetime(2019, 4, 6, 0, 0), datetime.datetime(2019, 4, 7, 0, 0), datetime.datetime(2019, 4, 8, 0, 0), datetime.datetime(2019, 4, 9, 0, 0), datetime.datetime(2019, 4, 10, 0, 0), datetime.datetime(2019, 4, 11, 0, 0), datetime.datetime(2019, 4, 12, 0, 0), datetime.datetime(2019, 4, 13, 0, 0), datetime.datetime(2019, 4, 14, 0, 0), datetime.datetime(2019, 4, 15, 0, 0), datetime.datetime(2019, 4, 16, 0, 0), datetime.datetime(2019, 4, 17, 0, 0), datetime.datetime(2019, 4, 18, 0, 0), datetime.datetime(2019, 4, 19, 0, 0), datetime.datetime(2019, 4, 20, 0, 0), datetime.datetime(2019, 4, 21, 0, 0), datetime.datetime(2019, 4, 22, 0, 0), datetime.datetime(2019, 4, 23, 0, 0), datetime.datetime(2019, 4, 24, 0, 0), datetime.datetime(2019, 4, 25, 0, 0), datetime.datetime(2019, 4, 26, 0, 0), datetime.datetime(2019, 4, 27, 0, 0), datetime.datetime(2019, 4, 28, 0, 0), datetime.datetime(2019, 4, 29, 0, 0), datetime.datetime(2019, 4, 30, 0, 0), datetime.datetime(2019, 5, 1, 0, 0), datetime.datetime(2019, 5, 2, 0, 0), datetime.datetime(2019, 5, 3, 0, 0), datetime.datetime(2019, 5, 4, 0, 0), datetime.datetime(2019, 5, 5, 0, 0), datetime.datetime(2019, 5, 6, 0, 0), datetime.datetime(2019, 5, 7, 0, 0), datetime.datetime(2019, 5, 8, 0, 0), datetime.datetime(2019, 5, 9, 0, 0), datetime.datetime(2019, 5, 10, 0, 0), datetime.datetime(2019, 5, 11, 0, 0), datetime.datetime(2019, 5, 12, 0, 0), datetime.datetime(2019, 5, 13, 0, 0)], [0, 0, 0, 0, 0, 0, 0, 0, Decimal('3'), Decimal('4'), Decimal('3'), Decimal('5'), Decimal('5'), Decimal('8'), Decimal('9'), Decimal('11'), 0, Decimal('2'), Decimal('1'), Decimal('3'), Decimal('3'), Decimal('11'), Decimal('8'), Decimal('9'), Decimal('1'), Decimal('4'), Decimal('1'), Decimal('7'), Decimal('22'), Decimal('10'), Decimal('13'), Decimal('7'), Decimal('7'), Decimal('1'), Decimal('11'), Decimal('15'), Decimal('11'), Decimal('11'), Decimal('7'), Decimal('3'), Decimal('3'), Decimal('9'), Decimal('20'), Decimal('19'), Decimal('8'), Decimal('13'), Decimal('7'), Decimal('4'), Decimal('7'), Decimal('34'), Decimal('25'), Decimal('18'), Decimal('7'), Decimal('6'), Decimal('12'), Decimal('16'), Decimal('48'), Decimal('20'), Decimal('12'), Decimal('18'), Decimal('16'), Decimal('17'), Decimal('14'), Decimal('38'), Decimal('21'), Decimal('20'), Decimal('16'), Decimal('5'), Decimal('4'), Decimal('15'), Decimal('42'), Decimal('26'), Decimal('8'), Decimal('8'), Decimal('26'), Decimal('30'), Decimal('15'), Decimal('30'), Decimal('29'), Decimal('14'), Decimal('14'), Decimal('12'), Decimal('8'), Decimal('12'), Decimal('52'), Decimal('39'), Decimal('23'), Decimal('9'), Decimal('10'), Decimal('8'), Decimal('30'), Decimal('36'), Decimal('38'), Decimal('19'), Decimal('9'), Decimal('27'), Decimal('15'), Decimal('14'), Decimal('49'), Decimal('31'), Decimal('19'), Decimal('15'), Decimal('18'), Decimal('19'), Decimal('17'), Decimal('76'), Decimal('53'), Decimal('17'), Decimal('12'), Decimal('17'), Decimal('20'), Decimal('12'), Decimal('75'), Decimal('26'), Decimal('11'), Decimal('12'), Decimal('12'), Decimal('17'), Decimal('19'), Decimal('58'), Decimal('42'), Decimal('30'), Decimal('12'), Decimal('10'), Decimal('22'), Decimal('35'), Decimal('40'), Decimal('35'), Decimal('19'), Decimal('16'), Decimal('11'), Decimal('13'), Decimal('20'), Decimal('87'), Decimal('47'), Decimal('26'), Decimal('18'), Decimal('20'), Decimal('15'), Decimal('17'), Decimal('54'), Decimal('32'), Decimal('16'), Decimal('17'), Decimal('21'), Decimal('20'), Decimal('19'), Decimal('60'), Decimal('52'), Decimal('36'), Decimal('21'), Decimal('28'), Decimal('27'), Decimal('26'), Decimal('74'), Decimal('49'), Decimal('34'), Decimal('29'), Decimal('17'), Decimal('25'), Decimal('22'), Decimal('63'), Decimal('47'), Decimal('32'), Decimal('20'), Decimal('17'), Decimal('58'), Decimal('48'), Decimal('56'), Decimal('58'), Decimal('33'), Decimal('20'), Decimal('27'), Decimal('23'), Decimal('40'), Decimal('78'), Decimal('51'), Decimal('20'), Decimal('31'), Decimal('21'), Decimal('19'), Decimal('27'), Decimal('82'), Decimal('58'), Decimal('26'), Decimal('31'), Decimal('30'), Decimal('59'), Decimal('38'), Decimal('93'), Decimal('59'), Decimal('29'), Decimal('16'), Decimal('21'), Decimal('28'), Decimal('24'), Decimal('103'), Decimal('73'), Decimal('55'), Decimal('29'), Decimal('16'), Decimal('18'), Decimal('27'), Decimal('109'), Decimal('74'), Decimal('30'), Decimal('25'), Decimal('28'), Decimal('21'), Decimal('28'), Decimal('109'), Decimal('91'), Decimal('36'), Decimal('49'), Decimal('39'), Decimal('28'), Decimal('29'), Decimal('120'), Decimal('81'), Decimal('46'), Decimal('41'), Decimal('29'), Decimal('25'), Decimal('40'), Decimal('129'), Decimal('74'), Decimal('30'), Decimal('42'), Decimal('50'), Decimal('30'), Decimal('29'), Decimal('95'), Decimal('65'), Decimal('36'), Decimal('26'), Decimal('23'), Decimal('25'), Decimal('31'), Decimal('126'), Decimal('80'), Decimal('36'), Decimal('30'), Decimal('29'), Decimal('70'), Decimal('48'), Decimal('114'), Decimal('82'), Decimal('44'), Decimal('57'), Decimal('36'), Decimal('48'), Decimal('43'), Decimal('105'), Decimal('75'), Decimal('27'), Decimal('37'), Decimal('33'), Decimal('34'), Decimal('73'), Decimal('81'), Decimal('70'), Decimal('35'), Decimal('29'), Decimal('29'), Decimal('20'), Decimal('27'), Decimal('122'), Decimal('63'), Decimal('34'), Decimal('31'), Decimal('28'), Decimal('30'), Decimal('46'), Decimal('107'), Decimal('93'), Decimal('44'), Decimal('34'), Decimal('29'), Decimal('82'), Decimal('55'), Decimal('90'), Decimal('71'), Decimal('41'), Decimal('36'), Decimal('19'), Decimal('21'), Decimal('40'), Decimal('130'), Decimal('72'), Decimal('66'), Decimal('45'), Decimal('29'), Decimal('35'), Decimal('34'), Decimal('105'), Decimal('90'), Decimal('36'), Decimal('28'), Decimal('33'), Decimal('39'), Decimal('37'), Decimal('141'), Decimal('80'), Decimal('34'), Decimal('43'), Decimal('53'), Decimal('29'), Decimal('38'), Decimal('120'), Decimal('76'), Decimal('45'), Decimal('20'), Decimal('27'), Decimal('31'), Decimal('41'), Decimal('224'), Decimal('104'), Decimal('35'), Decimal('35'), Decimal('89'), Decimal('66'), Decimal('36'), Decimal('81'), Decimal('65'), Decimal('38'), Decimal('29'), Decimal('37'), Decimal('40'), Decimal('36'), Decimal('156'), Decimal('88'), Decimal('37'), Decimal('38'), Decimal('36'), Decimal('40'), Decimal('94'), Decimal('133'), Decimal('129'), Decimal('49'), Decimal('25'), Decimal('92'), Decimal('66'), Decimal('42'), Decimal('130'), Decimal('93'), Decimal('44'), Decimal('37'), Decimal('32'), Decimal('34'), Decimal('43'), Decimal('155'), Decimal('93'), Decimal('62'), Decimal('23'), Decimal('26'), Decimal('24'), Decimal('34'), Decimal('170'), Decimal('92'), Decimal('38'), Decimal('37'), Decimal('31'), Decimal('45'), Decimal('33'), Decimal('168'), Decimal('126'), Decimal('45'), Decimal('35'), Decimal('97'), Decimal('90'), Decimal('46'), Decimal('115'), Decimal('87'), Decimal('33'), Decimal('26'), Decimal('15'), Decimal('26'), Decimal('33'), Decimal('154'), Decimal('92'), Decimal('40'), Decimal('26'), Decimal('26'), Decimal('31'), Decimal('27'), Decimal('141'), Decimal('78'), Decimal('31'), Decimal('29'), Decimal('24'), Decimal('45'), Decimal('48'), Decimal('110'), Decimal('114'), Decimal('59'), Decimal('42'), Decimal('56'), Decimal('38'), Decimal('30'), Decimal('93'), Decimal('95'), Decimal('48'), Decimal('26'), Decimal('26'), Decimal('38'), Decimal('34'), Decimal('114'), Decimal('77'), Decimal('43'), Decimal('39'), Decimal('44'), Decimal('40'), Decimal('46'), Decimal('72'), Decimal('58'), Decimal('38'), Decimal('33'), Decimal('22'), Decimal('27'), Decimal('47'), Decimal('84'), Decimal('79'), Decimal('44'), Decimal('31'), Decimal('36'), Decimal('63'), Decimal('64'), Decimal('119'), Decimal('50'), Decimal('43'), Decimal('27'), Decimal('22'), Decimal('41'), Decimal('47'), Decimal('86'), Decimal('64'), Decimal('38'), 0, 0]]

Чаще всего в billing retry уходят по четвергам.

Вероятно, выходят из billing retry в тот же день (проверить)

In [0]:
 

Отмена из Billing Retry по дням (Cancelled from Billing Retry)

Oy - количество ивентов.

Ox - дата, в которою произошел ивент.

In [478]:
show_plot(ubeats, datetime(2018, 3, 1), datetime.today(), ['Cancelled from Billing Retry'])
[[datetime.datetime(2018, 3, 1, 0, 0), datetime.datetime(2018, 3, 2, 0, 0), datetime.datetime(2018, 3, 3, 0, 0), datetime.datetime(2018, 3, 4, 0, 0), datetime.datetime(2018, 3, 5, 0, 0), datetime.datetime(2018, 3, 6, 0, 0), datetime.datetime(2018, 3, 7, 0, 0), datetime.datetime(2018, 3, 8, 0, 0), datetime.datetime(2018, 3, 9, 0, 0), datetime.datetime(2018, 3, 10, 0, 0), datetime.datetime(2018, 3, 11, 0, 0), datetime.datetime(2018, 3, 12, 0, 0), datetime.datetime(2018, 3, 13, 0, 0), datetime.datetime(2018, 3, 14, 0, 0), datetime.datetime(2018, 3, 15, 0, 0), datetime.datetime(2018, 3, 16, 0, 0), datetime.datetime(2018, 3, 17, 0, 0), datetime.datetime(2018, 3, 18, 0, 0), datetime.datetime(2018, 3, 19, 0, 0), datetime.datetime(2018, 3, 20, 0, 0), datetime.datetime(2018, 3, 21, 0, 0), datetime.datetime(2018, 3, 22, 0, 0), datetime.datetime(2018, 3, 23, 0, 0), datetime.datetime(2018, 3, 24, 0, 0), datetime.datetime(2018, 3, 25, 0, 0), datetime.datetime(2018, 3, 26, 0, 0), datetime.datetime(2018, 3, 27, 0, 0), datetime.datetime(2018, 3, 28, 0, 0), datetime.datetime(2018, 3, 29, 0, 0), datetime.datetime(2018, 3, 30, 0, 0), datetime.datetime(2018, 3, 31, 0, 0), datetime.datetime(2018, 4, 1, 0, 0), datetime.datetime(2018, 4, 2, 0, 0), datetime.datetime(2018, 4, 3, 0, 0), datetime.datetime(2018, 4, 4, 0, 0), datetime.datetime(2018, 4, 5, 0, 0), datetime.datetime(2018, 4, 6, 0, 0), datetime.datetime(2018, 4, 7, 0, 0), datetime.datetime(2018, 4, 8, 0, 0), datetime.datetime(2018, 4, 9, 0, 0), datetime.datetime(2018, 4, 10, 0, 0), datetime.datetime(2018, 4, 11, 0, 0), datetime.datetime(2018, 4, 12, 0, 0), datetime.datetime(2018, 4, 13, 0, 0), datetime.datetime(2018, 4, 14, 0, 0), datetime.datetime(2018, 4, 15, 0, 0), datetime.datetime(2018, 4, 16, 0, 0), datetime.datetime(2018, 4, 17, 0, 0), datetime.datetime(2018, 4, 18, 0, 0), datetime.datetime(2018, 4, 19, 0, 0), datetime.datetime(2018, 4, 20, 0, 0), datetime.datetime(2018, 4, 21, 0, 0), datetime.datetime(2018, 4, 22, 0, 0), datetime.datetime(2018, 4, 23, 0, 0), datetime.datetime(2018, 4, 24, 0, 0), datetime.datetime(2018, 4, 25, 0, 0), datetime.datetime(2018, 4, 26, 0, 0), datetime.datetime(2018, 4, 27, 0, 0), datetime.datetime(2018, 4, 28, 0, 0), datetime.datetime(2018, 4, 29, 0, 0), datetime.datetime(2018, 4, 30, 0, 0), datetime.datetime(2018, 5, 1, 0, 0), datetime.datetime(2018, 5, 2, 0, 0), datetime.datetime(2018, 5, 3, 0, 0), datetime.datetime(2018, 5, 4, 0, 0), datetime.datetime(2018, 5, 5, 0, 0), datetime.datetime(2018, 5, 6, 0, 0), datetime.datetime(2018, 5, 7, 0, 0), datetime.datetime(2018, 5, 8, 0, 0), datetime.datetime(2018, 5, 9, 0, 0), datetime.datetime(2018, 5, 10, 0, 0), datetime.datetime(2018, 5, 11, 0, 0), datetime.datetime(2018, 5, 12, 0, 0), datetime.datetime(2018, 5, 13, 0, 0), datetime.datetime(2018, 5, 14, 0, 0), datetime.datetime(2018, 5, 15, 0, 0), datetime.datetime(2018, 5, 16, 0, 0), datetime.datetime(2018, 5, 17, 0, 0), datetime.datetime(2018, 5, 18, 0, 0), datetime.datetime(2018, 5, 19, 0, 0), datetime.datetime(2018, 5, 20, 0, 0), datetime.datetime(2018, 5, 21, 0, 0), datetime.datetime(2018, 5, 22, 0, 0), datetime.datetime(2018, 5, 23, 0, 0), datetime.datetime(2018, 5, 24, 0, 0), datetime.datetime(2018, 5, 25, 0, 0), datetime.datetime(2018, 5, 26, 0, 0), datetime.datetime(2018, 5, 27, 0, 0), datetime.datetime(2018, 5, 28, 0, 0), datetime.datetime(2018, 5, 29, 0, 0), datetime.datetime(2018, 5, 30, 0, 0), datetime.datetime(2018, 5, 31, 0, 0), datetime.datetime(2018, 6, 1, 0, 0), datetime.datetime(2018, 6, 2, 0, 0), datetime.datetime(2018, 6, 3, 0, 0), datetime.datetime(2018, 6, 4, 0, 0), datetime.datetime(2018, 6, 5, 0, 0), datetime.datetime(2018, 6, 6, 0, 0), datetime.datetime(2018, 6, 7, 0, 0), datetime.datetime(2018, 6, 8, 0, 0), datetime.datetime(2018, 6, 9, 0, 0), datetime.datetime(2018, 6, 10, 0, 0), datetime.datetime(2018, 6, 11, 0, 0), datetime.datetime(2018, 6, 12, 0, 0), datetime.datetime(2018, 6, 13, 0, 0), datetime.datetime(2018, 6, 14, 0, 0), datetime.datetime(2018, 6, 15, 0, 0), datetime.datetime(2018, 6, 16, 0, 0), datetime.datetime(2018, 6, 17, 0, 0), datetime.datetime(2018, 6, 18, 0, 0), datetime.datetime(2018, 6, 19, 0, 0), datetime.datetime(2018, 6, 20, 0, 0), datetime.datetime(2018, 6, 21, 0, 0), datetime.datetime(2018, 6, 22, 0, 0), datetime.datetime(2018, 6, 23, 0, 0), datetime.datetime(2018, 6, 24, 0, 0), datetime.datetime(2018, 6, 25, 0, 0), datetime.datetime(2018, 6, 26, 0, 0), datetime.datetime(2018, 6, 27, 0, 0), datetime.datetime(2018, 6, 28, 0, 0), datetime.datetime(2018, 6, 29, 0, 0), datetime.datetime(2018, 6, 30, 0, 0), datetime.datetime(2018, 7, 1, 0, 0), datetime.datetime(2018, 7, 2, 0, 0), datetime.datetime(2018, 7, 3, 0, 0), datetime.datetime(2018, 7, 4, 0, 0), datetime.datetime(2018, 7, 5, 0, 0), datetime.datetime(2018, 7, 6, 0, 0), datetime.datetime(2018, 7, 7, 0, 0), datetime.datetime(2018, 7, 8, 0, 0), datetime.datetime(2018, 7, 9, 0, 0), datetime.datetime(2018, 7, 10, 0, 0), datetime.datetime(2018, 7, 11, 0, 0), datetime.datetime(2018, 7, 12, 0, 0), datetime.datetime(2018, 7, 13, 0, 0), datetime.datetime(2018, 7, 14, 0, 0), datetime.datetime(2018, 7, 15, 0, 0), datetime.datetime(2018, 7, 16, 0, 0), datetime.datetime(2018, 7, 17, 0, 0), datetime.datetime(2018, 7, 18, 0, 0), datetime.datetime(2018, 7, 19, 0, 0), datetime.datetime(2018, 7, 20, 0, 0), datetime.datetime(2018, 7, 21, 0, 0), datetime.datetime(2018, 7, 22, 0, 0), datetime.datetime(2018, 7, 23, 0, 0), datetime.datetime(2018, 7, 24, 0, 0), datetime.datetime(2018, 7, 25, 0, 0), datetime.datetime(2018, 7, 26, 0, 0), datetime.datetime(2018, 7, 27, 0, 0), datetime.datetime(2018, 7, 28, 0, 0), datetime.datetime(2018, 7, 29, 0, 0), datetime.datetime(2018, 7, 30, 0, 0), datetime.datetime(2018, 7, 31, 0, 0), datetime.datetime(2018, 8, 1, 0, 0), datetime.datetime(2018, 8, 2, 0, 0), datetime.datetime(2018, 8, 3, 0, 0), datetime.datetime(2018, 8, 4, 0, 0), datetime.datetime(2018, 8, 5, 0, 0), datetime.datetime(2018, 8, 6, 0, 0), datetime.datetime(2018, 8, 7, 0, 0), datetime.datetime(2018, 8, 8, 0, 0), datetime.datetime(2018, 8, 9, 0, 0), datetime.datetime(2018, 8, 10, 0, 0), datetime.datetime(2018, 8, 11, 0, 0), datetime.datetime(2018, 8, 12, 0, 0), datetime.datetime(2018, 8, 13, 0, 0), datetime.datetime(2018, 8, 14, 0, 0), datetime.datetime(2018, 8, 15, 0, 0), datetime.datetime(2018, 8, 16, 0, 0), datetime.datetime(2018, 8, 17, 0, 0), datetime.datetime(2018, 8, 18, 0, 0), datetime.datetime(2018, 8, 19, 0, 0), datetime.datetime(2018, 8, 20, 0, 0), datetime.datetime(2018, 8, 21, 0, 0), datetime.datetime(2018, 8, 22, 0, 0), datetime.datetime(2018, 8, 23, 0, 0), datetime.datetime(2018, 8, 24, 0, 0), datetime.datetime(2018, 8, 25, 0, 0), datetime.datetime(2018, 8, 26, 0, 0), datetime.datetime(2018, 8, 27, 0, 0), datetime.datetime(2018, 8, 28, 0, 0), datetime.datetime(2018, 8, 29, 0, 0), datetime.datetime(2018, 8, 30, 0, 0), datetime.datetime(2018, 8, 31, 0, 0), datetime.datetime(2018, 9, 1, 0, 0), datetime.datetime(2018, 9, 2, 0, 0), datetime.datetime(2018, 9, 3, 0, 0), datetime.datetime(2018, 9, 4, 0, 0), datetime.datetime(2018, 9, 5, 0, 0), datetime.datetime(2018, 9, 6, 0, 0), datetime.datetime(2018, 9, 7, 0, 0), datetime.datetime(2018, 9, 8, 0, 0), datetime.datetime(2018, 9, 9, 0, 0), datetime.datetime(2018, 9, 10, 0, 0), datetime.datetime(2018, 9, 11, 0, 0), datetime.datetime(2018, 9, 12, 0, 0), datetime.datetime(2018, 9, 13, 0, 0), datetime.datetime(2018, 9, 14, 0, 0), datetime.datetime(2018, 9, 15, 0, 0), datetime.datetime(2018, 9, 16, 0, 0), datetime.datetime(2018, 9, 17, 0, 0), datetime.datetime(2018, 9, 18, 0, 0), datetime.datetime(2018, 9, 19, 0, 0), datetime.datetime(2018, 9, 20, 0, 0), datetime.datetime(2018, 9, 21, 0, 0), datetime.datetime(2018, 9, 22, 0, 0), datetime.datetime(2018, 9, 23, 0, 0), datetime.datetime(2018, 9, 24, 0, 0), datetime.datetime(2018, 9, 25, 0, 0), datetime.datetime(2018, 9, 26, 0, 0), datetime.datetime(2018, 9, 27, 0, 0), datetime.datetime(2018, 9, 28, 0, 0), datetime.datetime(2018, 9, 29, 0, 0), datetime.datetime(2018, 9, 30, 0, 0), datetime.datetime(2018, 10, 1, 0, 0), datetime.datetime(2018, 10, 2, 0, 0), datetime.datetime(2018, 10, 3, 0, 0), datetime.datetime(2018, 10, 4, 0, 0), datetime.datetime(2018, 10, 5, 0, 0), datetime.datetime(2018, 10, 6, 0, 0), datetime.datetime(2018, 10, 7, 0, 0), datetime.datetime(2018, 10, 8, 0, 0), datetime.datetime(2018, 10, 9, 0, 0), datetime.datetime(2018, 10, 10, 0, 0), datetime.datetime(2018, 10, 11, 0, 0), datetime.datetime(2018, 10, 12, 0, 0), datetime.datetime(2018, 10, 13, 0, 0), datetime.datetime(2018, 10, 14, 0, 0), datetime.datetime(2018, 10, 15, 0, 0), datetime.datetime(2018, 10, 16, 0, 0), datetime.datetime(2018, 10, 17, 0, 0), datetime.datetime(2018, 10, 18, 0, 0), datetime.datetime(2018, 10, 19, 0, 0), datetime.datetime(2018, 10, 20, 0, 0), datetime.datetime(2018, 10, 21, 0, 0), datetime.datetime(2018, 10, 22, 0, 0), datetime.datetime(2018, 10, 23, 0, 0), datetime.datetime(2018, 10, 24, 0, 0), datetime.datetime(2018, 10, 25, 0, 0), datetime.datetime(2018, 10, 26, 0, 0), datetime.datetime(2018, 10, 27, 0, 0), datetime.datetime(2018, 10, 28, 0, 0), datetime.datetime(2018, 10, 29, 0, 0), datetime.datetime(2018, 10, 30, 0, 0), datetime.datetime(2018, 10, 31, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 11, 2, 0, 0), datetime.datetime(2018, 11, 3, 0, 0), datetime.datetime(2018, 11, 4, 0, 0), datetime.datetime(2018, 11, 5, 0, 0), datetime.datetime(2018, 11, 6, 0, 0), datetime.datetime(2018, 11, 7, 0, 0), datetime.datetime(2018, 11, 8, 0, 0), datetime.datetime(2018, 11, 9, 0, 0), datetime.datetime(2018, 11, 10, 0, 0), datetime.datetime(2018, 11, 11, 0, 0), datetime.datetime(2018, 11, 12, 0, 0), datetime.datetime(2018, 11, 13, 0, 0), datetime.datetime(2018, 11, 14, 0, 0), datetime.datetime(2018, 11, 15, 0, 0), datetime.datetime(2018, 11, 16, 0, 0), datetime.datetime(2018, 11, 17, 0, 0), datetime.datetime(2018, 11, 18, 0, 0), datetime.datetime(2018, 11, 19, 0, 0), datetime.datetime(2018, 11, 20, 0, 0), datetime.datetime(2018, 11, 21, 0, 0), datetime.datetime(2018, 11, 22, 0, 0), datetime.datetime(2018, 11, 23, 0, 0), datetime.datetime(2018, 11, 24, 0, 0), datetime.datetime(2018, 11, 25, 0, 0), datetime.datetime(2018, 11, 26, 0, 0), datetime.datetime(2018, 11, 27, 0, 0), datetime.datetime(2018, 11, 28, 0, 0), datetime.datetime(2018, 11, 29, 0, 0), datetime.datetime(2018, 11, 30, 0, 0), datetime.datetime(2018, 12, 1, 0, 0), datetime.datetime(2018, 12, 2, 0, 0), datetime.datetime(2018, 12, 3, 0, 0), datetime.datetime(2018, 12, 4, 0, 0), datetime.datetime(2018, 12, 5, 0, 0), datetime.datetime(2018, 12, 6, 0, 0), datetime.datetime(2018, 12, 7, 0, 0), datetime.datetime(2018, 12, 8, 0, 0), datetime.datetime(2018, 12, 9, 0, 0), datetime.datetime(2018, 12, 10, 0, 0), datetime.datetime(2018, 12, 11, 0, 0), datetime.datetime(2018, 12, 12, 0, 0), datetime.datetime(2018, 12, 13, 0, 0), datetime.datetime(2018, 12, 14, 0, 0), datetime.datetime(2018, 12, 15, 0, 0), datetime.datetime(2018, 12, 16, 0, 0), datetime.datetime(2018, 12, 17, 0, 0), datetime.datetime(2018, 12, 18, 0, 0), datetime.datetime(2018, 12, 19, 0, 0), datetime.datetime(2018, 12, 20, 0, 0), datetime.datetime(2018, 12, 21, 0, 0), datetime.datetime(2018, 12, 22, 0, 0), datetime.datetime(2018, 12, 23, 0, 0), datetime.datetime(2018, 12, 24, 0, 0), datetime.datetime(2018, 12, 25, 0, 0), datetime.datetime(2018, 12, 26, 0, 0), datetime.datetime(2018, 12, 27, 0, 0), datetime.datetime(2018, 12, 28, 0, 0), datetime.datetime(2018, 12, 29, 0, 0), datetime.datetime(2018, 12, 30, 0, 0), datetime.datetime(2018, 12, 31, 0, 0), datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 1, 2, 0, 0), datetime.datetime(2019, 1, 3, 0, 0), datetime.datetime(2019, 1, 4, 0, 0), datetime.datetime(2019, 1, 5, 0, 0), datetime.datetime(2019, 1, 6, 0, 0), datetime.datetime(2019, 1, 7, 0, 0), datetime.datetime(2019, 1, 8, 0, 0), datetime.datetime(2019, 1, 9, 0, 0), datetime.datetime(2019, 1, 10, 0, 0), datetime.datetime(2019, 1, 11, 0, 0), datetime.datetime(2019, 1, 12, 0, 0), datetime.datetime(2019, 1, 13, 0, 0), datetime.datetime(2019, 1, 14, 0, 0), datetime.datetime(2019, 1, 15, 0, 0), datetime.datetime(2019, 1, 16, 0, 0), datetime.datetime(2019, 1, 17, 0, 0), datetime.datetime(2019, 1, 18, 0, 0), datetime.datetime(2019, 1, 19, 0, 0), datetime.datetime(2019, 1, 20, 0, 0), datetime.datetime(2019, 1, 21, 0, 0), datetime.datetime(2019, 1, 22, 0, 0), datetime.datetime(2019, 1, 23, 0, 0), datetime.datetime(2019, 1, 24, 0, 0), datetime.datetime(2019, 1, 25, 0, 0), datetime.datetime(2019, 1, 26, 0, 0), datetime.datetime(2019, 1, 27, 0, 0), datetime.datetime(2019, 1, 28, 0, 0), datetime.datetime(2019, 1, 29, 0, 0), datetime.datetime(2019, 1, 30, 0, 0), datetime.datetime(2019, 1, 31, 0, 0), datetime.datetime(2019, 2, 1, 0, 0), datetime.datetime(2019, 2, 2, 0, 0), datetime.datetime(2019, 2, 3, 0, 0), datetime.datetime(2019, 2, 4, 0, 0), datetime.datetime(2019, 2, 5, 0, 0), datetime.datetime(2019, 2, 6, 0, 0), datetime.datetime(2019, 2, 7, 0, 0), datetime.datetime(2019, 2, 8, 0, 0), datetime.datetime(2019, 2, 9, 0, 0), datetime.datetime(2019, 2, 10, 0, 0), datetime.datetime(2019, 2, 11, 0, 0), datetime.datetime(2019, 2, 12, 0, 0), datetime.datetime(2019, 2, 13, 0, 0), datetime.datetime(2019, 2, 14, 0, 0), datetime.datetime(2019, 2, 15, 0, 0), datetime.datetime(2019, 2, 16, 0, 0), datetime.datetime(2019, 2, 17, 0, 0), datetime.datetime(2019, 2, 18, 0, 0), datetime.datetime(2019, 2, 19, 0, 0), datetime.datetime(2019, 2, 20, 0, 0), datetime.datetime(2019, 2, 21, 0, 0), datetime.datetime(2019, 2, 22, 0, 0), datetime.datetime(2019, 2, 23, 0, 0), datetime.datetime(2019, 2, 24, 0, 0), datetime.datetime(2019, 2, 25, 0, 0), datetime.datetime(2019, 2, 26, 0, 0), datetime.datetime(2019, 2, 27, 0, 0), datetime.datetime(2019, 2, 28, 0, 0), datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 3, 2, 0, 0), datetime.datetime(2019, 3, 3, 0, 0), datetime.datetime(2019, 3, 4, 0, 0), datetime.datetime(2019, 3, 5, 0, 0), datetime.datetime(2019, 3, 6, 0, 0), datetime.datetime(2019, 3, 7, 0, 0), datetime.datetime(2019, 3, 8, 0, 0), datetime.datetime(2019, 3, 9, 0, 0), datetime.datetime(2019, 3, 10, 0, 0), datetime.datetime(2019, 3, 11, 0, 0), datetime.datetime(2019, 3, 12, 0, 0), datetime.datetime(2019, 3, 13, 0, 0), datetime.datetime(2019, 3, 14, 0, 0), datetime.datetime(2019, 3, 15, 0, 0), datetime.datetime(2019, 3, 16, 0, 0), datetime.datetime(2019, 3, 17, 0, 0), datetime.datetime(2019, 3, 18, 0, 0), datetime.datetime(2019, 3, 19, 0, 0), datetime.datetime(2019, 3, 20, 0, 0), datetime.datetime(2019, 3, 21, 0, 0), datetime.datetime(2019, 3, 22, 0, 0), datetime.datetime(2019, 3, 23, 0, 0), datetime.datetime(2019, 3, 24, 0, 0), datetime.datetime(2019, 3, 25, 0, 0), datetime.datetime(2019, 3, 26, 0, 0), datetime.datetime(2019, 3, 27, 0, 0), datetime.datetime(2019, 3, 28, 0, 0), datetime.datetime(2019, 3, 29, 0, 0), datetime.datetime(2019, 3, 30, 0, 0), datetime.datetime(2019, 3, 31, 0, 0), datetime.datetime(2019, 4, 1, 0, 0), datetime.datetime(2019, 4, 2, 0, 0), datetime.datetime(2019, 4, 3, 0, 0), datetime.datetime(2019, 4, 4, 0, 0), datetime.datetime(2019, 4, 5, 0, 0), datetime.datetime(2019, 4, 6, 0, 0), datetime.datetime(2019, 4, 7, 0, 0), datetime.datetime(2019, 4, 8, 0, 0), datetime.datetime(2019, 4, 9, 0, 0), datetime.datetime(2019, 4, 10, 0, 0), datetime.datetime(2019, 4, 11, 0, 0), datetime.datetime(2019, 4, 12, 0, 0), datetime.datetime(2019, 4, 13, 0, 0), datetime.datetime(2019, 4, 14, 0, 0), datetime.datetime(2019, 4, 15, 0, 0), datetime.datetime(2019, 4, 16, 0, 0), datetime.datetime(2019, 4, 17, 0, 0), datetime.datetime(2019, 4, 18, 0, 0), datetime.datetime(2019, 4, 19, 0, 0), datetime.datetime(2019, 4, 20, 0, 0), datetime.datetime(2019, 4, 21, 0, 0), datetime.datetime(2019, 4, 22, 0, 0), datetime.datetime(2019, 4, 23, 0, 0), datetime.datetime(2019, 4, 24, 0, 0), datetime.datetime(2019, 4, 25, 0, 0), datetime.datetime(2019, 4, 26, 0, 0), datetime.datetime(2019, 4, 27, 0, 0), datetime.datetime(2019, 4, 28, 0, 0), datetime.datetime(2019, 4, 29, 0, 0), datetime.datetime(2019, 4, 30, 0, 0), datetime.datetime(2019, 5, 1, 0, 0), datetime.datetime(2019, 5, 2, 0, 0), datetime.datetime(2019, 5, 3, 0, 0), datetime.datetime(2019, 5, 4, 0, 0), datetime.datetime(2019, 5, 5, 0, 0), datetime.datetime(2019, 5, 6, 0, 0), datetime.datetime(2019, 5, 7, 0, 0), datetime.datetime(2019, 5, 8, 0, 0), datetime.datetime(2019, 5, 9, 0, 0), datetime.datetime(2019, 5, 10, 0, 0), datetime.datetime(2019, 5, 11, 0, 0), datetime.datetime(2019, 5, 12, 0, 0), datetime.datetime(2019, 5, 13, 0, 0)], [0, 0, 0, 0, 0, 0, 0, 0, 0, Decimal('4'), Decimal('1'), Decimal('2'), Decimal('1'), Decimal('5'), Decimal('3'), Decimal('4'), 0, Decimal('3'), Decimal('4'), Decimal('3'), Decimal('2'), Decimal('5'), Decimal('1'), Decimal('1'), Decimal('6'), 0, Decimal('3'), Decimal('6'), Decimal('4'), Decimal('3'), Decimal('4'), Decimal('2'), Decimal('5'), Decimal('3'), Decimal('5'), Decimal('2'), Decimal('3'), Decimal('2'), Decimal('1'), Decimal('4'), Decimal('5'), Decimal('8'), Decimal('4'), Decimal('3'), Decimal('5'), Decimal('8'), Decimal('3'), Decimal('7'), Decimal('8'), Decimal('6'), Decimal('11'), Decimal('6'), Decimal('6'), Decimal('18'), Decimal('13'), Decimal('16'), Decimal('142'), Decimal('49'), Decimal('16'), Decimal('8'), Decimal('12'), Decimal('12'), Decimal('16'), Decimal('14'), Decimal('11'), Decimal('7'), Decimal('9'), Decimal('11'), Decimal('6'), Decimal('13'), Decimal('16'), Decimal('10'), Decimal('8'), Decimal('14'), Decimal('10'), Decimal('13'), Decimal('20'), Decimal('7'), Decimal('10'), Decimal('10'), Decimal('10'), Decimal('10'), Decimal('8'), Decimal('10'), Decimal('22'), Decimal('13'), Decimal('11'), Decimal('23'), Decimal('15'), Decimal('12'), Decimal('14'), Decimal('12'), Decimal('12'), Decimal('20'), Decimal('14'), Decimal('12'), Decimal('17'), Decimal('19'), Decimal('21'), Decimal('14'), Decimal('16'), Decimal('20'), Decimal('17'), Decimal('16'), Decimal('20'), Decimal('31'), Decimal('25'), Decimal('37'), Decimal('38'), Decimal('38'), Decimal('33'), Decimal('36'), Decimal('45'), Decimal('31'), Decimal('47'), Decimal('51'), Decimal('25'), Decimal('29'), Decimal('15'), Decimal('23'), Decimal('21'), Decimal('20'), Decimal('25'), Decimal('23'), Decimal('22'), Decimal('17'), Decimal('10'), Decimal('22'), Decimal('22'), Decimal('20'), Decimal('24'), Decimal('18'), Decimal('18'), Decimal('28'), Decimal('11'), Decimal('15'), Decimal('28'), Decimal('17'), Decimal('19'), Decimal('11'), Decimal('18'), Decimal('32'), Decimal('37'), Decimal('31'), Decimal('25'), Decimal('36'), Decimal('33'), Decimal('38'), Decimal('29'), Decimal('27'), Decimal('22'), Decimal('28'), Decimal('35'), Decimal('23'), Decimal('21'), Decimal('41'), Decimal('40'), Decimal('40'), Decimal('36'), Decimal('35'), Decimal('29'), Decimal('32'), Decimal('35'), Decimal('23'), Decimal('15'), Decimal('18'), Decimal('34'), Decimal('34'), Decimal('28'), Decimal('34'), Decimal('28'), Decimal('24'), Decimal('26'), Decimal('30'), Decimal('42'), Decimal('30'), Decimal('30'), Decimal('35'), Decimal('25'), Decimal('29'), Decimal('26'), Decimal('30'), Decimal('29'), Decimal('23'), Decimal('20'), Decimal('27'), Decimal('47'), Decimal('35'), Decimal('25'), Decimal('28'), Decimal('18'), Decimal('21'), Decimal('34'), Decimal('36'), Decimal('28'), Decimal('27'), Decimal('32'), Decimal('29'), Decimal('32'), Decimal('28'), Decimal('50'), Decimal('39'), Decimal('37'), Decimal('41'), Decimal('33'), Decimal('30'), Decimal('45'), Decimal('45'), Decimal('41'), Decimal('37'), Decimal('32'), Decimal('26'), Decimal('33'), Decimal('42'), Decimal('54'), Decimal('37'), Decimal('34'), Decimal('36'), Decimal('29'), Decimal('37'), Decimal('52'), Decimal('47'), Decimal('39'), Decimal('49'), Decimal('60'), Decimal('40'), Decimal('34'), Decimal('41'), Decimal('60'), Decimal('54'), Decimal('29'), Decimal('42'), Decimal('30'), Decimal('49'), Decimal('50'), Decimal('50'), Decimal('55'), Decimal('43'), Decimal('39'), Decimal('34'), Decimal('46'), Decimal('51'), Decimal('54'), Decimal('38'), Decimal('38'), Decimal('60'), Decimal('83'), Decimal('61'), Decimal('86'), Decimal('75'), Decimal('52'), Decimal('58'), Decimal('53'), Decimal('60'), Decimal('67'), Decimal('74'), Decimal('83'), Decimal('61'), Decimal('50'), Decimal('63'), Decimal('45'), Decimal('48'), Decimal('61'), Decimal('65'), Decimal('38'), Decimal('66'), Decimal('57'), Decimal('56'), Decimal('54'), Decimal('58'), Decimal('59'), Decimal('61'), Decimal('52'), Decimal('78'), Decimal('60'), Decimal('43'), Decimal('71'), Decimal('68'), Decimal('71'), Decimal('72'), Decimal('69'), Decimal('73'), Decimal('64'), Decimal('70'), Decimal('93'), Decimal('71'), Decimal('78'), Decimal('68'), Decimal('76'), Decimal('79'), Decimal('92'), Decimal('95'), Decimal('77'), Decimal('57'), Decimal('83'), Decimal('63'), Decimal('53'), Decimal('67'), Decimal('94'), Decimal('62'), Decimal('56'), Decimal('55'), Decimal('65'), Decimal('50'), Decimal('46'), Decimal('73'), Decimal('50'), Decimal('62'), Decimal('50'), Decimal('50'), Decimal('60'), Decimal('70'), Decimal('77'), Decimal('61'), Decimal('47'), Decimal('58'), Decimal('48'), Decimal('46'), Decimal('39'), Decimal('83'), Decimal('57'), Decimal('53'), Decimal('62'), Decimal('59'), Decimal('56'), Decimal('66'), Decimal('65'), Decimal('79'), Decimal('66'), Decimal('66'), Decimal('52'), Decimal('65'), Decimal('60'), Decimal('67'), Decimal('62'), Decimal('60'), Decimal('63'), Decimal('60'), Decimal('62'), Decimal('61'), Decimal('73'), Decimal('84'), Decimal('70'), Decimal('80'), Decimal('79'), Decimal('87'), Decimal('87'), Decimal('66'), Decimal('70'), Decimal('76'), Decimal('78'), Decimal('61'), Decimal('55'), Decimal('65'), Decimal('76'), Decimal('69'), Decimal('51'), Decimal('71'), Decimal('60'), Decimal('53'), Decimal('58'), Decimal('74'), Decimal('82'), Decimal('57'), Decimal('48'), Decimal('75'), Decimal('67'), Decimal('69'), Decimal('78'), Decimal('72'), Decimal('73'), Decimal('85'), Decimal('81'), Decimal('80'), Decimal('75'), Decimal('75'), Decimal('63'), Decimal('69'), Decimal('68'), Decimal('67'), Decimal('68'), Decimal('96'), Decimal('79'), Decimal('94'), Decimal('70'), Decimal('59'), Decimal('62'), Decimal('71'), Decimal('62'), Decimal('67'), Decimal('51'), Decimal('64'), Decimal('58'), Decimal('68'), Decimal('75'), Decimal('78'), Decimal('72'), Decimal('96'), Decimal('68'), Decimal('94'), Decimal('59'), Decimal('69'), Decimal('76'), Decimal('69'), Decimal('46'), Decimal('68'), Decimal('91'), Decimal('90'), Decimal('63'), Decimal('88'), Decimal('72'), Decimal('64'), Decimal('64'), Decimal('53'), Decimal('58'), Decimal('66'), Decimal('73'), Decimal('75'), Decimal('56'), Decimal('49'), Decimal('63'), Decimal('51'), Decimal('59'), Decimal('63'), Decimal('50'), Decimal('61'), Decimal('59'), Decimal('50'), Decimal('41'), Decimal('63'), Decimal('56'), Decimal('50'), Decimal('38'), Decimal('43'), Decimal('55'), Decimal('47'), Decimal('42'), 0, 0]]

Наблюдается аномалия 26-04-2018.

На первый взгляд, график не имеет периодической структуры.

Вероятность отмены подписки из Billing Retry по месяцам (Cancelled from Billing Retry)

In [0]:
def show_bar(df, start_date, events):
  c_d = start_date
  data = [[],[]]
  while c_d < datetime.today():
    e_d = c_d + relativedelta.relativedelta(months=1)
    
    billing_retry = df[(df['original_start_date'] > c_d) & (df['original_start_date'] < e_d) & (df['event'].isin(billing_retry_events))]['quantity'].sum()
    cancelled_from_billing_retry = df[(df['original_start_date'] > c_d) & (df['original_start_date'] < e_d) & (df['event'].isin(events))]['quantity'].sum()

    data[0].append(c_d.strftime("%m.%d.%Y"))
    data[1].append(cancelled_from_billing_retry/billing_retry)
    
    c_d = e_d
    
#   data.append()  
  fig = go.Figure(data=[go.Bar(x=data[0], y=data[1])])
  configure_plotly_browser_state()
  iplot(fig)
In [480]:
show_bar(ubeats, datetime(2018, 5, 1), ['Cancelled from Billing Retry'])

На диаграмме представлено какая часть пользователей, пришедших за определенный период (месяц), отменит подписку, в случае ухода в billing retry.

Вероятность продления подписки из Billing Retry по месяцам (Renewal from Billing Retry)

In [481]:
show_bar(ubeats, datetime(2018, 5, 1), ['Renewal from Billing Retry'])

не информативно

Анализ пользователей

Живые пользователи

In [0]:
def getAliveCount(df):
              
  alive = ( 
              df[(df['event'] == "Start Introductory Price")]["quantity"].sum() +
              df[(df['event'] == "Start Introductory Offer")]["quantity"].sum() +
              df[(df['event'] == "Reactivate")]["quantity"].sum() + 
              df[(df['event'] == "Reactivate with Crossgrade")]["quantity"].sum() +
              df[(df['event'] == "Reactivate with Introductory Price")]["quantity"].sum() +
              df[(df['event'] == "Subscribe")]["quantity"].sum() 
      
          ) - (
              df[(df['event'] == "Cancel")]["quantity"].sum() +
              df[(df['event'] == "Cancelled from Billing Retry")]["quantity"].sum()
          )
  return alive

def getBillingRetryCount(df):
  count = ( 
              df[(df['event'].isin(billing_retry_events))]["quantity"].sum()
          ) - (
              df[(df['event'] == "Cancelled from Billing Retry")]["quantity"].sum() +
              df[(df['event'] == "Renewal from Billing Retry")]["quantity"].sum()
          )
  return count
In [0]:
def show_bar(df, start_date, end_date):
  info = [{'alive': [], 'billing_retry': []}, []]
  data = []
  current_date = start_date
  while current_date < end_date:
    s_d = current_date
    e_d = current_date + relativedelta.relativedelta(months=1)
    info[1].append(s_d)
    info[0]['alive'].append(getAliveCount(df[(df['original_start_date'] >= s_d) & (df['original_start_date'] < e_d)]))
    info[0]['billing_retry'].append(getBillingRetryCount(df[(df['original_start_date'] >= s_d) & (df['original_start_date'] < e_d)]))
    current_date = e_d
  
  for name in info[0].keys():
    data.append(go.Bar(x=info[1], y=info[0][name], name=name))
  fig = go.Figure(data=data)
  configure_plotly_browser_state()
  iplot(fig)
In [484]:
show_bar(ubeats, datetime(2018, 4, 1), datetime.today())

Диаграмма показывает сколько активных пользователей осталось и сколько из них в billing retry. (по месяцам)

Вероятность покупки следующего периода подписки

по данным за все время

In [485]:
# without Refunds

data = []

group = ubeats[(ubeats['event'].isin(payment_events)) ]
group_refund = ubeats[(ubeats['event'] == 'Refund')]


trials = df[df['event'] == 'Start Introductory Price']['quantity'].sum()
values = [1, ]
for j in range(1, 30):
  count_2 = group[(group['consecutive_paid_periods'] == j)]['quantity'].sum()
  refund = group_refund[(group_refund['consecutive_paid_periods'] == j)]['quantity'].sum()
  values.append((count_2 - refund) / trials)
data.append(go.Scatter(x = list(range(len(values))), y = values, name='trials'))


for i in range(1, 15):
  count = group[(group['consecutive_paid_periods'] == i)]['quantity'].sum()
  count_refund = group_refund[(group_refund['consecutive_paid_periods'] == i)]['quantity'].sum()
  values = []
  for j in range(i, 30):
    count_2 = group[(group['consecutive_paid_periods'] == j)]['quantity'].sum()
    refund = group_refund[(group_refund['consecutive_paid_periods'] == j)]['quantity'].sum()
    
    values.append((count_2 - refund) / (count - count_refund))
   
  data.append(go.Scatter(x = list(range(len(values))), y = values, name='{0}'.format(i)))
  
fig = go.Figure(data=data)
  
configure_plotly_browser_state()
iplot(fig)

Номер графика -- сколько подписок было куплено ранее.

Будем считать, что постоянный пользователь -- пользователь, который оплатил 4-е периода подписки (После 4-ого перидоа подписки, вероятность покупки следующей растет не больше чем на 1.5% )

По графику можно предположить, какая чать пользователей проживет еще N периодов.

Анализ качества платящих пользователей по странам

качеством страны будем считать:

  1. вероятность перехода от триала к покупке
  2. вероятность перехода от триала к постоянному пользователю
  3. вероятность перехода от первой покупки к постоянному пользователю

Будем рассматривать страны, в которых не менее 500 триалов.

In [0]:
groups = ubeats[(ubeats['event'].isin(trial_started_events))]

d = {}
for c, group in groups.groupby('country'):
  d[c] = group['quantity'].sum()

trials = pd.Series(d).sort_values(ascending=False)
countries = trials[trials > 500].keys()

trials = trials[countries]
In [0]:
# ubeats = df[(df['app_apple_id']== ubeats_app_id) & (df['event'].isin(events)) ]
# ubeats_refund = df[(df['app_apple_id']== ubeats_app_id) & (df['event'] == 'Refund')]

groups = ubeats[(ubeats['event'].isin(payment_events)) & (ubeats['consecutive_paid_periods'] == 1)]
groups_refund = ubeats[(ubeats['event'] == 'Refund') & (ubeats['consecutive_paid_periods'] == 1)]

d = {}
d_refund = {}

for c, group in groups.groupby('country'):
  d[c] = group['quantity'].sum()

for c, group in groups_refund.groupby('country'):
  d_refund[c] = group['quantity'].sum()
  
  
first_payments = pd.Series(d)[countries].sort_values(ascending=False).fillna(0)
first_payments_refund = pd.Series(d_refund)[countries].sort_values(ascending=False).fillna(0)
In [0]:
groups = ubeats[(ubeats['consecutive_paid_periods'] == 7) & (ubeats['event'].isin(payment_events))]
groups_refund = ubeats[(ubeats['event'] == 'Refund') & (ubeats['consecutive_paid_periods'] == 7)]


d = {}
d_refund = {}

for c, group in groups.groupby('country'):
  d[c] = group['quantity'].sum()

for c, group in groups_refund.groupby('country'):
  d_refund[c] = group['quantity'].sum()
  
  
regular_customers = pd.Series(d)[countries].sort_values(ascending=False).fillna(0)
regular_customers_refund = pd.Series(d_refund)[countries].fillna(0)

Вероятность перехода от триала к покупке (по странам)

за все время.

In [489]:
data = (regular_customers / trials).fillna(0).sort_values(ascending=False)
data_2 = ((regular_customers - regular_customers_refund) / trials).fillna(0).sort_values(ascending=False)

trace1 = go.Bar(
    x=data.keys(),
    y=data.values,
    name='with refund'
)

trace2 = go.Bar(
    x=data_2.keys(),
    y=data_2.values,
    name='without refund'
)

data = [trace1, trace2]
layout = go.Layout(
    barmode='group'
)

fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig)

На диаграмме представлены вероятности перехода триала в постоянного пользователя (по странам)

Вероятность перехода от триала к постоянному пользователю (по странам)

за все время.

In [490]:
data = (first_payments / trials).fillna(0).sort_values(ascending=False)
data_2 = ((first_payments - first_payments_refund) / trials).fillna(0).sort_values(ascending=False)

trace1 = go.Bar(
    x=data.keys(),
    y=data.values,
    name='with refund'
)

trace2 = go.Bar(
    x=data_2.keys(),
    y=data_2.values,
    name='without refund'
)

data = [trace1, trace2]
layout = go.Layout(
    barmode='group'
)

fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig)

На диаграмме представлены вероятности перехода триала в покупку (по странам)

Вероятность перехода от первой покупки к постоянному пользователю

за все время

In [491]:
data = (regular_customers / first_payments).fillna(0).sort_values(ascending=False)

# data = (regular_customers / trials).fillna(0).sort_values(ascending=False)

data_2 = ((regular_customers - regular_customers_refund) / first_payments).fillna(0).sort_values(ascending=False)

trace1 = go.Bar(
    x=data.keys(),
    y=data.values,
    name='with refund'
)

trace2 = go.Bar(
    x=data_2.keys(),
    y=data_2.values,
    name='without refund'
)

data = [trace1, trace2]
layout = go.Layout(
    barmode='group'
)

fig = go.Figure(data=data, layout=layout)

configure_plotly_browser_state()
iplot(fig)
In [0]:
 

Conversions

In [0]:
trials_mar = ubeats[(ubeats['original_start_date'] >= datetime(2019, 3, 1)) & (ubeats['original_start_date'] < datetime(2019, 4, 1)) & (ubeats['event'].isin(trial_started_events))]['quantity'].sum()
trials_apr = ubeats[(ubeats['original_start_date'] >= datetime(2019, 4, 1)) & (ubeats['original_start_date'] < datetime(2019, 4, 14)) & (ubeats['event'].isin(trial_started_events))]['quantity'].sum()
In [0]:
paying_users_mar = ubeats[(ubeats['original_start_date'] >= datetime(2019, 3, 1)) & (ubeats['original_start_date'] < datetime(2019, 4, 1)) & (ubeats['event'].isin(payment_events)) & (ubeats['consecutive_paid_periods'] == 1)]['quantity'].sum()
paying_users_apr = ubeats[(ubeats['original_start_date'] >= datetime(2019, 4, 1)) & (ubeats['original_start_date'] < datetime(2019, 4, 14)) & (ubeats['event'].isin(payment_events)) & (ubeats['consecutive_paid_periods'] == 1)]['quantity'].sum()
In [494]:
print('Конверсия в марте: ', paying_users_mar / trials_mar)
print('Конверсия в апреле: ', paying_users_apr / trials_apr)
Конверсия в марте:  0.3488928785158587672052663076
Конверсия в апреле:  0.3383711167086481947942905122

В рассмотрение взяты данные за март (01.03.19 - 01.04.19) и за апрель (01.04.19-14.01.19)

In [0]:
 

LTV

In [0]:
def calcLTV(df, start_date, end_date):
  share = 0.7
  
  payments = (
      float(df[(df['subscription_name'].isin(weekly_subscription_names_7_99) ) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * weekly_subscriptions_price_7_99 +
      float(df[(df['subscription_name'].isin(weekly_subscription_names_8_99) ) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * weekly_subscriptions_price_8_99 +
      float(df[(df['subscription_name'].isin(weekly_subscription_names_3_99) ) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * weekly_subscriptions_price_3_99 +

      float(df[(df['subscription_name'].isin(monthly_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * monthly_subscriptions_price +
      float(df[(df['subscription_name'].isin(annual_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * annual_subscriptions_price
  )
  payments_refund = (
      float(df[(df['subscription_name'].isin(weekly_subscription_names_7_99)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * weekly_subscriptions_price_7_99 + 
      float(df[(df['subscription_name'].isin(weekly_subscription_names_8_99)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * weekly_subscriptions_price_8_99 + 
      float(df[(df['subscription_name'].isin(weekly_subscription_names_3_99)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * weekly_subscriptions_price_3_99 + 

      float(df[(df['subscription_name'].isin(monthly_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * monthly_subscriptions_price +
      float(df[(df['subscription_name'].isin(annual_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * annual_subscriptions_price
  )

  paying_users_count = float(
      df[(df['original_start_date'] >= start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events)) & (df['consecutive_paid_periods'] == 1)]['quantity'].sum() - 
      df[(df['original_start_date'] >= start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund') & (df['consecutive_paid_periods'] == 1)]['quantity'].sum()
  )
  
  if paying_users_count == 0:
    return 0
  
  return share * float(( payments - payments_refund ) / paying_users_count )

LTV по месяцам

In [0]:
def show_bar(df, start_date, month_count):
  d = {}
  
  for i in range(month_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    d[s_d.strftime("%m/%d/%Y")] = calcLTV(df, s_d, e_d)

  trace = go.Bar(x=list(d.keys()), y=list(d.values()), name = s_d.strftime("%m/%d/%Y"))
  fig = go.Figure(data=[trace])
  configure_plotly_browser_state()
  iplot(fig)
In [497]:
show_bar(ubeats, datetime(2018, 3, 1), 14)
In [498]:
print('LTV 03.18: ', calcLTV(ubeats, datetime(2018, 3, 1), datetime(2018, 4, 1)))
print('LTV 04.18: ', calcLTV(ubeats, datetime(2018, 4, 1), datetime(2018, 5, 1)))
print('LTV 05.18: ', calcLTV(ubeats, datetime(2018, 5, 1), datetime(2018, 6, 1)))
print('LTV 06.18: ', calcLTV(ubeats, datetime(2018, 6, 1), datetime(2018, 7, 1)))
print('LTV 07.18: ', calcLTV(ubeats, datetime(2018, 7, 1), datetime(2018, 8, 1)))
print('LTV 08.18: ', calcLTV(ubeats, datetime(2018, 8, 1), datetime(2018, 9, 1)))
print('LTV 09.18: ', calcLTV(ubeats, datetime(2018, 9, 1), datetime(2018, 10, 1)))
print('LTV 10.18: ', calcLTV(ubeats, datetime(2018, 10, 1), datetime(2018, 11, 1)))
print('LTV 11.18: ', calcLTV(ubeats, datetime(2018, 11, 1), datetime(2018, 12, 1)))
print('LTV 12.18: ', calcLTV(ubeats, datetime(2018, 12, 1), datetime(2019, 1, 1)))
print('LTV 01.19: ', calcLTV(ubeats, datetime(2019, 1, 1), datetime(2019, 2, 1)))
print('LTV 02.19: ', calcLTV(ubeats, datetime(2019, 2, 1), datetime(2019, 3, 1)))
print('LTV 03.19: ', calcLTV(ubeats, datetime(2019, 3, 1), datetime(2019, 4, 1)))
print('LTV 04.19: ', calcLTV(ubeats, datetime(2019, 4, 1), datetime(2019, 5, 1)))
LTV 03.18:  41.172391489361694
LTV 04.18:  47.097571040723984
LTV 05.18:  45.184964240102175
LTV 06.18:  40.70617154811716
LTV 07.18:  40.61386666666667
LTV 08.18:  38.250720628415294
LTV 09.18:  33.95023062843197
LTV 10.18:  32.7135488454707
LTV 11.18:  30.483410919540226
LTV 12.18:  29.537253783469144
LTV 01.19:  25.04189968814969
LTV 02.19:  22.81777777777778
LTV 03.19:  18.528925597874224
LTV 04.19:  12.550145299145301

24.04.2019 (без учета разных видов подписок)

LTV 03.18:  41.47262264150944
LTV 04.18:  44.53098051372896
LTV 05.18:  43.149011306532664
LTV 06.18:  38.62239329268292
LTV 07.18:  38.54275531011045
LTV 08.18:  36.302018766756035
LTV 09.18:  31.96379572446556
LTV 10.18:  30.267810810810808
LTV 11.18:  27.64907740585774
LTV 12.18:  24.458327878103834
LTV 01.19:  22.658964788732394
LTV 02.19:  19.131297106109326
LTV 03.19:  14.012302841918293
LTV 04.19:  8.036897826086957

24.04.2019 (с учетом разных видов подписок)

LTV 03.18:  42.61306595744681
LTV 04.18:  46.41545429864254
LTV 05.18:  44.5779220945083
LTV 06.18:  40.085287656903766
LTV 07.18:  39.61326666666667
LTV 08.18:  37.27651092896175
LTV 09.18:  33.00666992068334
LTV 10.18:  31.468456483126108
LTV 11.18:  28.62864727011494
LTV 12.18:  25.435714202561112
LTV 01.19:  23.554221413721418
LTV 02.19:  19.865958139534882
LTV 03.19:  14.4964738771769
LTV 04.19:  8.246946784922393
In [499]:
ubeats['subscription_name'].value_counts()
Out[499]:
Weekly subscription with 3-day trial            160957
Week subscription with 3 days trial              18377
Weekly subscription with 3-day trial by 8.99     17618
Week subscription with 7 days trial               6850
Week subscription with 3 days trial by 3.99       2297
Month subscription new                            1045
Month subscription with 7 days trial               839
Month subscription                                 601
Week subscription with 3 days trial by 0.99        379
Year subscription new                              330
Year subscription                                  103
Name: subscription_name, dtype: int64
In [0]:
 

LTV по странам

Рассматриваются только месяца, в которых было больше 5 подписок.

In [0]:
def show_bar_by_countries(df, start_date, week_count):
  
  data = []
  
  for i in range(week_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    d = {}
    for name, group in df.groupby('country'):
      if group[(group['original_start_date'] >= s_d) & (group['original_start_date'] < e_d) & (group['event'].isin(payment_events)) & (group['consecutive_paid_periods'] == 1)]['quantity'].sum() > 5:
        d[name] = calcLTV(group, s_d, e_d)

    trace = go.Bar(x=list(d.keys()), y=list(d.values()), name = s_d.strftime("%m/%d/%Y"))
    data.append(trace)


  fig = go.Figure(data=data)
  configure_plotly_browser_state()
  iplot(fig)
In [501]:
show_bar_by_countries(ubeats, datetime(2018, 3, 1), 14)

диаграмма показывает LTV по месяцам (для стран)

LTV по подпискам

In [0]:
def show_bar_by_subscriptions(df, start_date, week_count):
  
  data = []
  
  for i in range(week_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    d = {}
    for name, group in df.groupby('subscription_name'):
      if group[(group['original_start_date'] >= s_d) & (group['original_start_date'] < e_d) & (group['event'].isin(payment_events)) & (group['consecutive_paid_periods'] == 1)]['quantity'].sum() >  20:
        d[name] = calcLTV(group, s_d, e_d)

    trace = go.Bar(x=list(d.keys()), y=list(d.values()), name = s_d.strftime("%m/%d/%Y"))
    data.append(trace)


  fig = go.Figure(data=data)
  configure_plotly_browser_state()
  iplot(fig)
In [0]:
def show_bar_by_subscription_payments(df, start_date, month_count):
  
  data = []
  
  for i in range(month_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    d = {}
    for name, group in df.groupby('subscription_name'):
      payments = group[(group['original_start_date'] >= s_d) & (group['original_start_date'] < e_d) & (group['event'].isin(payment_events)) & (group['consecutive_paid_periods'] == 1)]['quantity'].sum()
      if payments > 20:
        d[name] = payments

    trace = go.Bar(x=list(d.keys()), y=list(d.values()), name = s_d.strftime("%m/%d/%Y"))
    data.append(trace)


  fig = go.Figure(data=data)
  configure_plotly_browser_state()
  iplot(fig)

диаграмма по периодам, в которых больше 20 платящих пользователей.

In [504]:
show_bar_by_subscriptions(ubeats, datetime(2018, 3, 1), 14)

Количество покупающих пользователей по месяцам (по ивентам)

In [505]:
show_bar_by_subscription_payments(ubeats, datetime(2018, 3, 1), 14)

Диаграмма показывает, какие подписки можно сравнивать между собой.

LTV (изменение с течением времени)

In [0]:
def calc_points(df_cohort, start_date, end_date):
  data = []
  ed = start_date
  while ed < end_date:
    data.append(calcLTV(df_cohort[df_cohort['event_date'] <= ed], start_date, ed))
    ed += timedelta(7)
  return data

def show_plot(df, start_date, month_count):
  data = []
  for i in range(month_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    
    points = calc_points(df[(df['original_start_date'] >= s_d) & (df['original_start_date'] < e_d)], s_d, s_d + relativedelta.relativedelta(months=(month_count - i)))
    
    data.append(go.Scatter(x = list(range(len(points))), y = points, name=s_d.strftime("%m/%d/%Y")))
  
  fig = go.Figure(data=data)

  configure_plotly_browser_state()
  iplot(fig)
In [507]:
show_plot(ubeats, datetime(2018, 4, 1), 13)

На графике представлено изменение LTV с течением времени (по месяцам).

Ось х = количество прошедших недель с начала месяца.

Ось у = LTV.

LTV by trials

In [0]:
def calc_trials_LTV(df, start_date, end_date):
  share = 0.7
  
  payments = (
      float(df[(df['subscription_name'].isin(weekly_subscription_names_7_99) ) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * weekly_subscriptions_price_7_99 +
      float(df[(df['subscription_name'].isin(weekly_subscription_names_8_99) ) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * weekly_subscriptions_price_8_99 +
      float(df[(df['subscription_name'].isin(weekly_subscription_names_3_99) ) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * weekly_subscriptions_price_3_99 +

      float(df[(df['subscription_name'].isin(monthly_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * monthly_subscriptions_price +
      float(df[(df['subscription_name'].isin(annual_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * annual_subscriptions_price
  )
  payments_refund = (
      float(df[(df['subscription_name'].isin(weekly_subscription_names_7_99)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * weekly_subscriptions_price_7_99 + 
      float(df[(df['subscription_name'].isin(weekly_subscription_names_8_99)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * weekly_subscriptions_price_8_99 + 
      float(df[(df['subscription_name'].isin(weekly_subscription_names_3_99)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * weekly_subscriptions_price_3_99 + 

      float(df[(df['subscription_name'].isin(monthly_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * monthly_subscriptions_price +
      float(df[(df['subscription_name'].isin(annual_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * annual_subscriptions_price
  )

  trials_count = float(
      df[(df['original_start_date'] >= start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(trial_started_events))]['quantity'].sum()
  )
  
  if trials_count == 0:
    return 0
  
  return share * float(( payments - payments_refund ) / trials_count )

LTV (trials) по месяцам

In [0]:
def show_bar(df, start_date, month_count):
  d = {}
  
  for i in range(month_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    d[s_d.strftime("%m/%d/%Y")] = calc_trials_LTV(df, s_d, e_d)

  trace = go.Bar(x=list(d.keys()), y=list(d.values()), name = s_d.strftime("%m/%d/%Y"))
  fig = go.Figure(data=[trace])
  configure_plotly_browser_state()
  iplot(fig)
In [510]:
show_bar(ubeats, datetime(2018, 3, 1), 14)

LTV (trials) по странам

Рассматриваются только месяца, в которых было больше 5 подписок.

In [0]:
def show_bar_by_countries(df, start_date, week_count):
  
  data = []
  
  for i in range(week_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    d = {}
    for name, group in df.groupby('country'):
      if group[(group['original_start_date'] >= s_d) & (group['original_start_date'] < e_d) & (group['event'].isin(payment_events)) & (group['consecutive_paid_periods'] == 1)]['quantity'].sum() > 20:
        d[name] = calc_trials_LTV(group, s_d, e_d)

    trace = go.Bar(x=list(d.keys()), y=list(d.values()), name = s_d.strftime("%m/%d/%Y"))
    data.append(trace)


  fig = go.Figure(data=data)
  configure_plotly_browser_state()
  iplot(fig)
In [512]:
show_bar_by_countries(ubeats, datetime(2018, 3, 1), 14)

диаграмма показывает LTV(trials) по месяцам (для стран)

LTV (trials) (изменение с течением времени)

In [0]:
def calc_points(df_cohort, start_date, end_date):
  data = []
  ed = start_date
  while ed < end_date:
    data.append(calc_trials_LTV(df_cohort[df_cohort['event_date'] <= ed], start_date, ed))
    ed += timedelta(7)
  return data

def show_plot(df, start_date, month_count):
  data = []
  for i in range(month_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    
    points = calc_points(df[(df['original_start_date'] >= s_d) & (df['original_start_date'] < e_d)], s_d, s_d + relativedelta.relativedelta(months=(month_count - i)))
    
    data.append(go.Scatter(x = list(range(len(points))), y = points, name=s_d.strftime("%m/%d/%Y")))
  
  fig = go.Figure(data=data)

  configure_plotly_browser_state()
  iplot(fig)
In [514]:
show_plot(ubeats, datetime(2018, 4, 1), 13)

На графике представлено изменение LTV (trials) с течением времени (по месяцам).

Ось х = количество прошедших недель с начала месяца.

Ось у = LTV (trials).

Revenue

In [0]:
def calc_revenue(df, start_date, end_date):
  share = 0.7
  
  payments = (
      float(df[(df['subscription_name'].isin(weekly_subscription_names_7_99) ) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * weekly_subscriptions_price_7_99 +
      float(df[(df['subscription_name'].isin(weekly_subscription_names_8_99) ) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * weekly_subscriptions_price_8_99 +
      float(df[(df['subscription_name'].isin(weekly_subscription_names_3_99) ) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * weekly_subscriptions_price_3_99 +

      float(df[(df['subscription_name'].isin(monthly_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * monthly_subscriptions_price +
      float(df[(df['subscription_name'].isin(annual_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'].isin(payment_events))]['quantity'].sum()) * annual_subscriptions_price
  )
  payments_refund = (
      float(df[(df['subscription_name'].isin(weekly_subscription_names_7_99)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * weekly_subscriptions_price_7_99 + 
      float(df[(df['subscription_name'].isin(weekly_subscription_names_8_99)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * weekly_subscriptions_price_8_99 + 
      float(df[(df['subscription_name'].isin(weekly_subscription_names_3_99)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * weekly_subscriptions_price_3_99 + 

      float(df[(df['subscription_name'].isin(monthly_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * monthly_subscriptions_price +
      float(df[(df['subscription_name'].isin(annual_subscription_names)) & (df['original_start_date'] >=start_date) & (df['original_start_date'] < end_date) & (df['event'] == 'Refund')]['quantity'].sum()) * annual_subscriptions_price
  )
  
  return share * float(( payments - payments_refund ))

Revenue по месяцам

In [0]:
def show_bar(df, start_date, month_count):
  d = {}
  
  for i in range(month_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    d[s_d.strftime("%m/%d/%Y")] = calc_revenue(df, s_d, e_d)
  
  trace = go.Bar(x=list(d.keys()), y=list(d.values()), name = s_d.strftime("%m/%d/%Y"))
  fig = go.Figure(data=[trace])
  configure_plotly_browser_state()
  iplot(fig)
In [517]:
show_bar(ubeats, datetime(2018, 4, 1), 13)

На диаграмме представлена выручка по месяцам.

Revenue (изменение с течением времени)

In [0]:
def calc_points(df_cohort, start_date, end_date):
  data = []
  ed = start_date
  while ed < end_date:
    data.append(calc_revenue(df_cohort[df_cohort['event_date'] <= ed], start_date, ed))
    ed += timedelta(7)
  return data

def show_plot(df, start_date, month_count):
  data = []
  for i in range(month_count):
    s_d = start_date + relativedelta.relativedelta(months=i)
    e_d = start_date + relativedelta.relativedelta(months=i+1)
    
    points = calc_points(df[(df['original_start_date'] >= s_d) & (df['original_start_date'] < e_d)], s_d, s_d + relativedelta.relativedelta(months=(month_count - i)))
    
    data.append(go.Scatter(x = list(range(len(points))), y = points, name=s_d.strftime("%m/%d/%Y")))
  
  fig = go.Figure(data=data)

  configure_plotly_browser_state()
  iplot(fig)
In [519]:
show_plot(ubeats, datetime(2018, 3, 1), 14)

На графике представлено изменение выручки с течением времени (по месяцам).

Ось х = количество прошедших недель с начала месяца.

Ось у = выручка.

In [0]:
 

Predictions

Прогноз вероятности совершения триалом покупок

прогноз на основании половины подписок.

In [0]:
def get_predict(df, current_df):
  trials = df[df['event'].isin(trial_started_events)]['quantity'].sum()
  current_trials = current_df[current_df['event'].isin(trial_started_events)]['quantity'].sum()
  predict = []
  arr_2 = []
  arr = []
  
  data = [1, ]
  current_data = [1, ]
    
  paid_current = current_df[current_df['event'].isin(payment_events)]
  paid = df[df['event'].isin(payment_events)]
  
  for name, group in paid.groupby('consecutive_paid_periods'):
    data.append( group[group['event'].isin(payment_events)]['quantity'].sum() / trials)
  
  for name, group in paid_current.groupby('consecutive_paid_periods'):
    current_data.append(group[group['event'].isin(payment_events)]['quantity'].sum() / current_trials)
  
  arr = (np.array(data[1:len(current_data) // 2]) / np.array(current_data[1:len(current_data) // 2]))
  
  
  for i in range(1, len(arr)):
    arr_2.append(arr[i-1] / arr[i])

  mean = np.mean(arr_2)
  
  for i in range(len(arr), len(data)-1):
    arr = np.append(arr, arr[i-1] / mean)
    
  return [(data[1:] / arr), current_data[1:]]
In [0]:
predict_1, real_1 = get_predict(ubeats, ubeats[(ubeats['original_start_date'] >= datetime(2018, 7, 1)) & (ubeats['original_start_date'] <= datetime(2018, 8, 7))])
predict_2, real_2 = get_predict(ubeats, ubeats[(ubeats['original_start_date'] >= datetime(2019, 2, 1)) & (ubeats['original_start_date'] <= datetime(2019, 3, 1))])
In [522]:
data = [
  go.Scatter(x = list(range(len(predict_1))), y = predict_1, name='predict_1'),
  go.Scatter(x = list(range(len(predict_2))), y = predict_2, name='predict_2'),
#   go.Scatter(x = list(range(len(predict_3))), y = predict_3, name='predict_3'),
#   go.Scatter(x = list(range(len(real_1))), y = real_1, name='real_1'),
#   go.Scatter(x = list(range(len(real_2))), y = real_2, name='real_2'),
#   go.Scatter(x = list(range(len(real_3))), y = real_3, name='real_3'),
]

fig = go.Figure(data=data)

configure_plotly_browser_state()
iplot(fig)

Refunds

In [0]:
 

Количество рефундов по дням

с 01.01.2019

In [523]:
refunds = ubeats[(ubeats['event'] == 'Refund') & (ubeats['event_date'] > datetime(2019,1,1))]['event_date'].value_counts().sort_index()

data = [go.Scatter(x = refunds.keys(), y = refunds.values)]

fig = go.Figure(data=data)

configure_plotly_browser_state()
iplot(fig)

У установленных в какой день, были рефунды в этом месяце.

c 01.05.2019

In [524]:
ubeats[(ubeats['event'] == 'Refund') & (ubeats['event_date'] > datetime(2019,5,1))]['original_start_date'].value_counts().sort_index()
Out[524]:
2018-08-08    1
2018-12-27    1
2019-01-02    1
2019-01-13    1
2019-01-16    1
2019-01-20    1
2019-03-05    1
2019-03-14    1
2019-03-16    1
2019-03-19    1
2019-03-26    2
2019-04-05    1
2019-04-13    1
2019-04-20    1
2019-04-22    1
2019-04-28    2
2019-05-02    1
2019-05-03    1
2019-05-05    1
Name: original_start_date, dtype: int64
In [0]: