شکل فایل CSV

در این فصل مجموعه‌داده‌ها را از منابع آنلاین بارگیری کرده و بر اساس آن‌ها بصری‌سازی‌های کاربردی‌ای خواهید ساخت. شما می‌توانید گستره‌ی عظیمی از داده‌ها را به صورت آنلاین پیدا کنیم که بسیاری از آن‌ها هنوز کاملاً بررسی نشده‌اند. توانایی تحلیل این داده‌ها به شما امکان یافتن الگوها و ارتباطاتی در آن‌ها می‌دهد که هیچ‌کس پیدا نکرده است.

دسترسی به داده‌ها و بصری‌سازی آن‌ها از طریق دو گون129 ه‌ی متداول ذخیره‌سازی داده، CSV و JSON خواهد بود. از ماژول csv پایتون برای پردازش داده‌های هواشناسی ذخیره‌شده به شکل CSV (مقدارهای جداشده با کاما) استفاده کرده و کمینه و بیشینه‌ی دما را در طول زمان و در دو موقعیّت مختلف تحلیل می‌کنیم. از Matplotlib برای تولید نمودارهایی بر اساس داده‌های بارگیری‌شده بهره می‌گیریم تا تغییرات دما را در دو محیط متفاوت، Sitka, Alaska و Death Valley, California نشان دهیم. در ادامه‌ی فصل از ماژول json برای دریافت داده‌های لرزه‌نگاری ذخیره‌شده به شکل JSON استفاده می‌کنیم و به کمک پلات‌لی یک نقشه‌ی جهان رسم می‌کنیم که موقعیّت‌ها و بزرگی‌های زمین‌لرزه‌های اخیر را نشان می‌دهد.

در پایان این فصل شما آماده‌ی کار با گونه‌ها و شکل‌های مختلف مجموعه‌داده‌ها خواهید بود و درک عمیق‌تری از چگونگی ساختن بصری‌سازی‌های پیچیده کسب خواهید کرد. داشتنِ تواناییِ دسترسی یافتن و بصری کردنِ داده‌های آنلاین به انواع و شکل‌های مختلف برای کار کردن با گستره‌ی بزرگی از مجموعه‌داده‌های جهان واقعی لازم است.

شکل فایل CSV

یک راه ساده برای ذخیره کردن داده‌های در فایل‌های متنی این است که آن‌ها در قالب دنباله‌ای از مقدارهای جداشده با کاما بنویسیم که مقدارهای جداشده با کاما یا CSV نامیده می‌شوند. به فایل‌های حاصل به این روش فایل‌های CSV گویند. برای مثال اینجا تکه‌ای از داده‌های هواشناسی را به شکل CSV می‌بینیم:

1
"USW00025333","SITKA AIRPORT, AK US","2018-01-01","0.45",,"48","38"

این گزیده‌ای از داده‌های هواشناسی تاریخ اول ژانویه‌ی ۲۰۱۸ در شهر سیتکای آلاسکا است و شامل بیشینه و کمینه‌ی دما و تعداد دیگری اندازه‌گیری در طول روز است. خواندن فایل‌های CSV ممکن است برای انسان‌ها مشکل باشد امّا برنامه‌های به سادگی مقدارها را از آن خوانده و پردازش می‌کنند که این امر موجب سرعت یافتن فرآیند تحلیل داده‌ها می‌شود.

ما کار را از مجموعه‌ی کوچکی از داده‌های هواشناسی به شکل CSV مربوط به شهر سیتکای آلاسکا آغاز می‌کنیم که در منابع کتاب به آدرس https://nostarch.com/pythoncrashcourse2e/ در دسترس است. پوشه‌ای به نام data داخل پوشه‌ی برنامه‌های این فصل بسازید. فایل sitka_weather_07-2018_simple.csv را در این پوشه‌ی جدید کپی کنید. (پس از بارگیری منابع کتاب به تمام فایل‌های مورد نیاز در این فصل دسترسی خواهید داشت.)

نکته
داده‌های هواشناسی این پروژه در اصل از http://ncdc.noaa.gov/cdo-web/ گرفته شده‌اند.

جداسازی عنوان‌های فایل CSV

ماژول csv پایتون کتابخانه‌ای استاندارد برای جداسازی خط‌های فایل130 CSV است که به ما امکان می‌دهد تا مقدارهایی را مد نظر داریم از آن استخراج کنیم. از بررسی اوّلین خط فایل شروع می‌کنیم که شامل دنباله‌ای از عنوان‌ها برای داده‌هاست. این عنوان‌ها به ما می‌گویند که چه اطّلاعاتی در داده‌ها وجود دارد:

1
2
3
4
5
6
7
8
9
import csv

filename = 'data/sitka_weather_07-2018_simple.csv'

with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

print(header_row)

پس از وارد کردن ماژول csv نام فایلی را که روی آن کار می‌کنیم به متغیّر filename نسبت می‌دهیم. سپس فایل را باز کرده و شیء فایل حاصل را در f می‌گذاریم. سپس csv.reader() را فرامی‌خوانیم و شیء فایل را به عنوان نشان‌وند به آن می‌ده131 یم تا برای آن یک شیء خواننده بسازد. این شیء را به reader نسبت می‌دهیم.

ماژول csv تابعی به نام next() دارد که هنگام تعیین شدن شیء خواننده خط بعدی فایل را برمی‌گرداند. در برنامه‌ی قبلی next() را فقط یک بار فراخواندیم تا بتوانیم خط اوّل فایل را که شامل عنوان‌های فایل است استخراج کنیم. داده‌هایی را که برگردانده شده در header_row ذخیره می‌کنیم. چنانکه می‌بینید header_row شامل عنوان‌هایی معنادار و مربوط به هواشناسی است که به ما می‌گوید در هر خط داده چه اطّلاعاتی ذخیره شده است:

1
['STATION', 'NAME', 'DATE', 'PRCP', 'TAVG', 'TMAX', 'TMIN']

شیء reader خط اول مقدارهای جداشده با کاما را در فایل پردازش می‌کند و هر کدام را به عنوان عضو یک لیست ذخیره می‌کند. عنوان STATION بیانگر کد ایستگاه هواشناسی‌ای‌ست که این داده‌ها را ثبت کرده است. موقعیّت این عنوان به ما می‌گوید که اوّلین مقدار هر خط کد ایستگاه هواشناسی خواهد بود. عنوان بعدی NAME است که نام ایستگاه هواشناسی ثبت‌کننده‌ی داده را معلوم می‌کند. باقی عنوان‌ها انواع مختلف اطّلاعاتی که در هر قرائت ذخیره شده نشان می‌دهد. داده‌هایی که فعلاً مورد نظر ماست تاریخ، بیشینه‌ی دما (TMAX) و کمینه‌ی دما (TMIN) است. این مجموعه‌داده ساده‌ای است که تنها شامل داده‌های مربوط به دما و بارندگی است. اگر خودتان داده‌های هواشناسی را بارگیری کنید می‌توانید اندازه‌گیری‌های دیگری همچون سرعت و جهت باد و داده‌های جزئی‌تر بارندگی را نیز داشته باشید.

چاپ کردن عنوان‌ها و موقعیّت آن‌ها

برای درک ساده‌تر عنوان‌های فایل هر کدام را به همراه موقعیّت آن‌ها را در لیست چاپ می‌کنیم:

1
2
3
4
5
6
7
8
--snip--

with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    for index, column_header in enumerate(header_row):
        print(index, column_header)

تابع enumerate شماره و مقدار هر عضو لیستی را که در آن حلقه می‌زنید برمی‌گرداند. (توجّه کنید که خط print(header_row) را حذف کرده‌ایم چون جزئیات بیشتر آن را اینجا می‌بینیم.)

اینجا شاخص هر عنوان را در خروجی می‌بینیم:

1
2
3
4
5
6
7
0 STATION
1 NAME
2 DATE
3 PRCP
4 TAVG
5 TMAX
6 TMIN

چنان‌که می‌بینیم تاریخ‌ها و بیشینه‌ی دمای آن‌ها در ستون‌های ۲ تا ۵ ذخیره شده است. برای بررسی این داده‌ها هر سطر داده‌های sitka_weather_07-2018_simple.csv را پردازش و مقدار شاخص‌های ۲ تا ۵ را استخراج می‌کنیم.

استخراج و خواندن داده‌ها

اکنون که می‌دانیم به کدام ستون‌ها نیاز داریم، بیایید چند داده را بخوانیم. ابتدا بیشینه‌ی دمای هر روز را می‌خوانیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
--snip--

with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    # Get high temperatures from this file.
    highs = []
    for row in reader:
        high = int(row[5])
        highs.append(high)

print(highs)

لیستی خالی به نام highs می‌سازیم و سپس در باقیمانده‌ی سطرهای فایل حلقه می‌زنیم. شیء خواننده از جای قبلی در فایل CSV ادامه می‌دهد و به طور خودکار هر خط را به همراه جایگاه آن برمی‌گرداند. چون قبلاً سطر عنوان را خوانده‌ایم حلقه از دومین خط آغاز می‌شود یعنی جایی که اصل داده‌ها شروع می‌شوند. در هر اجرای حلقه پنجمین داده را از سطر بیرون می‌کشیم که متناظر با عنوان TMAX است و سپس آن را در متغیّر high می‌گذاریم. به کمک تابع int() داده را که به صورت رشته ذخیره شده به شکل عددی تبدیل می‌کنیم تا بتوانیم از آن استفاده کنیم. سپس آن را به لیست highs الحاق می‌کنیم.

در ادامه داده‌هایی را که اکنون در highs ذخیره شده‌اند می‌بینیم:

1
2
[62, 58, 70, 70, 67, 59, 58, 62, 66, 59, 56, 63, 65, 58, 56, 59, 64, 60, 60,
61, 65, 65, 63, 59, 64, 65, 68, 66, 64, 67, 65]

ما بیشینه‌ی دمای هر روز را استخراج و در لیستی ذخیره کرده‌ایم. اکنون بیایید این داده‌ها را بصری کنیم.