주 단위 데이터를 일 단위 데이터로 늘리기

네이버 검색 트렌드는 주 단위로 특정 검색어에 대한 검색량을 제공하고 있음

주별 검색량을 검색 기간 사이의 최소검색량, 최대검색량을 기준으로 0~100 사이의 수로 scaling하여 보여줌

이 주 단위의 데이터를 차후 데이터 분석 프로젝트(종속변수 예측)에서 입력변수로 사용할 때 단순히 한 주의 검색량을 하나의 값으로 일괄적으로 넣기보단

한 주와 연속되는 다른 주의 검색량 사이 직선 상에 1일 간격으로 점을 찍어 예측의 정확도를 더 높이고자 일 단위로 가공하고자 함

주 단위 데이터 만들기

주 리스트 만들기


In [3]:
##1년은 52주로 구성됨
week = list(range(1, 53)) #range 함수의 첫 번째 파라매터에는 시작할 숫자, 두 번째 파라매터에는 끝나는 숫자보다 1 큰 수를 넣어줌

In [ ]:
week

In [120]:
len(week)


Out[120]:
52

각 주의 대표일 리스트 만들기


In [103]:
##한 주는 7일로 구성되어 있으므로 첫 번째 주의 가운데 날인 4번째 일을 그 주의 대표값(일)로 표시 (두 번째 주의 대표일은 11일)
representative_day = list(range(4, 365, 7))#range의 세 번째 파라매터에는 간격이 들어감

In [ ]:
representative_day

In [119]:
len(representative_day)


Out[119]:
52

In [9]:
##나중에 날짜에 대한 기능을 배우면 이 인덱스로 날짜 갖다 붙이기 가능

난수생성기


In [1]:
import random

In [2]:
random.randint(0, 10) #0~10 사이의 정수 난수 생성(0과 10 포함)


Out[2]:
2

난수 생성으로 검색량 리스트 만들기


In [10]:
search = [] #비어있는 리스트 생성

In [11]:
## 52주(1년) 동안의 주간 검색량 생성
for i in range(0, 52) :
    search = search + [random.randint(0, 100)] #검색량 트렌드 데이터가 0~100 사이로 검색량을 나타내므로 0과 100 사이의 숫자 생성

In [ ]:
search

In [118]:
len(search)


Out[118]:
52

데이터 프레임 만들기


In [128]:
from pandas import DataFrame

In [129]:
###예시
#dataframe 2차원같은 자료구조
#키는 컬럼 안에 들어가는애들은 리스트형식 으로 하면 예쁜 모양으로 그려짐
data = {
        'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002],
       }  #사전객체

In [130]:
frame = DataFrame(data)

In [131]:
frame


Out[131]:
state year
0 Ohio 2000
1 Ohio 2001
2 Ohio 2002
3 Nevada 2001
4 Nevada 2002

In [122]:
data = {
    'week': week,
    'day': representative_day,
    'search_volume': search,
}

In [123]:
frame = DataFrame(data)

In [124]:
frame


Out[124]:
day search_volume week
0 4 40 1
1 11 92 2
2 18 54 3
3 25 76 4
4 32 33 5
5 39 91 6
6 46 57 7
7 53 23 8
8 60 80 9
9 67 94 10
10 74 12 11
11 81 66 12
12 88 43 13
13 95 13 14
14 102 48 15
15 109 23 16
16 116 60 17
17 123 66 18
18 130 18 19
19 137 22 20
20 144 8 21
21 151 14 22
22 158 47 23
23 165 95 24
24 172 83 25
25 179 53 26
26 186 8 27
27 193 98 28
28 200 73 29
29 207 63 30
30 214 29 31
31 221 79 32
32 228 60 33
33 235 20 34
34 242 44 35
35 249 54 36
36 256 95 37
37 263 43 38
38 270 17 39
39 277 21 40
40 284 18 41
41 291 98 42
42 298 97 43
43 305 75 44
44 312 83 45
45 319 55 46
46 326 91 47
47 333 36 48
48 340 46 49
49 347 7 50
50 354 15 51
51 361 10 52

일 단위 데이터로 늘리기

1과 7 사이에 2개의 수 더 늘리기


In [159]:
a = [1, 7]

In [160]:
a


Out[160]:
[1, 7]

In [161]:
b = (a[1]-a[1-1])/3

In [162]:
a1 = a[1-1] + b

In [163]:
a1


Out[163]:
3.0

In [164]:
a2 = a1 + b

In [165]:
a2


Out[165]:
5.0

In [166]:
a3 = a2 + b

In [167]:
round(a3, 5) == a[1]


Out[167]:
True

In [168]:
final = [a[1-1]] + [a1] + [a2]

In [169]:
final


Out[169]:
[1, 3.0, 5.0]

실제 데이터로 생성


In [170]:
final = []
part = []

In [171]:
for i in range(1, 52) :
    b = (search[i] - search[i-1])/7
    a1 = search[i-1] + b
    a2 = a1 + b
    a3 = a2 + b
    a4 = a3 + b
    a5 = a4 + b
    a6 = a5 + b
    part = [search[i-1]] + [a1] + [a2] + [a3] + [a4] + [a5] + [a6] 
    final = final + part

In [172]:
final


Out[172]:
[40,
 47.42857142857143,
 54.85714285714286,
 62.28571428571429,
 69.71428571428572,
 77.14285714285715,
 84.57142857142858,
 92,
 86.57142857142857,
 81.14285714285714,
 75.71428571428571,
 70.28571428571428,
 64.85714285714285,
 59.428571428571416,
 54,
 57.142857142857146,
 60.28571428571429,
 63.42857142857144,
 66.57142857142858,
 69.71428571428572,
 72.85714285714286,
 76,
 69.85714285714286,
 63.714285714285715,
 57.57142857142857,
 51.42857142857142,
 45.28571428571428,
 39.14285714285713,
 33,
 41.285714285714285,
 49.57142857142857,
 57.857142857142854,
 66.14285714285714,
 74.42857142857143,
 82.71428571428572,
 91,
 86.14285714285714,
 81.28571428571428,
 76.42857142857142,
 71.57142857142856,
 66.7142857142857,
 61.85714285714284,
 57,
 52.142857142857146,
 47.28571428571429,
 42.42857142857144,
 37.571428571428584,
 32.71428571428573,
 27.857142857142872,
 23,
 31.142857142857142,
 39.285714285714285,
 47.42857142857143,
 55.57142857142857,
 63.71428571428571,
 71.85714285714285,
 80,
 82.0,
 84.0,
 86.0,
 88.0,
 90.0,
 92.0,
 94,
 82.28571428571429,
 70.57142857142858,
 58.85714285714287,
 47.14285714285715,
 35.42857142857144,
 23.714285714285722,
 12,
 19.714285714285715,
 27.42857142857143,
 35.142857142857146,
 42.85714285714286,
 50.57142857142858,
 58.28571428571429,
 66,
 62.714285714285715,
 59.42857142857143,
 56.142857142857146,
 52.85714285714286,
 49.57142857142858,
 46.28571428571429,
 43,
 38.714285714285715,
 34.42857142857143,
 30.142857142857146,
 25.85714285714286,
 21.571428571428577,
 17.285714285714292,
 13,
 18.0,
 23.0,
 28.0,
 33.0,
 38.0,
 43.0,
 48,
 44.42857142857143,
 40.85714285714286,
 37.28571428571429,
 33.71428571428572,
 30.14285714285715,
 26.571428571428577,
 23,
 28.285714285714285,
 33.57142857142857,
 38.857142857142854,
 44.14285714285714,
 49.42857142857142,
 54.71428571428571,
 60,
 60.857142857142854,
 61.71428571428571,
 62.57142857142856,
 63.428571428571416,
 64.28571428571428,
 65.14285714285714,
 66,
 59.142857142857146,
 52.28571428571429,
 45.42857142857144,
 38.571428571428584,
 31.714285714285726,
 24.85714285714287,
 18,
 18.571428571428573,
 19.142857142857146,
 19.71428571428572,
 20.285714285714292,
 20.857142857142865,
 21.428571428571438,
 22,
 20.0,
 18.0,
 16.0,
 14.0,
 12.0,
 10.0,
 8,
 8.857142857142858,
 9.714285714285715,
 10.571428571428573,
 11.42857142857143,
 12.285714285714288,
 13.142857142857146,
 14,
 18.714285714285715,
 23.42857142857143,
 28.142857142857146,
 32.85714285714286,
 37.57142857142858,
 42.28571428571429,
 47,
 53.857142857142854,
 60.71428571428571,
 67.57142857142857,
 74.42857142857143,
 81.28571428571429,
 88.14285714285715,
 95,
 93.28571428571429,
 91.57142857142858,
 89.85714285714288,
 88.14285714285717,
 86.42857142857146,
 84.71428571428575,
 83,
 78.71428571428571,
 74.42857142857142,
 70.14285714285712,
 65.85714285714283,
 61.57142857142855,
 57.28571428571426,
 53,
 46.57142857142857,
 40.14285714285714,
 33.71428571428571,
 27.285714285714278,
 20.857142857142847,
 14.428571428571418,
 8,
 20.857142857142858,
 33.714285714285715,
 46.57142857142857,
 59.42857142857143,
 72.28571428571429,
 85.14285714285715,
 98,
 94.42857142857143,
 90.85714285714286,
 87.28571428571429,
 83.71428571428572,
 80.14285714285715,
 76.57142857142858,
 73,
 71.57142857142857,
 70.14285714285714,
 68.71428571428571,
 67.28571428571428,
 65.85714285714285,
 64.42857142857142,
 63,
 58.142857142857146,
 53.28571428571429,
 48.42857142857144,
 43.571428571428584,
 38.71428571428573,
 33.857142857142875,
 29,
 36.142857142857146,
 43.28571428571429,
 50.42857142857144,
 57.571428571428584,
 64.71428571428572,
 71.85714285714286,
 79,
 76.28571428571429,
 73.57142857142858,
 70.85714285714288,
 68.14285714285717,
 65.42857142857146,
 62.714285714285744,
 60,
 54.285714285714285,
 48.57142857142857,
 42.857142857142854,
 37.14285714285714,
 31.428571428571423,
 25.714285714285708,
 20,
 23.428571428571427,
 26.857142857142854,
 30.28571428571428,
 33.71428571428571,
 37.14285714285714,
 40.57142857142857,
 44,
 45.42857142857143,
 46.85714285714286,
 48.28571428571429,
 49.71428571428572,
 51.14285714285715,
 52.571428571428584,
 54,
 59.857142857142854,
 65.71428571428571,
 71.57142857142857,
 77.42857142857143,
 83.28571428571429,
 89.14285714285715,
 95,
 87.57142857142857,
 80.14285714285714,
 72.71428571428571,
 65.28571428571428,
 57.85714285714285,
 50.428571428571416,
 43,
 39.285714285714285,
 35.57142857142857,
 31.857142857142854,
 28.14285714285714,
 24.428571428571423,
 20.714285714285708,
 17,
 17.571428571428573,
 18.142857142857146,
 18.71428571428572,
 19.285714285714292,
 19.857142857142865,
 20.428571428571438,
 21,
 20.571428571428573,
 20.142857142857146,
 19.71428571428572,
 19.285714285714292,
 18.857142857142865,
 18.428571428571438,
 18,
 29.42857142857143,
 40.85714285714286,
 52.28571428571429,
 63.71428571428572,
 75.14285714285715,
 86.57142857142858,
 98,
 97.85714285714286,
 97.71428571428572,
 97.57142857142858,
 97.42857142857144,
 97.2857142857143,
 97.14285714285717,
 97,
 93.85714285714286,
 90.71428571428572,
 87.57142857142858,
 84.42857142857144,
 81.2857142857143,
 78.14285714285717,
 75,
 76.14285714285714,
 77.28571428571428,
 78.42857142857142,
 79.57142857142856,
 80.7142857142857,
 81.85714285714283,
 83,
 79.0,
 75.0,
 71.0,
 67.0,
 63.0,
 59.0,
 55,
 60.142857142857146,
 65.28571428571429,
 70.42857142857143,
 75.57142857142857,
 80.71428571428571,
 85.85714285714285,
 91,
 83.14285714285714,
 75.28571428571428,
 67.42857142857142,
 59.57142857142856,
 51.71428571428571,
 43.857142857142854,
 36,
 37.42857142857143,
 38.85714285714286,
 40.28571428571429,
 41.71428571428572,
 43.14285714285715,
 44.571428571428584,
 46,
 40.42857142857143,
 34.85714285714286,
 29.285714285714292,
 23.714285714285722,
 18.142857142857153,
 12.571428571428582,
 7,
 8.142857142857142,
 9.285714285714285,
 10.428571428571427,
 11.57142857142857,
 12.714285714285712,
 13.857142857142854,
 15,
 14.285714285714286,
 13.571428571428573,
 12.85714285714286,
 12.142857142857146,
 11.428571428571432,
 10.714285714285719]

In [173]:
len(final)


Out[173]:
357

나중에 plot을 배우면 더 직관적으로 이해하기 좋을 것 같음

일 단위 데이터 만들기

난수 생성으로 일 리스트 만들기


In [176]:
day = list(range(4,361)) #첫째주의 중간 일인 4일부터 마지막주(52주)의 중간 일인 361일 전날까지에 대해서 산출한 것이므로

In [ ]:
day

In [76]:
len(day)


Out[76]:
357

최종 데이터 프레임 만들기


In [178]:
full_data = {
    'day': day,
    'search volume': final,
}

In [179]:
full_frame = DataFrame(full_data)

In [ ]:
full_frame