Test predictions

In [1]:
import pandas as pd
import arrow
from IPython.display import display, HTML

Can we fill in the gaps? Looking at the beginning and end of 1929, it seems the number of pages for each session on a weekday are consistent:

  • Morning: 1 page
  • Noon: 2 pages
  • Afternoon: 2 pages

So 5 pages per weekday. Saturdays have 2 pages.

Notes from when Maggie and I looked at the bound volumes

1901 – five pages a day, 1 for mining forenoon, 2 for noon and 2 for afternoon – mix of small and large pages

1915 - five pages a day, 1 for mining forenoon, 2 for noon and 2 for afternoon – mix of small and large pages, some tiny font used in miscellaneous which continues

1924 - five pages a day, 1 for mining forenoon, 2 for noon and 2 for afternoon – only large pages, handwritten ‘investment sales’

1934 - five pages a day, 1 for mining forenoon, 2 for noon and 2 for afternoon – only large pages, handwritten ‘investment sales’

1940 – nine pages a day, 3 forenoon, 3 noon and 3 afternoon, Saturdays only have 3 pages for morning (we didn’t record how many pages for Saturday before)

1950 – eight pages a day, 4 for morning and 4 for afternoon, thinner paper, no Saturday trading

There's an increase in pages after vol 135, in 1934.

In [2]:
df_series = pd.read_csv('series_list.csv')
all_holidays = pd.read_csv('nsw_holidays_1900_1950.csv')
#all_holidays.loc[:, 'date'] = pd.to_datetime(all_holidays.loc[:, 'date'], errors='coerce')

def get_holidays(year):
    holidays = all_holidays.loc[all_holidays['year'] == year]['date']
    return holidays.to_list()
In [3]:
def daterange(start_date, end_date):
    for n in range(int ((end_date - start_date).days)):
        yield start_date.shift(days=+n)
In [4]:
def predict_pages(start_date, end_date, weekday_pages=5, saturday_pages=2, include_saturday=True):
    pages = 0
    year = start_date.year
    holidays = sorted(get_holidays(year))
    for single_date in daterange(start_date, end_date):
        if single_date.format('YYYY-MM-DD') not in holidays and single_date.weekday() != 6:
            if single_date.weekday() == 5:
                if include_saturday is True:
                    pages += saturday_pages
            else:
                pages += weekday_pages
    return pages
In [5]:
pages_per_vol = {
    '1_134': {
        'weekday': 5,
        'saturday': 2
    },
    '135_145': {
        'weekday': 6,
        'saturday': 2
    },
    '146_164': {
        'weekday': 9,
        'saturday': 3
    },
    '165_190': {
        'weekday': 6,
        'saturday': 3
    },
    '191_199': {
        'weekday': 8,
        'saturday': 0
    }
}

def get_pages(vol_num):
    for key, pages in pages_per_vol.items():
        vols = key.split('_')
        vols = [int(y) for y in vols]
        if len(vols) == 2:
            vols = list(range(vols[0], vols[1] + 1))
        if vol_num in vols:
            return pages
In [6]:
predictions = []
for row in df_series.dropna(subset=['start_date', 'end_date'])[:-1].itertuples():
    start_date = arrow.get(row.start_date, 'YYYY-MM-DD')
    end_date = arrow.get(row.end_date, 'YYYY-MM-DD').shift(days=+1)
    vol_num = int(row.Item_number.split('-')[-1])
    pages_vol = get_pages(vol_num)
    prediction = predict_pages(start_date, end_date, weekday_pages=pages_vol['weekday'], saturday_pages=pages_vol['saturday'])
    #print(f'Volume {row.Item_number}: {prediction} predicted / {row.Pages} actual pages')
    predictions.append({'volume': row.Item_number, 'predicted': prediction, 'actual': row.Pages})
df_predictions = pd.DataFrame(predictions)
df_predictions.loc[:, 'difference'] = df_predictions['predicted'] - df_predictions['actual']
In [7]:
pd.set_option("display.max_rows", 200)
import seaborn as sns
cm = sns.light_palette("green", as_cmap=True)
df_predictions.style.background_gradient(cmap=cm, subset=pd.IndexSlice[:, ['difference']])
Out[7]:
actual predicted volume difference
0 303 322 AU NBAC N193-001 19
1 312 334 AU NBAC N193-002 22
2 345 351 AU NBAC N193-003 6
3 312 319 AU NBAC N193-004 7
4 305 312 AU NBAC N193-005 7
5 334 341 AU NBAC N193-006 7
6 349 351 AU NBAC N193-007 2
7 318 319 AU NBAC N193-008 1
8 327 329 AU NBAC N193-009 2
9 327 334 AU NBAC N193-010 7
10 350 351 AU NBAC N193-011 1
11 310 319 AU NBAC N193-012 9
12 330 334 AU NBAC N193-013 4
13 329 329 AU NBAC N193-014 0
14 349 351 AU NBAC N193-015 2
15 313 314 AU NBAC N193-016 1
16 331 329 AU NBAC N193-017 -2
17 322 334 AU NBAC N193-018 12
18 348 348 AU NBAC N193-019 0
19 312 312 AU NBAC N193-020 0
20 330 331 AU NBAC N193-021 1
21 314 334 AU NBAC N193-022 20
22 344 346 AU NBAC N193-023 2
23 310 312 AU NBAC N193-024 2
24 323 327 AU NBAC N193-025 4
25 332 336 AU NBAC N193-026 4
26 349 351 AU NBAC N193-027 2
27 314 319 AU NBAC N193-028 5
28 328 329 AU NBAC N193-029 1
29 327 334 AU NBAC N193-030 7
30 339 351 AU NBAC N193-031 12
31 316 319 AU NBAC N193-032 3
32 329 329 AU NBAC N193-033 0
33 322 334 AU NBAC N193-034 12
34 351 351 AU NBAC N193-035 0
35 317 319 AU NBAC N193-036 2
36 300 312 AU NBAC N193-037 12
37 328 336 AU NBAC N193-038 8
38 350 351 AU NBAC N193-039 1
39 320 319 AU NBAC N193-040 -1
40 325 324 AU NBAC N193-041 -1
41 318 334 AU NBAC N193-042 16
42 344 343 AU NBAC N193-043 -1
43 317 317 AU NBAC N193-044 0
44 331 331 AU NBAC N193-045 0
45 317 329 AU NBAC N193-046 12
46 350 351 AU NBAC N193-047 1
47 314 314 AU NBAC N193-048 0
48 296 312 AU NBAC N193-049 16
49 338 341 AU NBAC N193-050 3
50 351 351 AU NBAC N193-051 0
51 314 319 AU NBAC N193-052 5
52 326 329 AU NBAC N193-053 3
53 315 329 AU NBAC N193-054 14
54 167 351 AU NBAC N193-055 184
55 315 319 AU NBAC N193-056 4
56 318 319 AU NBAC N193-057 1
57 309 314 AU NBAC N193-058 5
58 347 351 AU NBAC N193-059 4
59 313 319 AU NBAC N193-060 6
60 317 317 AU NBAC N193-061 0
61 312 329 AU NBAC N193-062 17
62 345 348 AU NBAC N193-063 3
63 309 317 AU NBAC N193-064 8
64 317 319 AU NBAC N193-065 2
65 307 329 AU NBAC N193-066 22
66 343 346 AU NBAC N193-067 3
67 313 317 AU NBAC N193-068 4
68 310 310 AU NBAC N193-069 0
69 325 326 AU NBAC N193-070 1
70 352 351 AU NBAC N193-071 -1
71 296 312 AU NBAC N193-072 16
72 321 324 AU NBAC N193-073 3
73 314 329 AU NBAC N193-074 15
74 348 351 AU NBAC N193-075 3
75 306 309 AU NBAC N193-076 3
76 331 334 AU NBAC N193-077 3
77 309 314 AU NBAC N193-078 5
78 351 351 AU NBAC N193-079 0
79 318 319 AU NBAC N193-080 1
80 281 300 AU NBAC N193-081 19
81 333 341 AU NBAC N193-082 8
82 350 351 AU NBAC N193-083 1
83 312 314 AU NBAC N193-084 2
84 315 317 AU NBAC N193-085 2
85 307 329 AU NBAC N193-086 22
86 349 346 AU NBAC N193-087 -3
87 316 317 AU NBAC N193-088 1
88 306 307 AU NBAC N193-089 1
89 316 326 AU NBAC N193-090 10
90 343 344 AU NBAC N193-091 1
91 319 319 AU NBAC N193-092 0
92 325 327 AU NBAC N193-093 2
93 301 329 AU NBAC N193-094 28
94 351 351 AU NBAC N193-095 0
95 317 319 AU NBAC N193-096 2
96 314 314 AU NBAC N193-097 0
97 308 327 AU NBAC N193-098 19
98 346 351 AU NBAC N193-099 5
99 318 319 AU NBAC N193-100 1
100 316 314 AU NBAC N193-101 -2
101 314 314 AU NBAC N193-102 0
102 352 351 AU NBAC N193-103 -1
103 313 309 AU NBAC N193-104 -4
104 320 324 AU NBAC N193-105 4
105 312 329 AU NBAC N193-106 17
106 351 351 AU NBAC N193-107 0
107 310 309 AU NBAC N193-108 -1
108 331 331 AU NBAC N193-109 0
109 310 329 AU NBAC N193-110 19
110 345 346 AU NBAC N193-111 1
111 317 317 AU NBAC N193-112 0
112 305 310 AU NBAC N193-113 5
113 326 326 AU NBAC N193-114 0
114 351 351 AU NBAC N193-115 0
115 314 314 AU NBAC N193-116 0
116 322 324 AU NBAC N193-117 2
117 307 329 AU NBAC N193-118 22
118 352 351 AU NBAC N193-119 -1
119 317 319 AU NBAC N193-120 2
120 322 324 AU NBAC N193-121 2
121 314 332 AU NBAC N193-122 18
122 347 351 AU NBAC N193-123 4
123 318 319 AU NBAC N193-124 1
124 296 317 AU NBAC N193-125 21
125 340 341 AU NBAC N193-126 1
126 351 351 AU NBAC N193-127 0
127 312 314 AU NBAC N193-128 2
128 327 329 AU NBAC N193-129 2
129 307 329 AU NBAC N193-130 22
130 348 348 AU NBAC N193-131 0
131 315 317 AU NBAC N193-132 2
132 303 307 AU NBAC N193-133 4
133 309 326 AU NBAC N193-134 17
134 390 360 AU NBAC N193-135 -30
135 366 376 AU NBAC N193-136 10
136 375 378 AU NBAC N193-137 3
137 366 390 AU NBAC N193-138 24
138 418 416 AU NBAC N193-139 -2
139 371 372 AU NBAC N193-140 1
140 381 390 AU NBAC N193-141 9
141 374 388 AU NBAC N193-142 14
142 417 416 AU NBAC N193-143 -1
143 366 378 AU NBAC N193-144 12
144 359 364 AU NBAC N193-145 5
145 605 606 AU NBAC N193-146 1
146 621 624 AU NBAC N193-147 3
147 564 567 AU NBAC N193-148 3
148 585 585 AU NBAC N193-149 0
149 555 585 AU NBAC N193-150 30
150 623 624 AU NBAC N193-151 1
151 555 558 AU NBAC N193-152 3
152 600 603 AU NBAC N193-153 3
153 573 585 AU NBAC N193-154 12
154 606 618 AU NBAC N193-155 12
155 559 564 AU NBAC N193-156 5
156 579 585 AU NBAC N193-157 6
157 606 606 AU NBAC N193-158 0
158 633 624 AU NBAC N193-159 -9
159 556 558 AU NBAC N193-160 2
160 593 597 AU NBAC N193-161 4
161 571 585 AU NBAC N193-162 14
162 633 624 AU NBAC N193-163 -9
163 600 606 AU NBAC N193-164 6
164 439 411 AU NBAC N193-165 -28
165 408 405 AU NBAC N193-166 -3
166 429 429 AU NBAC N193-167 0
167 414 420 AU NBAC N193-168 6
168 417 411 AU NBAC N193-169 -6
169 408 408 AU NBAC N193-170 0
170 428 429 AU NBAC N193-171 1
171 392 396 AU NBAC N193-172 4
172 437 414 AU NBAC N193-173 -23
173 393 402 AU NBAC N193-174 9
174 426 426 AU NBAC N193-175 0
175 384 387 AU NBAC N193-176 3
176 394 396 AU NBAC N193-177 2
177 400 405 AU NBAC N193-178 5
178 411 423 AU NBAC N193-179 12
179 384 387 AU NBAC N193-180 3
180 405 405 AU NBAC N193-181 0
181 379 402 AU NBAC N193-182 23
182 264 291 AU NBAC N193-183 27
183 389 390 AU NBAC N193-184 1
184 397 396 AU NBAC N193-185 -1
185 387 402 AU NBAC N193-186 15
186 430 429 AU NBAC N193-187 -1
187 387 390 AU NBAC N193-188 3
188 346 381 AU NBAC N193-189 35
189 378 417 AU NBAC N193-190 39
190 489 520 AU NBAC N193-191 31
191 468 472 AU NBAC N193-192 4
192 488 488 AU NBAC N193-193 0
193 468 488 AU NBAC N193-194 20
194 520 520 AU NBAC N193-195 0
195 461 464 AU NBAC N193-196 3
196 496 496 AU NBAC N193-197 0
197 468 488 AU NBAC N193-198 20
In [ ]: