파이썬

데이터 프레임에서 특정 데이터 추출(globals())

이석사 중 2023. 10. 18. 21:12
728x90

정말 간만에 포스티입니다

 

현생이 너무 바빠서 오랜만에 쓰는 것 같습니다

 

 제 블로그 누적 방문자수가 드디어 1만명을 넘었습니다! 많은 관심 감사드리고

 

앞으로도 유용한 코드 많이 기록해보겠습니다!

 

오늘은 특정 데이터에서 특정 날짜와 최대, 최소를 추출하는 법을 써보겠습니다


먼저 이 코드를 만들게 된 계기는 같은 학과 후배의 도움 요청으로 하게 되었습니다

 

이 코드가 하는 일은 1973년부터 2023년까지의 9월 평균기온, 최고기온, 최저기온을 가져옵니다

 

9월 1일부터 30일 별로 최고기온, 최소기온을 모아서 새로운 리스트를 동적변수를 사용해서 만듭니다

 

그리고 30일치의 최고기온에서 최대, 최소, 최저기온에서도 최대 최소를 각각 뽑아내어 그림을 그릴겁니다


코드입니다

 

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv("/content/drive/MyDrive/extremum_20231016112557.csv", encoding = 'cp949')

max_l = df['최고기온(℃)'][1500:]
mean_l = df['평균기온(℃)'][1500:]
min_l = df['최저기온(℃)'][1500:]

for i in np.arange(1, 31, 1):
  globals()['z{}'.format(i)] = []
  globals()['x{}'.format(i)] = []
  
#-----------------------------------------------------------------
  
big = []
small = []

b_big = []
b_small = []

s_big = []
s_small =[]

for k in np.arange(1, 31, 1):

  start = -1

  for j in np.arange(start + k, 1530, 30):
    a = df['최고기온(℃)'][j]
    globals()['z{}'.format(k)].append(a)
    b = df['최저기온(℃)'][j]
    globals()['x{}'.format(k)].append(b)

  big.append(np.array(globals()['z{}'.format(k)]).max())
  small.append(np.array(globals()['x{}'.format(k)]).min())

  b_big.append(np.array(globals()['z{}'.format(k)]).max())
  b_small.append(np.array(globals()['z{}'.format(k)]).min())

  s_big.append(np.array(globals()['x{}'.format(k)]).max())
  s_small.append(np.array(globals()['x{}'.format(k)]).min())

#-----------------------------------------------------------------

fig, ax = plt.subplots(figsize = (15, 9))

ax.scatter(np.arange(1, 31, 1), big, color = 'k')
ax.scatter(np.arange(1, 31, 1), small, color = 'k')

ax.plot(np.arange(1, 31, 1), max_l, color = 'r')
ax.plot(np.arange(1, 31, 1), mean_l, color = 'g')
ax.plot(np.arange(1, 31, 1), min_l, color = 'b')

ax.grid()

ax.set_ylabel("Temperature (\u00b0C)", fontsize = 15)
ax.set_xlabel("Date (day)", fontsize = 15)

ax.set_title("September Temperature Series", fontsize = 20)

#-----------------------------------------------------------------

import matplotlib.pyplot as plt

# Horizontal bar plot with gaps
fig, ax = plt.subplots(figsize = (15, 9))

plt.ylim(0, 40)

ax.grid(zorder = 1)

for h in np.arange(1, 31, 1):
  ax.bar(h, b_big[h-1] - b_small[h-1], bottom = b_small[h-1], color = 'red', alpha = 0.5, zorder = 2)
  ax.bar(h, s_big[h-1] - s_small[h-1], bottom = s_small[h-1], color = 'blue', alpha = 0.5, zorder = 2)

ax.set_ylabel("Temperature (\u00b0C)", fontsize = 15)
ax.set_xlabel("Date (day)", fontsize = 15)

ax.set_title("September Temperature Series", fontsize = 20)

globals 부분을 집중적으로 보겠습니다

 


for i in np.arange(1, 31, 1):  
  globals()['z{}'.format(i)] = []
  globals()['x{}'.format(i)] = []

globals는 위에 코드처럼 동적으로 한 번에 여러 변수들을 만들 때 자주 사용됩니다

 

globals 뒤에 있는 [ ]안에 설정한 형식으로 변수를 만들 수 있고 format문과 함께 사용합니다

 

for 문에서 1~30 까지의 숫자가 반복이 되는데 z1 ~ z30까지의 변수를 만드는 것입니다

 

그리고 그 변수들에는 일별로 추출한 데이터를 입력할 빈 리스트를 만들어줍니다

 

for k in np.arange(1, 31, 1):

  start = -1

  for j in np.arange(start + k, 1530, 30):
    a = df['최고기온(℃)'][j]
    globals()['z{}'.format(k)].append(a)
    b = df['최저기온(℃)'][j]
    globals()['x{}'.format(k)].append(b)

  big.append(np.array(globals()['z{}'.format(k)]).max())
  small.append(np.array(globals()['x{}'.format(k)]).min())

  b_big.append(np.array(globals()['z{}'.format(k)]).max())
  b_small.append(np.array(globals()['z{}'.format(k)]).min())

  s_big.append(np.array(globals()['x{}'.format(k)]).max())
  s_small.append(np.array(globals()['x{}'.format(k)]).min())

 

추후에 다시 호출할 때도 똑같이 사용해주시면 됩니다

 

for k in np.arange(1, 31, 1):

  big.append(np.array(globals()['z{}'.format(k)]).max())

이 부분만 따로 때놓고 생각해보면

 

for k in np.arange(1, 31, 1):

  big.append(np.array(z1)).max())

이런 식으로 코드가 돌아가게 되는 겁니다

 

전역 변수 선언은 굉장히 유용하게 쓰이니 알아두시면 좋을 것 같습니다


결과 그림입니다

막대 그래프는 bottom을 사용해서 그렸습니다

 

다시 한 번 누적 방문 1만명에 감사드리며 오늘도 긴 글 읽어주셔서 감사합니다!

728x90