روش‌های گروه‌بندی داده‌ها در پانداس و SQL

شکل ۱: گروه‌بندی داده‌ها
شکل ۱: گروه‌بندی داده‌ها
منتشر‌شده در: towardsdatascience به تاریخ ۳ اکتبر ۲۰۲۱
لینک منبع Grouping Dates in Pandas and SQL

هنگام کار با یک مجموعه داده، اغلب این مورد وجود دارد که داده‌ها در قالب لازم برای انجام تجزیه و تحلیل مناسب نیستند.

به عنوان مثال، چه می‌شود اگر بخواهیم یک پیش‌بینی سری‌های زمانی را اجرا کنیم، اما نقاط داده زیادی در طول دوره زمانی مشابه وجود داشته باشد؟

در این مثال، ما از مجموعه داده‌های تقاضای رزرو هتل (۲۰۱۹) توسط آنتونیو، آلمیدا و نونس استفاده می‌کنیم تا کشف کنیم که چگونه نقاط داده فردی می‌توانند با استفاده از پانداس پایتون و PostgreSQL در یک سری زمانی گروه‌بندی شوند.

پانداس

در این مجموعه داده خاص، ورودی‌های فردی برای هر مشتری که یک رزرو در یک هتل انجام می‌دهد، با سال و هفته ورود وجود دارد:

شکل ۲: منبع: خروجی نوت بوکJupyter
شکل ۲: منبع: خروجی نوت بوکJupyter

علاوه بر این، هنگامی که به سمت راست پایگاه‌داده حرکت می‌کنیم، می‌بینیم که نرخ متوسط روزانه(ADR) ، یا نرخ متوسط پرداخت‌شده توسط مشتری در هر روز، نیز وجود دارد:

شکل ۳: منبع: خروجی نوت بوکJupyter
شکل ۳: منبع: خروجی نوت بوکJupyter

این سناریو را در نظر بگیرید. فرض کنید می‌خواهیم میانگین ADR را برای همه مشتریان در هر هفته بدست آوریم. چگونه می‌توانیم به این هدف در پانداس دست یابیم؟

اولین کاری که انجام می‌دهیم الحاق مقادیر برای سال و هفته ورود است.

>>> df1 = df['ArrivalDateYear'].map(str) + df['ArrivalDateWeekNumber'].map(str)>>> print (df1)>>> df1=pd.DataFrame(df1)0 201527
1 201527
2 201527
3 201527
4 201527
...
40055 201735
40056 201735
40057 201735
40058 201735
40059 201735
Length: 40060, dtype: object

آرایه مقادیرADR در یک چارچوب داده جداگانه ذخیره شده‌است:

df2 = DataFrame(c, columns= ['ADR'])
df2

شکل ۴: منبع: خروجی نوت بوکJupyter
شکل ۴: منبع: خروجی نوت بوکJupyter

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

df3=pd.concat([df1, df2], axis = 1)
df3
df3.columns = ['FullDate', 'ADR']
df3.sort_values(['FullDate','ADR'], ascending=True)

شکل ۵: منبع: خروجی نوت بوکJupyter
شکل ۵: منبع: خروجی نوت بوکJupyter

حالا، groupby می‌تواند برای محاسبه میانگین در تمام ورودی‌های یکسان برای متغیر FullDate استفاده شود؛ یعنی کسانی که تعداد سال و هفته یکسانی دارند.

df4 = df3.groupby('FullDate').agg("mean")
df4
df4.sort_values(['FullDate'], ascending=True)

شکل ۶: منبع: خروجی نوت بوکJupyter
شکل ۶: منبع: خروجی نوت بوکJupyter

ما اکنون یک سری زمانی هفتگی داریم که می‌توانیم از آن برای اهداف پیش‌بینی استفاده کنیم!

پایگاه داده PostgreSQL

حالا، فرض کنید که ما می‌خواهیم همان کار را با استفاده از PostgreSQL انجام دهیم. چطور می‌توانیم این کار را انجام دهیم؟

برای این منظور، ما ابتدا یک جدول در PostgreSQL ایجاد می‌کنیم و سپس متغیرهای مربوطه را از یک فایل CSV وارد می‌کنیم (تنها متغیرهای مربوطه در خود CSV نگه‌داشته شده‌اند).

توجه داشته باشید که در کد زیر، ADR در اصل به عنوان یک نوع داده دهدهی (۴، ۲) مشخص شده‌است. با این حال، مشخص شد که مقادیر خاص به ذخیره‌سازی بیشتری نسبت به دهدهی نیاز دارند (۴، ۲).

بنابراین از جدولALTER به صورت زیر برای تغییر نوع داده‌ها به اعشار استفاده شد (۶، ۲).

hotel=# create table h1 (
hotel(# IsCanceled int,
hotel(# ArrivalDateYear int,
hotel(# ArrivalDateMonth varchar(10),
hotel(# ArrivalDateWeekNumber int,
hotel(# ADR decimal(4,2));
CREATE TABLEhotel=# alter table h1 alter column ADR type decimal(6,2);
ALTER TABLE
hotel=# copy h1 (IsCanceled, ArrivalDateYear, ArrivalDateMonth, ArrivalDateWeekNumber, ADR)
hotel-# from 'H1.csv'
hotel-# DELIMITER ','
hotel-# CSV HEADER;
COPY 40060

برخلاف پایتون، نیازی به الحاق شماره سال و هفته نیست. در عوض، ما به سادگی می‌توانیم بر اساس سال گروه‌بندی کنیم و بر اساس شماره هفته مانند زیر ترتیب‌بندی کنیم:

select arrivaldateweeknumber, avg(adr) from h1 where arrivaldateyear='2015' group by arrivaldateweeknumber order by arrivaldateweeknumber limit 5;

شکل ۷: منبع: خروجیPostgreSQL
شکل ۷: منبع: خروجیPostgreSQL

فرض کنید ما در حال حاضر می‌خواهیم تمام هفته‌های ۲۰۱۶ را گروه‌بندی کنیم. ما می‌توانیم این کار را به شرح زیر انجام دهیم:

select arrivaldateweeknumber, avg(adr) from h1 where arrivaldateyear='2016' group by arrivaldateweeknumber order by arrivaldateweeknumber limit 5;

شکل ۸: منبع: خروجی PostgreSQL
شکل ۸: منبع: خروجی PostgreSQL

حالا، ما سری‌های زمانی را در SQL به همان روشی که درpandas انجام دادیم، شکل داده‌ایم. در یک سناریوی دنیای واقعی، می‌توان با استفاده از pandas، داده‌ها را دستکاری کرد. با این حال، اگر وارد کردن از یک پایگاه‌داده SQL انجام شود-این کار نیاز به استخراج بیش از حد داده‌ها از جدول دارد.

بر اساس این سناریو، قالب بندی داده‌های اصلی را می‌توان به سادگی با استفاده از SQL انجام داد و سپس با استفاده از کتابخانه‌ای مانند SQLAlchemy برای تجزیه و تحلیل بیشتر در پایتون وارد کرد.

نتیجه‌گیری

در این مقاله، شما دیدید:

  • نحوه همبستگی با استفاده از پانداس
  • چگونه یک مجموعه داده CSV را به PostgreSQL وارد کنیم
  • استفاده از GROUP BY و ORDER BY در PostgreSQL برای تشکیل یک سری زمانی

با تشکر فراوان از وقت شما که برای خواندن این مقاله گذاشتید.

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