๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90

๐Ÿ’ป Programming87

[Airflow] ์‰˜ ์Šคํฌ๋ฆฝํŠธ, ๋ช…๋ น์–ด ์‹คํ–‰ํ•˜๊ธฐ | BashOperator ์‚ฌ์šฉ BashOperator๋Š” Apache Airflow์—์„œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ, ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ BashOperator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ, ๊ฐ„๋‹จํ•œ Bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ์„ ๋กœ๊น…ํ•œ๋‹ค. from airflow import DAG from airflow.operators.bash_operator import BashOperator from datetime import datetime, timedelta # DAG ์ •์˜ dag = DAG( 'bash_operator_example', description='Example DAG with BashOperator', sched.. 2023. 11. 19.
[Airflow] ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ DAG ์‹คํ–‰ํ•˜๊ธฐ (์Šค์ผ€์ค„๋ง) | schedule_interval | cron ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„ Apache Airflow์—์„œ DAG์„ ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด schedule_interval ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” DAG์ด ์‹คํ–‰๋  ์ฃผ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ์ฃผ๊ธฐ๋Š” timedelta ๊ฐ์ฒด๋กœ ์ •์˜๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งค์ผ ์‹คํ–‰ํ•˜๋ ค๋ฉด timedelta(days=1)๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. timedelta๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž. timedelta # ๋งค์ผ ์‹คํ–‰ schedule_interval=timedelta(days=1) # 3์ผ๋งˆ๋‹ค ์‹คํ–‰ schedule_interval=timedelta(days=3) # ๋งค์ฃผ ์›”์š”์ผ ์‹คํ–‰ schedule_interval=timedelta(weeks=1, days=1) # ๋งค์‹œ๊ฐ„ ์‹คํ–‰ schedule_interval=timedelta(hours=1.. 2023. 11. 19.
[Airflow] Airflow & DAG ์„ค๋ช… Apache Airflow Apache Airflow๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์Šค์ผ€์ค„๋งํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํ”Œ๋žซํผ์ด๋‹ค. Airflow๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ํŒŒ์ด์ฌ ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ปค์Šคํ…€ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์‰ฝ๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ˆ˜๋งŽ์€ ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฒ•์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ •๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์ ์ง„์  ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ์˜คํ”ˆ ์†Œ์Šค๋ผ๋Š” ์žฅ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ธฐ์—…์—์„œ Airflow๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. (๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์กฐ์งํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ จ์˜ ๋‹จ๊ณ„ ๋ฐ ํ”„๋กœ์„ธ์Šค) Apache Airflow์˜ ํŠน์ง• ์Šค์ผ€์ค„๋ง๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง Airflow๋Š” ์ž‘์—…์„ ์Šค์ผ€์ค„๋งํ•˜๊ณ  ๊ฐ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ ์˜ˆ.. 2023. 11. 19.
[pandas] ํŠน์ • ์ปฌ๋Ÿผ์—์„œ ํŠน์ • ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ํ–‰ ์ฐพ๊ธฐ | str.contains ํŒ๋‹ค์Šค์—์„œ๋Š” ํŠน์ • ์ปฌ๋Ÿผ์—์„œ ํŠน์ • ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ํ–‰์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด str.contains() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. str.contains() ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• contains_apple = df[df['์ปฌ๋Ÿผ A'].str.contains('๊ฐ€๋‚˜๋‹ค๋ผ')] "์ปฌ๋Ÿผ A"์—์„œ "๊ฐ€๋‚˜๋‹ค๋ผ"๊ฐ€ ํฌํ•จ๋œ ํ–‰์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ •๊ทœ ํ‘œํ˜„์‹ ์‚ฌ์šฉ contains_pattern = df[df['A'].str.contains('์‚ฌ๊ณผ|๋ฐ”๋‚˜๋‚˜', regex=True)] regex=True ๋กœ ์„ค์ •ํ•˜์—ฌ ์ •๊ทœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ํŒจํ„ด์ด๋‚˜ ๋ฌธ์ž์—ด์„ ์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ ์˜ˆ์‹œ๋Š” '์‚ฌ๊ณผ' ๋˜๋Š” '๋ฐ”๋‚˜๋‚˜'๊ฐ€ ํฌํ•จ๋œ.. 2023. 11. 17.
[pandas] ํŠน์ • ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ๊ณต๋ฐฑ์ธ ํ–‰์„ ์ œ์™ธํ•˜๋Š” ๋ฐฉ๋ฒ• | dropna ํŒ๋‹ค์Šค์˜ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—์„œ ํŠน์ • ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ๊ณต๋ฐฑ(๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด)์ธ ํ–‰์„ ์ œ์™ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž. ํŠน์ • ์ปฌ๋Ÿผ์˜ ๊ณต๋ฐฑ์ธ ํ–‰ ์ œ๊ฑฐ import pandas as pd # ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ƒ์„ฑ data = {'A': [1, 2, 3, 4], 'B': ['apple', 'banana', '', 'orange']} df = pd.DataFrame(data) # 'B' ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ๊ณต๋ฐฑ์ธ ํ–‰ ์ œ์™ธ df_no_empty_values = df[df['B'].str.strip() != ''] # ๊ฒฐ๊ณผ ์ถœ๋ ฅ print(df_no_empty_values) ์œ„ ์ฝ”๋“œ์—์„œ df['B'].str.strip() != '' ๋ถ€๋ถ„์€ 'B' ์ปฌ๋Ÿผ์˜ ๊ฐ ๊ฐ’์— ๋Œ€ํ•ด ์ขŒ์šฐ์˜ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋นˆ ๋ฌธ์ž์—ด๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ณต๋ฐฑ์ธ.. 2023. 11. 17.
[pandas] ํŠน์ • ์ปฌ๋Ÿผ์—์„œ ์ค‘๋ณต๋œ ๊ฐ’ ์ œ๊ฑฐ | drop_duplicates ํŒ๋‹ค์Šค ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—์„œ ๊ฐ„ํ˜น ํŠน์ • ์ปฌ๋Ÿผ์— ์ค‘๋ณต๋œ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ฐ€์ง„ ํ–‰ ์ค‘ ์ฒ˜์Œ ๋“ฑ์žฅํ•˜๋Š” ํ–‰์„ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์ค‘๋ณต๋œ ํ–‰์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. import pandas as pd # ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ƒ์„ฑ data = {'column_name': [1, 2, 3, 1, 2, 4]} df = pd.DataFrame(data) # ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ฐ€์ง„ ํ–‰ ์ค‘ ์ฒ˜์Œ ๋“ฑ์žฅํ•˜๋Š” ํ–‰์„ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์ค‘๋ณต๋œ ํ–‰ ์ œ๊ฑฐ df_no_duplicates = df.drop_duplicates(subset='column_name', keep='first') # ๊ฒฐ๊ณผ ์ถœ๋ ฅ print(df_no_duplicates) # ํ–‰ ๊ฐœ์ˆ˜ ๋น„๊ต print(len(df.. 2023. 11. 17.
728x90