سه روش سریع برای مقایسه داده ها با پایتون — راهنمای کاربردی
همه افرادی که در مشاغل مرتبط با تحلیل داده کار میکنند، به طور مکرر درخواستهایی برای مقایسه دادهها دریافت میکنند. این درخواستها میتوانند شامل بررسی یکپارچگی دادهها، تحویل موفق دادهها یا صرفاً تلاش برای درک تفاوت بین دو فایل یا مجموعه داده باشند، اما فرایند کار همواره تقریباً یکسان است. در این نوشته به بررسی سه روش مختلف برای مقایسه داده ها با پایتون میپردازیم.
برخی اوقات که دادهها نسبتاً کوچک هستند، قرار دادن هر مجموعه داده در یک ورکشیت و سپس اجرای مقایسه بین سلولها کفایت میکند.
اگر به چیزی قدرتمندتر نیاز دارید، چند نرمافزار مقایسه داده موجود است که میتوانند این کار را برای شما انجام دهند. یکی از بهترین گزینهها نرمافزار 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])
نتیجه آن چنین است:
بدین ترتیب به پایان این راهنما میرسیم.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون (Python)
- گنجینه آموزشهای برنامهنویسی پایتون (Python)
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- الگوریتمهای مهم پایتون که باید آنها را بدانید — راهنمای کاربردی
==