سه روش سریع برای مقایسه داده ها با پایتون — راهنمای کاربردی

۴۵۰ بازدید
آخرین به‌روزرسانی: ۳۰ آبان ۱۴۰۲
زمان مطالعه: ۳ دقیقه
سه روش سریع برای مقایسه داده ها با پایتون — راهنمای کاربردی

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

برخی اوقات که داده‌ها نسبتاً کوچک هستند، قرار دادن هر مجموعه داده در یک ورک‌شیت و سپس اجرای مقایسه بین سلول‌ها کفایت می‌کند.

مقایسه داده ها با پایتون

اگر به چیزی قدرتمندتر نیاز دارید، چند نرم‌افزار مقایسه داده موجود است که می‌توانند این کار را برای شما انجام دهند. یکی از بهترین گزینه‌ها نرم‌افزار Beyond Compare است.

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

بررسی یکپارچگی داده‌ها

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

بررسی با MD5 Checksum

الگوریتم MD5 Checksum اساساً الگوریتمی است که یک عدد هگزادسیمال برای محتوای یک فایل بازگشت می‌دهد. با استفاده از کد زیر می‌توانیم از آن بهره بگیریم:

1import hashlib, sys
2files = [sys.argv[1], sys.argv[2]] #these are the arguments we take
3def md5(fname):
4    md5hash = hashlib.md5()
5    with open(fname) as handle: #opening the file one line at a time for memory considerations
6        for line in handle:
7            md5hash.update(line.encode('utf-8'))
8    return(md5hash.hexdigest())
9print('Comparing Files:',files[0],'and',files[1])
10if md5(files[0]) == md5(files[1]):
11    print('Matched')
12else:
13    print('Not Matched')

نتیجه اجرای کد فوق چنین است:

مقایسه داده ها با پایتون

بررسی با الگوریتم SHA1

الگوریتم SHA1 یک الگوریتم هگزادسیمال دیگر است که محتوای فایل ما را به یک رشته تبدیل می‌کند. این همان الگوریتمی است که بیت‌کوین برای فرایند ماین کردن بلاک چین استفاده می‌کند.

از کد زیر استفاده می‌کنیم:

1import hashlib, sys
2files = [sys.argv[1], sys.argv[2]] #these are the arguments we take
3def sha1(fname):
4    sha1hash = hashlib.sha1()
5    with open(fname) as handle: #opening the file one line at a time for memory considerations
6        for line in handle:
7            sha1hash.update(line.encode('utf-8'))
8    return(sha1hash.hexdigest())
9print('Comparing Files:',files[0],'and',files[1])
10if sha1(files[0]) == sha1(files[1]):
11    print('Matched')
12else:
13    print('Not Matched')

نتیجه به صورت زیر خواهد بود:

مقایسه داده ها با پایتون

بررسی محتوای داده‌ها با SQL

خوشبختانه با استفاده از چند کتابخانه پایتون می‌توانیم فایل‌های خود را وارد یک پایگاه داده SQL بکنیم و از عملگر Except برای هایلایت کردن تفاوت‌ها بهره بگیریم. تنها نکته‌ای که باید توجه داشت این است که Except نیاز دارد که داده‌ها مرتب باشند، چون در غیر این صورت همه چیز را به عنوان تفاوت هایلایت می‌کند. برای استفاده سریع از این روش از کد زیر بهره بگیرید:

1import sys, sqlite3, pandas as pd
2files = [sys.argv[1], sys.argv[2]] #these are the arguments we take
3conn = sqlite3.connect(':memory:') #we are spinning an SQL db in memory
4cur = conn.cursor()
5chunksize = 10000
6i=0
7for file in files:
8    i = i+1
9    for chunk in pd.read_csv(file, chunksize=chunksize): #load the file in chunks in case its too big
10        chunk.columns = chunk.columns.str.replace(' ', '_') #replacing spaces with underscores for column names
11        chunk.to_sql(name='file' + str(i), con=conn, if_exists='append')
12print('Comparing', files[0], 'to', files[1]) #Compare if all data from File[0] are present in File[1]
13cur.execute( '''SELECT * FROM File1
14                EXCEPT
15                SELECT * FROM File2''')
16i=0
17for row in cur:
18    print(row)
19    i=i+1
20if i==0: print('No Differences')
21print('Comparing', files[1], 'to', files[0]) #Compare if all data from File[1] are present in File[0]
22cur.execute( '''SELECT * FROM File2
23                EXCEPT
24                SELECT * FROM File1''')
25i=0
26for row in cur:
27    print(row)
28    i=i+1
29if i==0: print('No Differences')
30cur.close()

نتیجه اجرای کد فوق به صورت زیر است:

مقایسه داده ها با پایتون
برای نمایش تصویر در اندازه اصلی روی آن کلیک کنید.

بررسی داده‌ها با استفاده از Pandas

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

استفاده از پارامتر ()equals.

با به‌کارگیری همان تنظیمات مثال‌های قبلی از کد زیر استفاده کنید:

1import sys, sqlite3, pandas as pd
2files = [sys.argv[1], sys.argv[2]] #these are the arguments we take
3df1 = pd.read_csv(files[0])
4df2 = pd.read_csv(files[1])
5df3 = df1.equals(df2)
6print('Matches:', df3)

خروجی به صورت زیر است:

مقایسه داده ها با پایتون

استفاده از پارامتر ()any.

این کار را می‌توانیم به صورت زیر به سرعت اجرا کنیم:

1import sys, sqlite3, pandas as pd
2files = [sys.argv[1], sys.argv[2]] #these are the arguments we take
3df1 = pd.read_csv(files[0])
4df2 = pd.read_csv(files[1])
5df3 = (df1 != df2).any(axis=None)
6print('Differences in file:', df3)
7df3 = (df1 != df2).any(1)
8ne_stacked = (df1 != df2).stack()
9changed = ne_stacked[ne_stacked]
10changed.index.names = ['id', 'col']
11print('Differences In:')
12print(changed)

خروجی به صورت زیر است:

مقایسه داده ها با پایتون

استفاده از پارامتر ()Eq.

اسکریپت زیر را اجرا کنید:

1import sys, sqlite3, pandas as pd, numpy as np
2files = [sys.argv[1], sys.argv[2]] #these are the arguments we take
3df1 = pd.read_csv(files[0])
4df2 = pd.read_csv(files[1])
5df3 = df1.eq(df2)
6print(df3.all())
7#print(df3.all(axis=1))
8df4 = df3.all(axis=1)
9df4 = pd.DataFrame(df4, columns=['Columns'])
10print(df4[df4['Columns']==False])

نتیجه آن چنین است:

مقایسه داده ها با پایتون

بدین ترتیب به پایان این راهنما می‌رسیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
financeexplained
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *