كيفية تحليل سوق استوديو الصور باستخدام Python (2/3). قاعدة البيانات

في مقال سابق ، كجزء من مشروع تجاري لتحليل سوق استوديو الصور ، فكرت في إنشاء التحليل: تفريغ قائمة من استوديوهات الصور ، قائمة القاعات ، بيانات الحجز من لحظة فتح القاعة حتى آخر حجز.



من غير العملي تخزين المعلومات التي تم الحصول عليها في ذاكرة التخزين المؤقت ؛ من الضروري استخدام قاعدة بيانات.



في المقال سوف أعتبر:



  • إنشاء قاعدة بيانات SQLite بسيطة ؛
  • كتابة المعلومات باستخدام بايثون ؛
  • قراءة البيانات والتحويل إلى تنسيق DataFrame ؛
  • تحليل التحديث على أساس بيانات قاعدة البيانات.






متطلبات قاعدة البيانات



الشرط الرئيسي لقاعدة بيانات المشروع هو تخزين البيانات والقدرة على استرجاعها بسرعة.



قاعدة البيانات الخاصة بنا غير مطلوبة:



  • تحديد الوصول إلى المخططات ، منذ ذلك الحين سيتمكن المستخدم فقط من الوصول عن طريق التحليل ؛
  • استمر في الوصول 24/7 ، لأن استخراج البيانات مقبول حسب الحاجة للتحليل ؛
  • إنشاء الإجراءات ، منذ ذلك الحين سيتم إجراء جميع الحسابات في بيثون.


لذلك ، من الممكن أن يستخدم المشروع قاعدة بيانات بسيطة في SQLite. يمكنك تخزينه كملف إما على محرك الأقراص الثابتة أو على محرك أقراص فلاش USB أو على محرك سحابي للوصول إليه من الأجهزة الأخرى.



ميزات العمل مع سكليتي من خلال بيثون



للعمل مع SQLite من خلال Python ، نستخدم مكتبة sqlite3 .



نقوم بالاتصال بقاعدة البيانات بأمر بسيط:



sqlite3.connect(  )


إذا كان الملف مفقودًا ، فسيتم إنشاء قاعدة بيانات جديدة.



يتم تنفيذ استعلامات قاعدة البيانات على النحو التالي:



conn = sqlite3.connect(  )
cur = conn.cursor()
cur.execute()
df = cur.fetchall()


cur.fetchall () يتم تنفيذه عندما ، كنتيجة لطلب ، نريد الحصول على بيانات من قاعدة البيانات.



في نهاية كتابة البيانات إلى قاعدة البيانات ، لا تنس إنهاء المعاملة:



conn.commit()


وفي نهاية العمل بقاعدة البيانات ، لا تنسى إغلاقها:




conn.close()


خلاف ذلك ، سيتم قفل القاعدة للكتابة أو الفتح.



إنشاء الجداول هو المعيار:



CREATE TABLE t1 (1 , 2 ...)


أو خيارًا أكثر تنوعًا يقوم بإنشاء جدول إذا كان مفقودًا:



CREATE TABLE IF NOT EXISTS t1 (1 , 2 ...)


نكتب البيانات إلى الجدول ، ونتجنب التكرار:



INSERT OR IGNORE INTO t1 (1, 2, ...) VALUES(1, 2, ...)


تحديث البيانات:



UPDATE t1 SET 1 = 1 WHERE 2 = 2


لمزيد من العمل المريح مع SQLite ، يمكنك استخدام SQLite Manager أو DB Browser لـ SQLite .



البرنامج الأول هو امتداد متصفح ويبدو كبديل لسطر طلب وكتلة استجابة:







البرنامج الثاني هو تطبيق سطح مكتب كامل:











هيكل قاعدة البيانات



تتكون قاعدة البيانات من 4 طاولات: استوديوهات ، قاعات ، طاولتان للحجز.



تحتوي بيانات الحجز التي تم تحميلها على معلومات حول الفترات المستقبلية ، والتي قد تتغير مع التحليل الجديد. من غير المرغوب فيه الكتابة فوق البيانات (يمكن استخدامها ، على سبيل المثال ، لحساب اليوم / الساعة التي تم فيها الحجز). لذلك ، هناك حاجة إلى جدول حجز واحد لبيانات التحليل الخام ، والثاني لأحدث البيانات ذات الصلة.



نقوم بإنشاء الجداول:

def create_tables(conn, table = 'all'):
    cur = conn.cursor()
    
    if (table == 'all') or (table == 'uStudios'):
        cur.execute('''
            CREATE TABLE IF NOT EXISTS uStudios
            (studio_id INT PRIMARY KEY UNIQUE,
            name TEXT UNIQUE,
            metro TEXT,
            address TEXT,
            phone TEXT,
            email TEXT,
            established_date DATE)
            ''')
        print('Table uStudios is created.')

    if (table == 'all') or (table == 'uHalls'):
        cur.execute('''
            CREATE TABLE IF NOT EXISTS uHalls
            (hall_id INT PRIMARY KEY UNIQUE,
            studio_id INT,
            name TEXT,
            is_hall INT,
            square FLOAT,
            ceiling FLOAT,
            open_date DATE)
            ''')
        print('Table uHalls is created.')

    if (table == 'all') or (table == 'uBooking_parsing'):
        cur.execute('''
            CREATE TABLE IF NOT EXISTS uBooking_parsing
            (hall_id INT,
            date DATE,
            hour INT,
            is_working_hour INT,
            min_hours INT,
            price INTEGER,
            is_booked INT,
            duration INT,
            parsing_date DATE)
            ''')
        print ('Table uBooking_parsing is created.')

    if (table == 'all') or (table == 'uBooking'):
        cur.execute('''
            CREATE TABLE IF NOT EXISTS uBooking
            (hall_id INT,
            date DATE,
            hour INT,
            is_working_hour INT,
            min_hours INT,
            price INTEGER,
            is_booked INT,
            duration INT,
            parsing_date DATE)
            ''')
        print ('Table uBooking is created.')




تحدد معلمة الجدول اسم الجدول الذي سيتم إنشاؤه. يخلق كل شيء بشكل افتراضي.



في حقول الجداول ، يمكنك مشاهدة البيانات التي لم يتم تحليلها (تاريخ افتتاح الاستوديو ، تاريخ افتتاح القاعة). سأصف حساب هذه الحقول لاحقًا.



التفاعل مع قاعدة البيانات



لنقم بإنشاء 6 إجراءات للتفاعل مع قاعدة البيانات:



  1. كتابة قائمة باستوديوهات الصور في قاعدة البيانات ؛
  2. تحميل قائمة استوديوهات الصور من قاعدة البيانات ؛
  3. تسجيل قائمة القاعات.
  4. تفريغ قائمة القاعات.
  5. تحميل بيانات الحجز ؛
  6. تسجيل بيانات الحجز.


1. كتابة قائمة استوديوهات الصور لقاعدة البيانات



عند مدخل الإجراء ، نقوم بتمرير المعلمات للاتصال بقاعدة البيانات والجدول في شكل DataFrame. نكتب البيانات سطرًا بسطر ، ونكررها عبر جميع الأسطر في حلقة. من الخصائص المفيدة لبيانات السلسلة في Python لهذه العملية هي "؟" عناصر المجموعة المحددة بعد.



يكون إجراء تسجيل قائمة استوديوهات الصور كما يلي:
def studios_to_db(conn, studio_list): 
    cur = conn.cursor()
    for i in studio_list.index:
        cur.execute('INSERT OR IGNORE INTO uStudios (studio_id, name, metro, address, phone, email) VALUES(?, ?, ?, ?, ?, ?)',
                   (i,
                   studio_list.loc[i, 'name'],
                   studio_list.loc[i, 'metro'],
                   studio_list.loc[i, 'address'],
                   studio_list.loc[i, 'phone'],
                   studio_list.loc[i, 'email']))




2. تحميل قائمة استوديوهات الصور من قاعدة البيانات



نقوم بتمرير معلمات اتصال قاعدة البيانات إلى الإدخال في الإجراء. نقوم بتنفيذ استعلام التحديد ، ونعترض البيانات غير المحملة ونكتبها إلى DataFrame. نترجم تاريخ تأسيس استوديو الصور بتنسيق التاريخ.



الإجراء بأكمله كما يلي:
def db_to_studios(conn):
    cur = conn.cursor()
    cur.execute('SELECT * FROM uStudios')
    studios = pd.DataFrame(cur.fetchall()
                           , columns=['studio_id', 'name', 'metro', 'address', 'phone', 'email', 'established_date']
                          ).set_index('studio_id')
    studios['established_date'] = pd.to_datetime(studios['established_date'])
    return studios




3. كتابة قائمة القاعات لقاعدة البيانات



الإجراء مشابه لتسجيل قائمة استوديوهات التصوير الفوتوغرافي: نقوم بنقل معلمات الاتصال وجدول القاعات ، وكتابة البيانات سطرًا بسطر إلى قاعدة البيانات.



إجراء تسجيل قائمة القاعات في قاعدة البيانات
def halls_to_db(conn, halls): 
    cur = conn.cursor()
    for i in halls.index:
        cur.execute('INSERT OR IGNORE INTO uHalls (hall_id, studio_id, name, is_hall, square, ceiling) VALUES(?, ?, ?, ?, ?, ?)',
                   (i,
                   halls.loc[i, 'studio_id'],
                   halls.loc[i, 'name'],
                   halls.loc[i, 'is_hall'],
                   halls.loc[i, 'square'],
                   halls.loc[i, 'ceiling']))




4. تفريغ قائمة القاعات من قاعدة البيانات



الإجراء مشابه لتفريغ قائمة استوديوهات الصور: نقل معلمات الاتصال ، تحديد الطلب ، الاعتراض ، الكتابة إلى DataFrame ، تحويل تاريخ افتتاح القاعة إلى تنسيق التاريخ.

الاختلاف الوحيد: تمت كتابة معرف الاستوديو وعلامة القاعة في شكل بايت. نعيد القيمة بواسطة الوظيفة:



int.from_bytes(, 'little')


تكون إجراءات تفريغ قائمة القاعات كما يلي:
def db_to_halls(conn):
    cur = conn.cursor()
    cur.execute('SELECT * FROM uHalls')
    halls = pd.DataFrame(cur.fetchall(), columns=['hall_id', 'studio_id', 'name', 'is_hall', 'square', 'ceiling', 'open_date']).set_index('hall_id')
    for i in halls.index:
        halls.loc[i, 'studio_id'] = int.from_bytes(halls.loc[i, 'studio_id'], 'little')
        halls.loc[i, 'is_hall'] = int.from_bytes(halls.loc[i, 'is_hall'], 'little')
    halls['open_date'] = pd.to_datetime(halls['open_date'])
    return halls




5. تحميل معلومات الحجز من قاعدة البيانات



نقوم بتمرير معلمات اتصال قاعدة البيانات ومعلمة التحليل إلى الإجراء ، مع توضيح جدول الحجز الذي نطلب المعلومات منه: 0 - من الفعلي (افتراضيًا) ، 1 - من جدول التحليل. بعد ذلك ، ننفذ طلبًا محددًا ونعترضه وننقله إلى DataFrame. يتم تحويل التواريخ إلى تنسيق التاريخ ، والأرقام من تنسيق البايت إلى تنسيق الأرقام.



إجراء تحميل معلومات الحجز:
def db_to_booking(conn, parsing = 0):
    cur = conn.cursor()
    if parsing == 1:
        cur.execute('SELECT * FROM uBooking_parsing')
    else:
        cur.execute('SELECT * FROM uBooking')
    booking = pd.DataFrame(cur.fetchall(), columns=['hall_id', 
                                                     'date', 'hour', 
                                                     'is_working_hour', 
                                                     'min_hours', 
                                                     'price', 
                                                     'is_booked', 
                                                     'duration', 
                                                     'parsing_date'])
    booking['hall_id'] = [int.from_bytes(x, 'little') if not isinstance(x, int) else x for x in booking['hall_id']]
    booking['is_booked'] = [int.from_bytes(x, 'little') if not isinstance(x, int) else x for x in booking['is_booked']]
    booking['date'] = pd.DataFrame(booking['date'])
    booking['parsing_date'] = pd.DataFrame(booking['parsing_date'])
    
    return booking




6. كتابة معلومات الحجز في قاعدة البيانات



الوظيفة الأكثر تعقيدًا للتفاعل مع قاعدة البيانات ، منذ ذلك الحين يبدأ في تحليل بيانات الحجز. عند المدخل ، نمرر إلى الإجراء معلمات الاتصال بقاعدة البيانات وقائمة معرفات الغرف التي يجب تحديثها.



لتحديد آخر تاريخ للبيانات المحدثة ،



طلب من قاعدة البيانات تاريخ التحليل الأخير لكل معرف قاعة:
parsing_date = db_to_booking(conn, parsing = 1).groupby('hall_id').agg(np.max)['parsing_date']




نحن نكرر كل معرف قاعة باستخدام حلقة.



في كل معرف قاعة ، أول شيء نفعله هو التعريف



عدد الأسابيع المطلوب تحليلها في الماضي:
        try:
            last_day_str = parsing_date[id]
            last_day = datetime.datetime.strptime(last_day_str, '%Y-%m-%d')
            delta_days = (datetime.datetime.now() - last_day).days
            weeks_ago = delta_days // 7
        except:
            last_day_str = '2010-01-01'
            last_day = datetime.datetime.strptime(last_day_str, '%Y-%m-%d')
            weeks_ago = 500




إذا كان معرف القاعة موجودًا في قاعدة البيانات ، فسنحسب. إذا لم يكن الأمر كذلك ، فسنحلل 500 أسبوع في الماضي أو نتوقف عند عدم وجود حجز لمدة شهرين (تم توضيح القيد في المقالة السابقة ).



ثم نقوم بإجراءات الإعراب:
        d = get_past_booking(id, weeks_ago = weeks_ago)        
        d.update(get_future_booking(id))
        book = hall_booking(d)




أولاً ، نقوم بتحليل معلومات الحجز من الماضي إلى البيانات الفعلية ، ثم من المستقبل (حتى شهرين ، عندما لا توجد سجلات) وفي النهاية نقوم بنقل البيانات من تنسيق json إلى DataFrame.



في المرحلة النهائية ، نكتب البيانات الخاصة بحجز القاعة في قاعدة البيانات ونغلق المعاملة.



إجراءات تسجيل معلومات الحجز في قاعدة البيانات هي كما يلي:
def booking_to_db(conn, halls_id):
    cur = conn.cursor()
    cur_date = pd.Timestamp(datetime.date.today())
    parsing_date = db_to_booking(conn, parsing = 1).groupby('hall_id').agg(np.max)['parsing_date']
    
    for id in halls_id:
        
        #download last parsing_date from DataBase
        try:
            last_day_str = parsing_date[id]
            last_day = datetime.datetime.strptime(last_day_str, '%Y-%m-%d')
            delta_days = (datetime.datetime.now() - last_day).days
            weeks_ago = delta_days // 7
        except:
            last_day_str = '2010-01-01'
            last_day = datetime.datetime.strptime(last_day_str, '%Y-%m-%d')
            weeks_ago = 500
        
        d = get_past_booking(id, weeks_ago = weeks_ago)        
        d.update(get_future_booking(id))
        book = hall_booking(d)
        for i in list(range(len(book))):#book.index:
            cur.execute('INSERT OR IGNORE INTO uBooking_parsing (hall_id, date, hour, is_working_hour, min_hours, price, is_booked, duration, parsing_date) VALUES(?,?,?,?,?,?,?,?,?)',
                       (book.iloc[i]['hall_id'],
                       book.iloc[i]['date'].date().isoformat(),
                       book.iloc[i]['hour'],
                       book.iloc[i]['is_working_hour'],
                       book.iloc[i]['min_hours'],
                       book.iloc[i]['price'],
                       book.iloc[i]['is_booked'],
                       book.iloc[i]['duration'],
                       cur_date.date().isoformat()))
        conn.commit()
        print('hall_id ' + str(id) + ' added. ' + str(list(halls_id).index(id) + 1) + ' from ' + str(len(halls_id)))




- تحديث أيام افتتاح الاستوديو والصالات



تاريخ افتتاح الصالة هو أقرب تاريخ لحجز الصالة.



تاريخ افتتاح الاستوديو هو أقرب موعد لافتتاح صالة الاستوديو.



بناءً على هذا المنطق ،



نقوم بتفريغ مواعيد الحجز الأولى لكل غرفة من قاعدة البيانات
halls = db_to_booking(conn).groupby('hall_id').agg(min)['date']




ثم نقوم بتحديث البيانات الافتتاحية سطرًا بسطر:
    for i in list(range(len(halls))):
        cur.execute('''UPDATE uHalls SET open_date = '{1}' WHERE hall_id = {0}'''
                    .format(halls.index[i], str(halls.iloc[i])))




نقوم بتحديث بيانات افتتاح استوديو الصور بنفس الطريقة: نقوم بتنزيل البيانات الخاصة بمواعيد افتتاح القاعات من قاعدة البيانات ، ونحسب أصغر تاريخ لكل استوديو ، ونعيد كتابة تاريخ افتتاح استوديو الصور.



إجراءات تحديث مواعيد الافتتاح:
def update_open_dates(conn):
    
    cur = conn.cursor()
    
    #update open date in uHalls
    halls = db_to_booking(conn).groupby('hall_id').agg(min)['date']
    
    for i in list(range(len(halls))):
        cur.execute('''UPDATE uHalls SET open_date = '{1}' WHERE hall_id = {0}'''
                    .format(halls.index[i], str(halls.iloc[i])))

    #update open date in uStudios
    studios = db_to_halls(conn)
    studios['open_date'] = pd.to_datetime(studios['open_date'])
    studios = studios.groupby('studio_id').agg(min)['open_date']
    for i in list(range(len(studios))):
        cur.execute('''UPDATE uStudios SET established_date = '{1}' WHERE  studio_id = {0}'''
                    .format(studios.index[i], str(studios.iloc[i])))
    
    conn.commit()




تحليل التحديث



سنجمع جميع الإجراءات الواردة في هذا المقال والمادة السابقة في هذا الإجراء. يمكن تشغيله أثناء التحليل الأول وعند تحديث البيانات.



يبدو الإجراء كما يلي:
def update_parsing(directory = './/', is_manual = 0):
    
    start_time = time.time()
    
    #is DataBase exists?
    if not os.path.exists(directory + 'photostudios_moscow1.sqlite'):
        if is_manual == 1:
            print('Data base is not exists. Do you want to create DataBase (y/n)? ')
            answer = input().lower()
        else: 
            answer == 'y'
        
        if answer == 'y':
            conn = sqlite3.connect(directory + 'photostudios_moscow1.sqlite')
            conn.close()
            print('DataBase is created')
        elif answer != 'n':
            print('Error in input!')
            return list()
    
    print('DataBase is exists')
    print("--- %s seconds ---" % (time.time() - start_time))
    start_time = time.time()
        
    #connect to DataBase
    conn = sqlite3.connect(directory + 'photostudios_moscow1.sqlite')
    cur = conn.cursor()       

    #has DataBase 4 tables?
    tables = [x[0] for x in list(cur.execute('SELECT name FROM sqlite_master WHERE type="table"'))]
    if not ('uStudios' in tables) & ('uHalls' in tables) & ('uBooking_parsing' in tables) & ('uBooking' in tables):
        if is_manual == 1:
            print('Do you want to create missing tables (y/n)? ')
            answer = input().lower()
        else:
            answer = 'y'
        
        if anwer == 'y':
            if not ('uStudios' in tables):
                create_tables(conn, table = 'uStudios')

            if not ('uHalls' in tables):
                create_tables(conn, table = 'uHalls')

            if not ('uBooking_parsing' in tables):
                create_tables(conn, table = 'uBooking_parsing')

            if not ('uBooking' in tables):
                create_tables(conn, table = 'uBooking')

        elif answer != 'n':
            print('Error in input!')
            return list()

    conn.commit()
    print(str(tables) + ' are exist in DataBase')
    print("--- %s seconds ---" % (time.time() - start_time))
    start_time = time.time()
    
    #update uStudios
    studios = studio_list()
    new_studios = studios[[x not in list(db_to_studios(conn).index) for x in list(studios.index)]]
    if len(new_studios) > 0:
        print(str(len(new_studios)) + ' new studios detected: \n' + str(list(new_studios['name'])))
        studios_to_db(conn, new_studios)
    
    conn.commit()
    print('Studio list update was successful')
    print("--- %s seconds ---" % (time.time() - start_time))
    start_time = time.time()
    
    #update uHalls
    halls = hall_list(list(studios.index)).sort_index()
    new_halls = halls[[x not in list(db_to_halls(conn).index) for x in list(halls.index)]]
    if len(new_halls) > 0:
        halls_to_db(conn, new_halls)
    
    conn.commit()
    print('Halls list update was successful')
    print("--- %s seconds ---" % (time.time() - start_time))
    start_time = time.time()
        
    #update uBooking_parsing
    booking_to_db(conn, halls.index)   
    
    conn.commit()
    print('Booking_parsing update was successful')
    print("--- %s seconds ---" % (time.time() - start_time))
    start_time = time.time()
    
    #update uBooking from uBooking_parsing
    cur.execute('DELETE FROM uBooking')
    cur.execute('''
        insert into uBooking (hall_id, date, hour, is_working_hour, min_hours, price, is_booked, duration, parsing_date) 
        select hall_id, date, hour, is_working_hour, min_hours, price, is_booked, duration, parsing_date
        from
        (
            select *, row_number() over(partition by hall_id, date, hour order by parsing_date desc) rn 
            from uBooking_parsing
        ) t
        where rn = 1
    ''')
    conn.commit()
    print('Booking update was successful')
    print("--- %s seconds ---" % (time.time() - start_time))
    start_time = time.time()
    
    update_open_dates(conn)
    conn.commit()
    print('Open date update was successful')
    print("--- %s seconds ---" % (time.time() - start_time))
    
    conn.close()




دعونا نحلل عملها بالترتيب.



عند مدخل الإجراء ، نقوم بتمرير معلمتين: عنوان المجلد الذي تحصل منه على قاعدة البيانات أو مكان تثبيتها (بشكل افتراضي ، نأخذ المجلد مع مستندات python) ، والمعلمة الاختيارية is_manual ، والتي ، إذا تم تعيينها على "1" ، ستطالبك بإنشاء قاعدة بيانات أو جداول في في غيابهم.



. , :
    if not os.path.exists(directory + 'photostudios_moscow1.sqlite'):
        if is_manual == 1:
            print('Data base is not exists. Do you want to create DataBase (y/n)? ')
            answer = input().lower()
        else: 
            answer == 'y'
        
        if answer == 'y':
            conn = sqlite3.connect(directory + 'photostudios_moscow1.sqlite')
            conn.close()
            print('DataBase is created')
        elif answer != 'n':
            print('Error in input!')
            return list()




:
    conn = sqlite3.connect(directory + 'photostudios_moscow1.sqlite')
    cur = conn.cursor() 




, . , . :
    tables = [x[0] for x in list(cur.execute('SELECT name FROM sqlite_master WHERE type="table"'))]
    if not ('uStudios' in tables) & ('uHalls' in tables) & ('uBooking_parsing' in tables) & ('uBooking' in tables):
        if is_manual == 1:
            print('Do you want to create missing tables (y/n)? ')
            answer = input().lower()
        else:
            answer = 'y'
        
        if anwer == 'y':
            if not ('uStudios' in tables):
                create_tables(conn, table = 'uStudios')

            if not ('uHalls' in tables):
                create_tables(conn, table = 'uHalls')

            if not ('uBooking_parsing' in tables):
                create_tables(conn, table = 'uBooking_parsing')

            if not ('uBooking' in tables):
                create_tables(conn, table = 'uBooking')

        elif answer != 'n':
            print('Error in input!')
            return list()

    conn.commit()




. :
    studios = studio_list()
    new_studios = studios[[x not in list(db_to_studios(conn).index) for x in list(studios.index)]]
    if len(new_studios) > 0:
        print(str(len(new_studios)) + ' new studios detected: \n' + str(list(new_studios['name'])))
        studios_to_db(conn, new_studios)




conn.commit()



:
    halls = hall_list(list(studios.index)).sort_index()
    new_halls = halls[[x not in list(db_to_halls(conn).index) for x in list(halls.index)]]
    if len(new_halls) > 0:
        halls_to_db(conn, new_halls)
    
    conn.commit()




uBooking_parsing. , .. booking_to_db
    booking_to_db(conn, halls.index)   
    
    conn.commit()




uBooking. uBooking uBooking_parsing ( , ) :
    cur.execute('DELETE FROM uBooking')
    cur.execute('''
        insert into uBooking (hall_id, date, hour, is_working_hour, min_hours, price, is_booked, duration, parsing_date) 
        select hall_id, date, hour, is_working_hour, min_hours, price, is_booked, duration, parsing_date
        from
        (
            select *, row_number() over(partition by hall_id, date, hour order by parsing_date desc) rn 
            from uBooking_parsing
        ) t
        where rn = 1
    ''')
    conn.commit()




:
    update_open_dates(conn)
    conn.commit()




    conn.close()




تم تكوين التحليل مع حفظ البيانات في قاعدة البيانات بنجاح!



نبدأ التحليل / التحديث بالإجراء التالي:
update_parsing()




النتيجة



في هذا المقال والمقال السابق ، قمنا بفحص الخوارزمية لتحليل المعلومات المفتوحة لاستوديوهات الصور. تم جمع البيانات التي تم الحصول عليها في قاعدة بيانات.



في المقالة التالية ، سننظر في أمثلة لتحليل البيانات التي تم الحصول عليها.



يمكنك العثور على المشروع النهائي على صفحة جيثب الخاصة بي .



All Articles