برنامه نویسی 742 بازدید

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

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

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

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

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

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

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

بررسی با MD5 Checksum

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

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

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

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

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

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

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

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

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

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

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

import sys, sqlite3, pandas as pd
files = [sys.argv[1], sys.argv[2]] #these are the arguments we take
conn = sqlite3.connect(':memory:') #we are spinning an SQL db in memory
cur = conn.cursor()
chunksize = 10000
i=0
for file in files:
    i = i+1
    for chunk in pd.read_csv(file, chunksize=chunksize): #load the file in chunks in case its too big
        chunk.columns = chunk.columns.str.replace(' ', '_') #replacing spaces with underscores for column names
        chunk.to_sql(name='file' + str(i), con=conn, if_exists='append')
print('Comparing', files[0], 'to', files[1]) #Compare if all data from File[0] are present in File[1]
cur.execute( '''SELECT * FROM File1
                EXCEPT
                SELECT * FROM File2''')
i=0
for row in cur:
    print(row)
    i=i+1
if i==0: print('No Differences')
print('Comparing', files[1], 'to', files[0]) #Compare if all data from File[1] are present in File[0]
cur.execute( '''SELECT * FROM File2
                EXCEPT
                SELECT * FROM File1''')
i=0
for row in cur:
    print(row)
    i=i+1
if i==0: print('No Differences')
cur.close()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

==

اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

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

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

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