<jupyter_start><jupyter_text>Smart Meter 65<jupyter_code>p1 = read_csv('ics_data/06_Smart_Meter_45/P1.csv', squeeze=True, index_col=0)
p2 = read_csv('ics_data/06_Smart_Meter_45/P2.csv', squeeze=True, index_col=0)
p3 = read_csv('ics_data/06_Smart_Meter_45/P3.csv', squeeze=True, index_col=0)
q1 = read_csv('ics_data/06_Smart_Meter_45/Q1.csv', squeeze=True, index_col=0)
q2 = read_csv('ics_data/06_Smart_Meter_45/Q2.csv', squeeze=True, index_col=0)
q3 = read_csv('ics_data/06_Smart_Meter_45/Q3.csv', squeeze=True, index_col=0)
u1 = read_csv('ics_data/06_Smart_Meter_45/U1.csv', squeeze=True, index_col=0)
u2 = read_csv('ics_data/06_Smart_Meter_45/U2.csv', squeeze=True, index_col=0)
u3 = read_csv('ics_data/06_Smart_Meter_45/U3.csv', squeeze=True, index_col=0)
def mul_values(dataframe, num):
    new_dataframe = dataframe.copy()
    for (data_index, index) in enumerate(dataframe.index):
        if index > num:
            break
        else:
            new_dataframe.values[data_index] *= 18
    
    return new_dataframe
corner_value = 1560434439432
p1 = mul_values(p1, corner_value)
p2 = mul_values(p2, corner_value)
p3 = mul_values(p3, corner_value)
q1 = mul_values(q1, corner_value)
q2 = mul_values(q2, corner_value)
q3 = mul_values(q3, corner_value)
def convert_timestamps(df):
    df.index = pd.to_datetime(df.index, unit='ms')
    return df
p1 = convert_timestamps(p1)
p2 = convert_timestamps(p2)
p3 = convert_timestamps(p3)
q1 = convert_timestamps(q1)
q2 = convert_timestamps(q2)
q3 = convert_timestamps(q3)
u1 = convert_timestamps(u1)
u2 = convert_timestamps(u2)
u3 = convert_timestamps(u3)
def fix_timestamps(dataframes):
    # check input
    if len(dataframes) <= 0:
        return
    new_dataframes = []
    
    # get a full list of indices
    indices = dataframes[0].index
    for dataframe in dataframes:
        indices = indices.union(dataframe.index)
    print("Got all indices")
        
    for (data_index, dataframe) in enumerate(dataframes):
        dataframe = dataframe.reindex(indices, copy=True).fillna(method = 'ffill').fillna(method = 'bfill') 
        new_dataframes.append(dataframe)
        print("dataframe", data_index + 1, "is fixed")
        
    return new_dataframes
data_list = fix_timestamps([p1, p2, p3, q1, q2, q3, u1, u2, u3])
p1 = data_list[0]
p2 = data_list[1]
p3 = data_list[2]
q1 = data_list[3]
q2 = data_list[4]
q3 = data_list[5]
u1 = data_list[6]
u2 = data_list[7]
u3 = data_list[8]<jupyter_output>Got all indices
dataframe 1 is fixed
dataframe 2 is fixed
dataframe 3 is fixed
dataframe 4 is fixed
dataframe 5 is fixed
dataframe 6 is fixed
dataframe 7 is fixed
dataframe 8 is fixed
dataframe 9 is fixed<jupyter_text>Save fixed data so we don't need to fix it again<jupyter_code>p1.to_csv("ics_data_fixed/Smart_Meter_65/P1.csv", header=True, index=True, encoding='utf-8')
p2.to_csv("ics_data_fixed/Smart_Meter_65/P2.csv", header=True, index=True, encoding='utf-8')
p3.to_csv("ics_data_fixed/Smart_Meter_65/P3.csv", header=True, index=True, encoding='utf-8')
q1.to_csv("ics_data_fixed/Smart_Meter_65/Q1.csv", header=True, index=True, encoding='utf-8')
q2.to_csv("ics_data_fixed/Smart_Meter_65/Q2.csv", header=True, index=True, encoding='utf-8')
q3.to_csv("ics_data_fixed/Smart_Meter_65/Q3.csv", header=True, index=True, encoding='utf-8')
u1.to_csv("ics_data_fixed/Smart_Meter_65/U1.csv", header=True, index=True, encoding='utf-8')
u2.to_csv("ics_data_fixed/Smart_Meter_65/U2.csv", header=True, index=True, encoding='utf-8')
u3.to_csv("ics_data_fixed/Smart_Meter_65/U3.csv", header=True, index=True, encoding='utf-8')<jupyter_output><empty_output><jupyter_text>Analyze data<jupyter_code>p1 = read_csv('ics_data_fixed/Smart_Meter_65/P1.csv', squeeze=True, index_col=0)
p2 = read_csv('ics_data_fixed/Smart_Meter_65/P2.csv', squeeze=True, index_col=0)
p3 = read_csv('ics_data_fixed/Smart_Meter_65/P3.csv', squeeze=True, index_col=0)
q1 = read_csv('ics_data_fixed/Smart_Meter_65/Q1.csv', squeeze=True, index_col=0)
q2 = read_csv('ics_data_fixed/Smart_Meter_65/Q2.csv', squeeze=True, index_col=0)
q3 = read_csv('ics_data_fixed/Smart_Meter_65/Q3.csv', squeeze=True, index_col=0)
u1 = read_csv('ics_data_fixed/Smart_Meter_65/U1.csv', squeeze=True, index_col=0)
u2 = read_csv('ics_data_fixed/Smart_Meter_65/U2.csv', squeeze=True, index_col=0)
u3 = read_csv('ics_data_fixed/Smart_Meter_65/U3.csv', squeeze=True, index_col=0)
def print_stats(name, data):
    stat_data = data.describe()
    print('%s: mean = %f, std = %f, V = %f' % (name, stat_data['mean'], stat_data['std'], stat_data['std']/stat_data['mean']))
print_stats('P1', p1)
print_stats('P2', p2)
print_stats('P3', p3)
print_stats('Q1', q1)
print_stats('Q2', q2)
print_stats('Q3', q3)
print_stats('U1', u1)
print_stats('U2', u2)
print_stats('U3', u3)
plot_acf(p1[:1_000_000])
plot_pacf(p1)<jupyter_output><empty_output><jupyter_text>Здесь заметна довольно четкая сезонность<jupyter_code># Correlation between P values
print('p1 and p2:', p1.corr(p2))
print('p2 and p3:', p2.corr(p3))
print('p1 and p3:', p1.corr(p3))
# Correlation between Q values
print('q1 and q2:', q1.corr(q2))
print('q2 and q3:', q2.corr(q3))
print('q1 and q3:', q1.corr(q3))
# Correlation between U values
print('u1 and u2:', u1.corr(u2))
print('u2 and u3:', u2.corr(u3))
print('u1 and u3:', u1.corr(u3))
# Correlation between P, Q and R - 1st phase
print('p1 and q1:', p1.corr(q1))
print('p1 and u1:', p1.corr(u1))
print('q1 and u1:', q1.corr(u1))
# Correlation between P, Q and R - 2nd phase
print('p2 and q2:', p2.corr(q2))
print('p2 and u2:', p2.corr(u2))
print('q2 and u2:', q2.corr(u2))
# Correlation between P, Q and R - 3rd phase
print('p3 and q3:', p3.corr(q3))
print('p3 and u3:', p3.corr(u3))
print('q3 and u3:', q3.corr(u3))<jupyter_output>p3 and q3: 0.2468764249671468
p3 and u3: -0.19188312791932907
q3 and u3: -0.014311070078757992<jupyter_text>Корелляция между P и Q ожидаемо высока, а корреляция этих параметров с U достаточно низкаяПри этом на графиках автокорреляции четко видна сезонность  By months<jupyter_code># We have 7 month of data
p1
month_numbers = ['05', '06', '07', '08', '09', '10', '11']
# month_numbers = ['05', '06']
months_p1 = [p1.loc['2019-' + i] for i in month_numbers]
months_p2 = [p2.loc['2019-' + i] for i in month_numbers]
months_p3 = [p3.loc['2019-' + i] for i in month_numbers]
months_q1 = [q1.loc['2019-' + i] for i in month_numbers]
months_q2 = [q2.loc['2019-' + i] for i in month_numbers]
months_q3 = [q3.loc['2019-' + i] for i in month_numbers]
months_u1 = [u1.loc['2019-' + i] for i in month_numbers]
months_u2 = [u2.loc['2019-' + i] for i in month_numbers]
months_u3 = [u3.loc['2019-' + i] for i in month_numbers]<jupyter_output><empty_output><jupyter_text>Mean<jupyter_code>plt.figure()
plt.plot(month_numbers, [month.mean() for month in months_p1], label='P1')
plt.plot(month_numbers, [month.mean() for month in months_p2], label='P2') 
plt.plot(month_numbers, [month.mean() for month in months_p3], label='P3')
plt.title('Mean')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
# plt.legend()
plt.figure()
plt.plot(month_numbers, [month.mean() for month in months_q1], label='Q1')
plt.plot(month_numbers, [month.mean() for month in months_q2], label='Q2') 
plt.plot(month_numbers, [month.mean() for month in months_q3], label='Q3')
plt.title('Mean')
# plt.legend()
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.figure()
plt.plot(month_numbers, [month.mean() for month in months_u1], label='U1')
plt.plot(month_numbers, [month.mean() for month in months_u2], label='U2') 
plt.plot(month_numbers, [month.mean() for month in months_u3], label='U3')
plt.title('Mean')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
# plt.legend()<jupyter_output><empty_output><jupyter_text>Variance<jupyter_code>plt.figure()
plt.plot(month_numbers, [month.var() for month in months_p1], label='P1')
plt.plot(month_numbers, [month.var() for month in months_p2], label='P2') 
plt.plot(month_numbers, [month.var() for month in months_p3], label='P3')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.title('Variance')
# plt.legend()
plt.figure()
plt.plot(month_numbers, [month.var() for month in months_q1], label='Q1')
plt.plot(month_numbers, [month.var() for month in months_q2], label='Q2') 
plt.plot(month_numbers, [month.var() for month in months_q3], label='Q3')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.title('Variance')
# plt.legend()
plt.figure()
plt.plot(month_numbers, [month.var() for month in months_u1], label='U1')
plt.plot(month_numbers, [month.var() for month in months_u2], label='U2') 
plt.plot(month_numbers, [month.var() for month in months_u3], label='U3')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.title('Variance')
# plt.legend()<jupyter_output><empty_output><jupyter_text>Немного предварительных выводов:1. Четкой сезонности и четкого тренда по месяцам не видно (возможно, из-за того, что данные были взяты в срок меньше года), но существиет разница в параметрах между месяцами2. Существует довольно большая разница в значениях между фазами, причем для P и Q эта разница местами довольно велика и не одинакова. Вероятно, это связано с особенностями работы счетчика.3. Очень похожие графики для трех фаз напряжения (и среднее, и std). Вероятно, отличия между ними обусловлены особенностью работы счетчика<jupyter_code>for month in months_p1:
    result = adfuller(month)
    print ('adf: ', result[0] )
    print ('p-value: ', result[1])
    print('Critical values: ', result[4])
    if result[0]> result[4]['5%']: 
        print ('есть единичные корни, ряд не стационарен \n')
    else:
        print ('единичных корней нет, ряд стационарен \n')
def run_adfuller(dataframe):
    result = adfuller(dataframe)
    print ('adf: ', result[0] )
    print ('p-value: ', result[1])
    print('Critical values: ', result[4])
    if result[0]> result[4]['5%']: 
        print ('есть единичные корни, ряд не стационарен \n')
    else:
        print ('единичных корней нет, ряд стационарен \n')
run_adfuller(months_p2[0])
run_adfuller(months_p2[1])
run_adfuller(months_p2[2])
run_adfuller(months_p2[3])
run_adfuller(months_p2[4])
run_adfuller(months_p2[5])
run_adfuller(months_p2[6])

# adf:  -2.7625376822574443
# p-value:  0.0638274489870866
# Critical values:  {'1%': -3.430640565396129, '5%': -2.861668420481159, '10%': -2.566838354576154}
# есть единичные корни, ряд не стационарен

# adf:  -11.556099863812438
# p-value:  3.3561579126773394e-21
# Critical values:  {'1%': -3.4303572163969696, '5%': -2.8615431895656718, '10%': -2.5667716976887465}
# единичных корней нет, ряд стационарен 

# adf:  -14.296505001871903
# p-value:  1.2498226114714948e-26
# Critical values:  {'1%': -3.430367143024934, '5%': -2.8615475770100507, '10%': -2.5667740329665754}
# единичных корней нет, ряд стационарен 
for month in months_p3:
    result = adfuller(month)
    print ('adf: ', result[0] )
    print ('p-value: ', result[1])
    print('Critical values: ', result[4])
    if result[0]> result[4]['5%']: 
        print ('есть единичные корни, ряд не стационарен \n')
    else:
        print ('единичных корней нет, ряд стационарен \n')
for month in months_q1:
    result = adfuller(month)
    print ('adf: ', result[0] )
    print ('p-value: ', result[1])
    print('Critical values: ', result[4])
    if result[0]> result[4]['5%']: 
        print ('есть единичные корни, ряд не стационарен \n')
    else:
        print ('единичных корней нет, ряд стационарен \n')
run_adfuller(months_q2[0])
# adf:  -11.100297493258267
# p-value:  3.880464009790197e-20
# Critical values:  {'1%': -3.430357956984531, '5%': -2.8615435168965413, '10%': -2.5667718719150314}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q2[1])
run_adfuller(months_q2[2])
run_adfuller(months_q2[3])
# adf:  -8.640396511512348
# p-value:  5.445847070542084e-14
# Critical values:  {'1%': -3.43038797515407, '5%': -2.8615567845006957, '10%': -2.566778933788877}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q2[4])
# adf:  -3.4233329845031295
# p-value:  0.010188707765015124
# Critical values:  {'1%': -3.4306406558005498, '5%': -2.861668460435025, '10%': -2.5668383758428024}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q2[5])
# adf:  -13.271980845857339
# p-value:  8.003414957841282e-25
# Critical values:  {'1%': -3.430357216389006, '5%': -2.861543189562152, '10%': -2.566771697686873}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q2[6])
# adf:  -8.002716647344515
# p-value:  2.3108485688167445e-12
# Critical values:  {'1%': -3.4303671430698754, '5%': -2.861547577029914, '10%': -2.566774032977148}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q3[0])
# adf:  -16.228867989028206
# p-value:  3.8298913854328023e-29
# Critical values:  {'1%': -3.430357956984531, '5%': -2.8615435168965413, '10%': -2.5667718719150314}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q3[1])
# adf:  -10.604319212235815
# p-value:  6.05759734187203e-19
# Critical values:  {'1%': -3.430355878876253, '5%': -2.86154259839726, '10%': -2.566771383031395}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q3[2])
run_adfuller(months_q3[3])
# adf:  -9.593595314337449
# p-value:  2.0056093777585438e-16
# Critical values:  {'1%': -3.430387970964461, '5%': -2.8615567826489574, '10%': -2.566778932803261}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q3[4])
# adf:  -4.307107389340976
# p-value:  0.000431790545838469
# Critical values:  {'1%': -3.430640384755896, '5%': -2.86166834064794, '10%': -2.566838312082519}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q3[5])
# adf:  -6.697411829179403
# p-value:  3.967306637438502e-09
# Critical values:  {'1%': -3.430357216341225, '5%': -2.8615431895410333, '10%': -2.566771697675632}
# единичных корней нет, ряд стационарен 
run_adfuller(months_q3[6])
# adf:  -9.632439803594028
# p-value:  1.598872013075045e-16
# Critical values:  {'1%': -3.4303671430698754, '5%': -2.861547577029914, '10%': -2.566774032977148}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u1[0])
# adf:  -5.222235454322759
# p-value:  7.9181199288127e-06
# Critical values:  {'1%': -3.430357956974849, '5%': -2.861543516892262, '10%': -2.5667718719127537}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u1[1])
run_adfuller(months_u1[2])
run_adfuller(months_u1[3])
# adf:  -6.651345271538119
# p-value:  5.111615307681683e-09
# Critical values:  {'1%': -3.43038797515407, '5%': -2.8615567845006957, '10%': -2.566778933788877}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u1[4])
# adf:  -2.676701899287078
# p-value:  0.07815735287005449
# Critical values:  {'1%': -3.4306403976513207, '5%': -2.8616683463470207, '10%': -2.5668383151160263}
# есть единичные корни, ряд не стационарен 
run_adfuller(months_u1[5])
# adf:  -4.945289399542398
# p-value:  2.8445470792583415e-05
# Critical values:  {'1%': -3.4303572163651155, '5%': -2.8615431895515924, '10%': -2.5667716976812525}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u1[6])
# adf:  -3.732062717571794
# p-value:  0.003684111523125982
# Critical values:  {'1%': -3.4303671422160327, '5%': -2.861547576652527, '10%': -2.5667740327762782}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u2[0])
# adf:  -5.114644186788854
# p-value:  1.3098967560374234e-05
# Critical values:  {'1%': -3.430357956965167, '5%': -2.861543516887983, '10%': -2.566771871910476}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u2[1])
run_adfuller(months_u2[2])
run_adfuller(months_u2[3])
# adf:  -6.640039869860539
# p-value:  5.4389332378711294e-09
# Critical values:  {'1%': -3.430387973610422, '5%': -2.8615567838184286, '10%': -2.5667789334257303}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u2[4])
# adf:  -2.6767764024406135
# p-value:  0.07814389959175594
# Critical values:  {'1%': -3.4306403976513207, '5%': -2.8616683463470207, '10%': -2.5668383151160263}
# есть единичные корни, ряд не стационарен 
run_adfuller(months_u2[5])
# adf:  -4.96408032999562
# p-value:  2.6127602002476144e-05
# Critical values:  {'1%': -3.430357216373079, '5%': -2.861543189555112, '10%': -2.566771697683126}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u2[6])
# adf:  -3.7954488170093614
# p-value:  0.0029542242984148225
# Critical values:  {'1%': -3.430367142935052, '5%': -2.8615475769703242, '10%': -2.56677403294543}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u3[0])
# adf:  -5.271403211445335
# p-value:  6.2740930894729515e-06
# Critical values:  {'1%': -3.430357956955485, '5%': -2.861543516883703, '10%': -2.566771871908198}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u3[1])
run_adfuller(months_u3[2])
run_adfuller(months_u3[3])
# adf:  -6.718196186377709
# p-value:  3.5376978435163967e-09
# Critical values:  {'1%': -3.4303879747130153, '5%': -2.8615567843057566, '10%': -2.566778933685118}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u3[4])
# adf:  -2.715822020650574
# p-value:  0.07134015772181304
# Critical values:  {'1%': -3.4306403976513207, '5%': -2.8616683463470207, '10%': -2.5668383151160263}
# есть единичные корни, ряд не стационарен 
run_adfuller(months_u3[5])
# adf:  -5.042326757245978
# p-value:  1.828787836582908e-05
# Critical values:  {'1%': -3.4303572162536278, '5%': -2.8615431895023162, '10%': -2.5667716976550246}
# единичных корней нет, ряд стационарен 
run_adfuller(months_u3[6])
# adf:  -3.7215610469562685
# p-value:  0.0038198997001293324
# Critical values:  {'1%': -3.4303671426204736, '5%': -2.8615475768312844, '10%': -2.5667740328714244}
# единичных корней нет, ряд стационарен 
fig, ax = plt.subplots(2, figsize=(12,6))
ax[0] = plot_acf(months_p1[0], ax=ax[0], lags=20)
ax[1] = plot_pacf(months_p1[0], ax=ax[1], lags=20)
ax.grid(axis='y')<jupyter_output><empty_output><jupyter_text>By working days/holidays<jupyter_code>holidays = [['18', '19', '25', '26'], 
            ['01', '02', '08', '09', '15', '16', '22', '23', '29', '30'], 
            ['06', '07', '13', '14', '20', '21', '27', '28'], 
            ['03', '04', '10', '11', '17', '18', '24', '25', '31'], 
            ['01', '07', '08', '14', '15', '21', '22', '28', '29'], 
            ['05', '06', '12', '13', '19', '20', '26', '27'], 
            ['02', '03', '09', '10']]
all_weekends = [month+'-'+day for (month, days) in zip(month_numbers, holidays) for day in days]
holidays_p1 = pd.concat([p1.loc['2019-' + month + '-' + day] for (month, days) in zip(month_numbers, holidays) for day in days])
combined = p1.append(holidays_p1)
working_days_p1 = combined[~combined.index.duplicated(keep=False)]
print("separated P1")

holidays_p2 = pd.concat([p2.loc['2019-' + month + '-' + day] for (month, days) in zip(month_numbers, holidays) for day in days])
combined = p2.append(holidays_p2)
working_days_p2 = combined[~combined.index.duplicated(keep=False)]
print("separated P2")

holidays_p3 = pd.concat([p3.loc['2019-' + month + '-' + day] for (month, days) in zip(month_numbers, holidays) for day in days])
combined = p3.append(holidays_p3)
working_days_p3 = combined[~combined.index.duplicated(keep=False)]
print("separated P3")

holidays_q1 = pd.concat([q1.loc['2019-' + month + '-' + day] for (month, days) in zip(month_numbers, holidays) for day in days])
combined = q1.append(holidays_q1)
working_days_q1 = combined[~combined.index.duplicated(keep=False)]
print("separated Q1")

holidays_q2 = pd.concat([q2.loc['2019-' + month + '-' + day] for (month, days) in zip(month_numbers, holidays) for day in days])
combined = q2.append(holidays_q2)
working_days_q2 = combined[~combined.index.duplicated(keep=False)]
print("separated Q2")

holidays_q3 = pd.concat([q3.loc['2019-' + month + '-' + day] for (month, days) in zip(month_numbers, holidays) for day in days])
combined = q3.append(holidays_q3)
working_days_q3 = combined[~combined.index.duplicated(keep=False)]
print("separated Q3")

holidays_u1 = pd.concat([u1.loc['2019-' + month + '-' + day] for (month, days) in zip(month_numbers, holidays) for day in days])
combined = u1.append(holidays_u1)
working_days_u1 = combined[~combined.index.duplicated(keep=False)]
print("separated U1")

holidays_u2 = pd.concat([u2.loc['2019-' + month + '-' + day] for (month, days) in zip(month_numbers, holidays) for day in days])
combined = u2.append(holidays_u2)
working_days_u2 = combined[~combined.index.duplicated(keep=False)]
print("separated U2")

holidays_u3 = pd.concat([u3.loc['2019-' + month + '-' + day] for (month, days) in zip(month_numbers, holidays) for day in days])
combined = u3.append(holidays_u3)
working_days_u3 = combined[~combined.index.duplicated(keep=False)]
print("separated U3")
print_stats('P1 - holidays ', holidays_p1)
print_stats('P1 - working days ', working_days_p1)
print_stats('P2 - holidays ', holidays_p2)
print_stats('P2 - working days ', working_days_p2)
print_stats('P3 - holidays ', holidays_p3)
print_stats('P3 - working days ', working_days_p3)
print_stats('Q1 - holidays ', holidays_q1)
print_stats('Q1 - working days ', working_days_q1)
print_stats('Q2 - holidays ', holidays_q2)
print_stats('Q2 - working days ', working_days_q2)
print_stats('Q3 - holidays ', holidays_q3)
print_stats('Q3 - working days ', working_days_q3)
print_stats('U1 - holidays ', holidays_u1)
print_stats('U1 - working days ', working_days_u1)
print_stats('U2 - holidays ', holidays_u2)
print_stats('U2 - working days ', working_days_u2)
print_stats('U3 - holidays ', holidays_u3)
print_stats('U3 - working days ', working_days_u3)<jupyter_output>U1 - holidays : mean = 226.689920, std = 2.629432, V = 0.011599
U1 - working days : mean = 226.769438, std = 3.316556, V = 0.014625
U2 - holidays : mean = 227.528167, std = 2.641638, V = 0.011610
U2 - working days : mean = 227.558487, std = 3.364767, V = 0.014786
U3 - holidays : mean = 226.074500, std = 2.574034, V = 0.011386
U3 - working days : mean = 226.134484, std = 3.290719, V = 0.014552
StarcoderdataJupyterStructuredCleanDedup