๐Ÿ…ฟ๏ธ Python_

๐Ÿ“Š ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” – CSV ๋ณ‘ํ•ฉ ๋ฐ ์ด์ค‘ Y์ถ• ๊ทธ๋ž˜ํ”„ (macOS + Python)

CodeLoge 2025. 6. 23. 20:55

โ“ ๋ฌธ์ œ ์„ค๋ช…

 

์—ฌ๋Ÿฌ ๊ฐœ์˜ CSV ํŒŒ์ผ์„ ๋ณ‘ํ•ฉํ•˜์—ฌ DataFrame์œผ๋กœ ๊ตฌ์„ฑํ•œ ๋’ค, ๋ณต์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ์‹œ๊ฐํ™”์— ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด์ค‘ y์ถ•์„ ํ™œ์šฉํ•œ ์‹œ๊ฐํ™” ๊ตฌํ˜„


๐Ÿ“Œ ์ œํ•œ ์กฐ๊ฑด

 

• CSV ํŒŒ์ผ ์ง์ ‘ ๋ณ‘ํ•ฉ

 ์ธ์ฝ”๋”ฉ์€ ๊ธฐ๋ณธ UTF-8 ์‚ฌ์šฉ

 matplotlib ์‹œ๊ฐํ™” ์‚ฌ์šฉ

 macOS ํ™˜๊ฒฝ ํ•œ๊ธ€ ํฐํŠธ ์ ์šฉ

 ๋‘ ๊ฐ€์ง€ ์‹œ๊ฐํ™” (ํ˜ธํก๊ธฐ ์งˆํ™˜์ž ์ˆ˜ + ๋ฏธ์„ธ๋จผ์ง€, ์‚ฌ๊ณ  ๊ฑด์ˆ˜ + ๊ฐ•์ˆ˜๋Ÿ‰)


๐Ÿ” ํ’€์ด ์ „๋žต

 

 csv.reader๋กœ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

 ๋ณ‘ํ•ฉ๋œ ๋‚ด์šฉ์„ ์ƒˆ๋กœ์šด CSV๋กœ ์ €์žฅ

 pandas๋กœ ์ฝ์–ด๋“ค์—ฌ ์ด์ค‘ y์ถ• ๊ทธ๋ž˜ํ”„ ๊ตฌ์„ฑ

 macOS์˜ ๊ธฐ๋ณธ ํ•œ๊ธ€ ํฐํŠธ(AppleGothic) ์„ค์ •

 ์‹œ๊ฐ์ ์œผ๋กœ ์ง๊ด€์ ์ธ ๋น„๊ต๋ฅผ ์œ„ํ•œ bar + line ์กฐํ•ฉ ๊ตฌ์„ฑ


โœ… ์ฝ”๋”ฉ (macOS ๊ธฐ์ค€ Python)

import csv
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

# ํŒŒ์ผ ์ฝ๊ธฐ
with open('์‚ฌ๊ณ .csv') as f1:
    datas = list(csv.reader(f1))

with open('๊ฐ•์ˆ˜๋Ÿ‰.csv') as f2:
    datas2 = list(csv.reader(f2))

with open('ํ˜ธํก๊ธฐ์งˆํ™˜.csv') as f3:
    datas3 = list(csv.reader(f3))
with open('PM10.csv', encoding='utf-8') as f4:
    datas4 = list(csv.reader(f4))
with open('PM2.5.csv', encoding='utf-8') as f5:
    datas5 = list(csv.reader(f5))

# ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ
with open('output_.csv', 'w', encoding='utf-8') as out1:
    cnt = 0
    for i in range(len(datas3)):
        if i == 0:
            out1.write(datas3[i][0] + ", " + datas3[i][1] + ", PM10, PM2.5\n")
        elif datas3[i][0] != '':
            cnt += 1
            out1.write(datas3[i][0] + ", " + "".join(datas3[i][1].split(",")) + ", " + datas4[cnt][1] + ", " + datas5[cnt][1] + "\n")

# macOS ํ•œ๊ธ€ ํฐํŠธ ์„ค์ •
mpl.rc('font', family='AppleGothic')

# ๊ทธ๋ž˜ํ”„ 1: ํ˜ธํก๊ธฐ ์งˆํ™˜์ž ์ˆ˜ + ๋ฏธ์„ธ๋จผ์ง€
df = pd.read_csv('output_.csv', index_col='์ง„๋ฃŒ๋…„์›”')
fig, ax1 = plt.subplots(figsize=(12, 4))
ax1.set_title('์›”๋ณ„ ํ˜ธํก๊ธฐ์งˆํ™˜์ž ์ˆ˜์™€ ๋Œ€๊ธฐ์˜ค์—ผ์˜ ๊ด€๊ณ„')
ax1.set_xlabel('์ง„๋ฃŒ๋…„์›”')
ax1.set_ylabel('ํ™˜์ž ์ˆ˜', color='tab:blue')
ax1.bar(df.index, df[' ํ™˜์ž ์ˆ˜'], color='tab:blue', alpha=0.6)
ax1.tick_params(axis='y', labelcolor='tab:blue')
plt.xticks(rotation=90)

ax2 = ax1.twinx()
ax2.set_ylabel('PM10/PM2.5', color='tab:green')
ax2.plot(df.index, df[' PM10'], color='tab:green', marker='o')
ax2.plot(df.index, df[' PM2.5'], color='tab:red', marker='o')
ax2.tick_params(axis='y', labelcolor='tab:green')
fig.legend(loc='upper right')
plt.tight_layout()
plt.show()

# ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ
with open('output.csv', 'w', encoding='utf-8') as out2:
    for i in range(len(datas)):
        out2.write(datas[i][0] + ", " + datas[i][1] + ", " + datas2[i][0] + "\n")

# ๊ทธ๋ž˜ํ”„ 2: ์‚ฌ๊ณ  ๋ฐœ์ƒ ๊ฑด์ˆ˜ + ๊ฐ•์ˆ˜๋Ÿ‰
df = pd.read_csv('output.csv', index_col='์‹œ์ ')
fig, ax1 = plt.subplots(figsize=(12, 4))
ax1.set_title('์›”๋ณ„ ๊ฐ•์ˆ˜๋Ÿ‰๊ณผ ์ฐจ๋Ÿ‰์‚ฌ๊ณ  ๋ฐœ์ƒ ๊ฑด์ˆ˜')
ax1.set_xlabel('์‹œ์ ')
ax1.set_ylabel('๋ฐœ์ƒ๊ฑด์ˆ˜ (๊ฑด)', color='tab:blue')
ax1.bar(df.index, df[' ๋ฐœ์ƒ๊ฑด์ˆ˜ (๊ฑด)'], color='tab:blue', alpha=0.6)
ax1.tick_params(axis='y', labelcolor='tab:blue')
plt.xticks(rotation=90)

ax2 = ax1.twinx()
ax2.set_ylabel('๊ฐ•์ˆ˜๋Ÿ‰(mm)', color='tab:green')
ax2.plot(df.index, df[' ๊ฐ•์ˆ˜๋Ÿ‰(mm)'], color='tab:green', marker='o')
ax2.tick_params(axis='y', labelcolor='tab:green')
fig.legend(loc='upper right')
plt.tight_layout()
plt.show()

๐Ÿ’ก ํ•ด์„ค

 

 AppleGothic ํฐํŠธ๋Š” macOS ๊ธฐ๋ณธ ํ•œ๊ธ€ ํฐํŠธ๋กœ matplotlib ํ•œ๊ธ€ ๊นจ์ง ๋ฌธ์ œ ํ•ด๊ฒฐ

 twinx()๋ฅผ ํ™œ์šฉํ•œ ์ด์ค‘ y์ถ• ํ‘œํ˜„์œผ๋กœ ๋‘ ๋ฐ์ดํ„ฐ์˜ ์ƒ๊ด€๊ด€๊ณ„ ์‹œ๊ฐํ™”

 ํ•˜๋‚˜์˜ ์ฐจํŠธ ๋‚ด์—์„œ bar์™€ line์„ ํ•จ๊ป˜ ํ™œ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ ๊ฐ„ ํ๋ฆ„ ๋น„๊ต ๊ฐ€๋Šฅ

 ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๊ด€๊ณ„์„ฑ ์‹œ๊ฐํ™”์— ํšจ๊ณผ์ 