ساسی مانکن یا عزیز ویسی؟! کدوم رقصی تره؟ با پایتون

(مطلبی که پیش روست بیشتر جنبه یادگیری چگونگی استفاده از پایتون و کتابخانه های آن را به شیوه طنز دارد و یک تحلیل واقعی نیست)زبان پایتون یک زبان فوق العاده برای انجام بازه بسیار گسترده ای از کارهایی است که تقریبا در هر زبان دیگری فقط بخشی از آن را می توانید انجام دهید. اینجا با کتابخانه ای آشنا می شویم که از اسپاتیفای استفاده میکند. اگر هیچ اطلاعاتی از شروع کار با پایتون ندارید این مطلب قبلی ام را بخوانید.اسپاتیفای یکی از بزرگترین سایت های موسیقی است که می توانید در آن موسیقی های مختلف از سراسر دنیا را جستجو کنید و بشنوید. اما بخش جالب تر این سایت بخشی است که برای توسعه دهندگان برنامه ها قرار داده شده است. اسپاتیفای بخش بسیار زیادی از اطلاعات خوانندگان، موسیقی ها و آلبوم ها و غیره و غیره را از طریق API خود در اختیار توسعه دهندگان قرار می دهد. با این ویژگی ها می توان برنامه های بسیار جالبی برای اندروید، آی او اس یا هر اپلیکیشن وبی و غیر وبی دیگر نوشت. لیستی از این برنامه های جالب را می توانید اینجا ببینید. یک کتابخانه برای زبان پایتون به اسم spotipy وجود دارد که دسترسی و استفاده از اطلاعات اسپاتیفای را راحت می کند. در مرحله اول باید یک اکانت بر روی اسپاتیفای بسازید و سپس به بخش توسعه دهندگان بروید. از آنجا به Console رفته و سپس یک app جدید بسازید. مثلا من یکی به اسم tutorial ساخته ام.پسس بر روی app کلیک کنید و دو رشته می بینید. من در اینجا آن را مخفی کرده ام چون این دو رشته شخصی است. این دو رشته برای فرآیند اعتبار سنجی و اتصال به سرور اسپاتیفای لازم هستند.مرحله بعدی این است که spotipy را نصب کنیم. مثل هر کتابخانه دیگر پایتون کافی است که ترمینال را باز کنیم و سپس از pip استفاده کنیم. اگر از پای چارم استفاده میکنید. می توانید ترمینال داخل خود آن را باز کنید و سپس دستور زیر را بزنید.(شما همچنین نیاز به نصب matplotlib برای رسم نمودار ها دارید)pip install spotipy pip install matplotlibپس از نصب نیاز داریم تا چک کنیم آیا نصب درست انجام شده است یا خیر. برای این منظور کافی است اعتبار سنجی با استفاده از Client ID و Client Secret که در کنسول سایت اسپاتیفای هست(بالا) را انجام دهیم.import spotipy from spotipy.oauth2 import SpotifyClientCredentials client_id = YOUR_CLIENT_ID client_secret = YOUR_CLIENT_SECRET client_credentials_manager = SpotifyClientCredentials(client_id, client_secret) token = client_credentials_manager.get_access_token() sp = spotipy.Spotify(auth=token)دقت کنید که دو متغیر client_id و client_secret مقادیر متناظر که برای شما یکتا است میگیرند. اگر همه چیز درست باشد بعد از اجرا فقط خروجی زیر را میبینید که نشان دهند این است که همه چیز درست است.Process finished with exit code 0حالا می توانیم یک کار جالب تر انجام دهیم. می توانیم 20 ترک از آهنگ های ساسی مانکن را خروجی بدهیم. برای این منظور از شی sp که در بالا درست کرده ایم استفاده می کنیم و اسم را جستجو می کنیم. چیزی که در result است یک دیکشنری است که حاوی اطلاعات زیادی از خواننده است. ما در آن به دنبال tracks و در آن هم به دنبال items هستیم.results = sp.search(q='sasy', limit=20) for t in results['tracks']['items']: print(t['name'])خروجی به صورت زیر خواهد بود:اسپاتیپای اطلاعات بسیار زیادی در مورد خواننده ها. محبوبیت آن ها آهنگ هایشان و اطلاعات جزیی تر در مورد آلبوم ها و غیره می دهد. در ادامه سعی میکنم پنجاه ترک از هر دو خواننده را بر اساس زمان انتشار هر ترک استخراج کنم ویژگی dancability "رقص پذیری"(!) برای هر ترک را استخراج کنم. مقادیر "رقص پذیری" را جمع کنم و خروجی بدهم "رقص پذیری" ها را بر اساس زمان مرتب کنم و تغییرات رقص پذیری هر خواننده را در طول زمان نشان دهم. در اینجا می خواهم پنجاه آهنگ از عزیز ویسی و ساسی مانکن را انتخاب کرده و سپس یک دیکشنری درست کنم که در آن کلید هر عنصر در دیکشنری id هر آهنگ و مقدار آن تاریخ انتشار آن است. در این صورت چیزی شبیه به زیر باید داشته باشم:برای رسیدن به چنین چیزی باید کد زیر را بنویسیم.from datetime import datetime sasy_results = sp.search(q='sasy', limit=50) sasy_infos = {} for result in sasy_results["tracks"]["items"]: if "album" in result: try: release_date = datetime.strptime(result["album"]["release_date"], '%Y-%m-%d') except: continue track_id = result["id"] sasy_infos[track_id] = release_dateدقت کنید که من تاریخ انتشار آلبوم را برای هر ترک در نظر گرفته ام. همچنین از شی datetime برای تاریخ استفاده کرده ام. چیزی که خود اسپاتیفای به من می دهد یک رشته است. مثلا 2019-06-04 که من آن را با استفاده از تابع strptime به شی datetime تبدیل می کنم. دلیل این کار این است که این کار به من اجازه می دهد بعدا ترک ها را بر اساس زمان مرتب کنم. در غیر این صورت کار به صورت دستی بسیار دشوار خواهد بود. کار بالا را برای عزیز ویسی هم می کنم.aziz_results = sp.search(q='aziz weysi', limit=50) aziz_infos = {} for result in aziz_results["tracks"]["items"]: if "album" in result: try: release_date = datetime.strptime(result["album"]["release_date"], '%Y-%m-%d') except: continue track_id = result["id"] aziz_infos[track_id] = release_dateدقت کنید که من سعی میکنم برای تمام متغیر هایم اسم های معنی دار بگذارم. حالا می توانم از تابع audio_features استفاده کنم و با دادن id هر ترک اطلاعات مختلف آن را بگیرم. دقت کنید که کلید ها(keys) که حاوی id هاست را پاس می دهم.sasy_track_features = sp.audio_features(sasy_infos.keys()) aziz_track_features = sp.audio_features(aziz_infos.keys())حالا می توانم فقط میزان رقص پذیری ها را فیلتر کنم:sasy_danceabilities = {feature["id"]: feature["danceability"] for feature in sasy_track_features} aziz_danceabilities = {feature["id"]: feature["danceability"] for feature in aziz_track_features} در نهایت می توانیم این مقادیر را با هم جمع کنم:print("sasy danceability total: ", sum(sasy_danceabilities.values())) print("aziz weisi danceability total: ", sum(aziz_danceabilities.values()))که نتیجه می شود:sasy danceability total: 34.16299999999999aziz weisi danceability total: 35.592999999999996نتیجه قاطع نشان می دهد آهنگ های عزیز ویسی در مجموع رقصی تر از ساسی مانکن هستند! :Dحالا می توانیم رقص پذیری را بر اساس زمان مرتب کنیم. دقت کنید که الان دو دیکشنری داریم. هر دو دیکشنری دارای کلید های id ترک ها هستند ولی اولی زمان ها را به عنوان مقدار دارد و دومی رقص پذیری را. باید این دو را در یک لیست جدید که حاوی زمان به عنوان عتصر اول و رقص پذیری به عنوان عتصر دوم از هر تاپل هست قرار دهیم.sasy_danceabilities_by_date = [] for track_id in sasy_infos.keys(): date = sasy_infos[track_id] danceability = sasy_danceabilities[track_id] sasy_danceabilities_by_date.append((date, danceability)) aziz_danceabilities_by_date = [] for track_id in aziz_infos.keys(): date = aziz_infos[track_id] danceability = aziz_danceabilities[track_id] aziz_danceabilities_by_date.append((date, danceability))خروجی به صورت زیر خواهد بود:حالا می توانیم دو لیست خروجی را بر اساس زمان مرتب کنیم. این کار بسیار ساده است:sasy_danceabilities_by_date.sort(key=lambda r: r[0]) aziz_danceabilities_by_date.sort(key=lambda r: r[0])دقت کنید که کلید sort یک تابع lambda است و r هر تاپل است. پس r[0] به معنای اولین عنصر تاپل یعنی زمان است. این مرتب سازی درجا هست. یعنی لازم نیست که خروجی تابع را بگیریم. در نهایت مقادیر را بر اساس زمان رسم می کنیم. import matplotlib.pyplot as plt sasy_dates = [item[0] for item in sasy_danceabilities_by_date] sasy_danceabilities = [item[1] for item in sasy_danceabilities_by_date] plt.plot(sasy_dates, sasy_danceabilities) plt.title("Sasy Mankan") plt.xlabel("Time") plt.ylabel("Danceability") plt.show() aziz_dates = [item[0] for item in aziz_danceabilities_by_date] aziz_danceabilities = [item[1] for item in aziz_danceabilities_by_date] plt.plot(aziz_dates, aziz_danceabilities) plt.title("Aziz Weisi") plt.xlabel("Time") plt.ylabel("Danceability") plt.show()که خروجی به صورت زیر خواهد بود:دقت کنید که این نمودار ها دارای پرش هایی هستند. دلیل آن هم واضح هست. خیلی از ترک ها فقط بر اساس تاریخ انتشار آلبوم در نظر گرفته شده اند بنابراین تعداد زیادی از نقاط دارای یک تاریخ می شوند.کسانی که بیشتر با پایتون آشنا هستند حتما می دانند که نحوه کد زنی بالا بهینه ترین یا حرفه ای ترین روش ممکن نیست. شما بهتر است از کتابخانه هایی مانند panda استفاده کنیم. و حتی کلاس ها و اسکریپت های جدا داشته باشید. اما اینجا بیشتر به جنبه یادگیری و استفاده از کتابخانه و دیکشنری و لیست و تاپل ها پرداختیم.تمامی کد بالا در گیت هاب من قرار دارد و می توانید آن را دانلود کرده و استفاده کنید.