Aman seumur hidup saat bekerja dengan data — (buat) lembar contekan Python sendiri

Sebagai seorang pengembang, waktu adalah sumber daya Anda yang paling berharga. Untuk meningkatkan produktivitas Anda, disarankan untuk memiliki lembar contekan sendiri dengan cuplikan kode. Masalahnya adalah mengelola lembar contekan Anda sendiri membutuhkan waktu, tenaga, dan disiplin tertentu. Menulis lembar contekan dengan gaya “cepat & kotor” akan segera mengakibatkan kekacauan, menurunkan motivasi Anda untuk lebih mempertahankannya, dan tidak meningkatkan produktivitas Anda dalam jangka panjang. Untuk menghindari kekacauan, Anda harus meluangkan waktu untuk membuat cuplikan kode dapat dibaca, dimengerti, dipelihara, dapat digunakan, diurutkan, dan mudah diakses dari awal. Namun masalah awal muncul lagi. Ini menghabiskan waktu dan tenaga.

Bagaimana cara menyelesaikan persamaan ini?

  1. Jangan menulis/menyimpan cuplikan di Github, Google Drive, atau di proyek terpisah. Sebaliknya, tulis dan publikasikan di Medium. Mengapa? Saat menerbitkan artikel di Medium, Anda (secara alami) akan menghindari “cepat & kotor” dan sebagai gantinya (secara otomatis) mencoba membuat cuplikan dan penjelasannya dapat dibaca, dimengerti, dapat digunakan, dan seterusnya.
  2. Ini masih membutuhkan waktu dan usaha Anda, namun sementara itu, Anda akan menjadi “penerbit”, berkontribusi kepada komunitas dan menjaga reputasi Anda sebagai pengembang dan (bahkan mungkin mendapatkan uang tambahan). Anda akan lebih termotivasi untuk mendokumentasikan pekerjaan Anda.
  3. Jangan menunda pengumpulan cuplikan Anda. Saya menyarankan Anda untuk "menulis cerita" tentang topik yang Anda kerjakan dan cukup salin-tempel cuplikan kode (penting) di sana, jika memungkinkan pada hari yang sama. Tidak perlu langsung mempublikasikannya, untuk permulaan cukup menyimpannya disana. Publikasikan segera setelah Anda memiliki cukup konten untuk dijadikan artikel.

Mari kita terapkan rekomendasi ini

Tahun ini saya bekerja di waktu luang saya pada proyek pribadi berskala kecil di mana saya mengumpulkan data dari situs web, membersihkannya, menganalisis teks untuk kata kunci, dan mengumpulkan data. Kemudian saya memulai proyek kedua, di mana saya juga harus bekerja dengan data dan di mana saya menghadapi beberapa masalah serupa yang telah saya selesaikan di proyek pertama. Cuplikan kode berikut yang saya kumpulkan dari kedua proyek tersebut.

Daftar isi

  • Membaca string dari file CSV ke dalam daftar Python
  • Menambahkan karakter pada setiap elemen dalam daftar
  • Ratakan daftar daftar dengan Python
  • Menghapus duplikat dari daftar
  • Menambahkan beberapa daftar terurut dan terkait dalam satu file CSV
  • Penyiapan cepat Selenium untuk chrome dengan sakelar tanpa kepala
  • Menemukan kata kunci dalam sebuah teks
  • Menemukan kata kunci di Pandas DataFrames

Membaca string dari file CSV ke dalam daftar Python

Asumsikan Anda memiliki file “sites.txt” di direktori bernama “situs web”.

www.dw.com/de
www.spiegel.de/
www.nzz.ch/
www.aljazeera.com/
www.jpost.com/

Untuk kode berikut membacanya dalam daftar Python:

def parse_strings_from_txt_in_list(filename_of_txt):
    with open(filename_of_txt) as f:
        lines = [line.rstrip() for line in f]
    return lines


if __name__ == '__main__':
    links = parse_strings_from_txt_in_list("websites/sites.txt")
    print(links)
# output
['www.dw.com/de', 'www.spiegel.de/', 'www.nzz.ch/', 'www.aljazeera.com/', 'www.jpost.com/']
# if you don't apply rstrip() the output will contain "\n".
['www.dw.com/de\n', 'www.spiegel.de/\n', 'www.nzz.ch/\n', 
'www.aljazeera.com/\n', 'www.jpost.com/\n']
# https://www.w3schools.com/python/ref_string_rstrip.asp

Menambahkan karakter pada setiap elemen dalam daftar

Asumsikan Anda ingin membuat permintaan pengambilan atau mengikis situs web tersebut. Prasyaratnya adalah memiliki “https://” di setiap awal string. Kode berikut akan mencapainya:

...
def add_chars_to_strings_in_list(list_of_str, chars_to_add):
    return [''.join((chars_to_add, link)) for link in list_of_str]


if __name__ == '__main__':
    links = parse_strings_from_txt_in_list("websites/sites.txt")
    links_2 = add_chars_to_strings_in_list(links, 'https://')
    print(links_2)
# output
['https://www.dw.com/de', 'https://www.spiegel.de/', 'https://www.nzz.ch/', 'https://www.aljazeera.com/', 'https://www.jpost.com/']

Ratakan daftar daftar dengan Python

Seringkali Anda masuk ke situasi di mana Anda memiliki daftar daftar. Bagi saya, situasi ini sering terjadi ketika saya menggores situs web dan sub-situsnya dan mencari kata kunci tertentu. Kode berikut membantu saya membuat daftar datar:

def make_nested_list_flat(list_of_lists):
    return [item for sublist in list_of_lists for item in sublist]


if __name__ == '__main__':
    keyword_list_nested = [["Python", "Java", "Kotlin"],
                           ["React", "JavaScript", "Ruby"],
                           ["AWS", "Python", "GO"],
                           ["Python", "AWS", "Flutter"]]

    keyword_list_flat = make_nested_list_flat(keyword_list_nested)
    print(keyword_list_flat)
# output
['Python', 'Java', 'Kotlin', 'React', 'JavaScript', 'Ruby', 'AWS', 'Python', 'GO', 'Python', 'AWS', 'Flutter']

Menghapus duplikat dari daftar

Anda dapat menerapkan fungsi set() yang dikombinasikan dengan list() untuk menghapus elemen duplikat dalam daftar. Perlu diingat bahwa set() tidak akan mempertahankan urutan asli tetapi dapat mengembalikan kumpulan elemen yang diurutkan secara acak.

...
def remove_duplicates_in_list(list_with_duplicates):
    return list(set(list_with_duplicates))
if __name__ == '__main__':
    ...
    keywords_unique = remove_duplicates_in_list(keyword_list_flat)
    print(keywords_unique)
# output
['Flutter', 'Ruby', 'React', 'JavaScript', 'AWS', 'GO', 'Python', 'Java', 'Kotlin']
# to get a sorted list: sorted(list(set(list_with_duplicates)))

Menambahkan beberapa daftar terurut dan terkait dalam satu file CSV

Katakanlah Anda ingin mengambil artikel dari surat kabar dan mendapatkan datanya dalam file CSV yang tertata rapi dengan kolom berikut: “article_title”, “article_subtitle”, “article_content”, “article_date”. Masalah Anda sekarang, ketika menyalin situs web dan artikel berita, Anda menerima empat daftar.

titles = ['title_1', 'title_2', 'title_3']
subtitles = ['subtitle_1', 'subtitle_2', 'subtitle_3']
dates = ['date_1', 'date_2', 'date_3']
contents = ['content_1', 'content_2', 'content_3']

Yang ingin Anda miliki adalah struktur CSV berikut:

'title',    'subtitle',    'date',   'content'
'title_1',  'subtitle_1',  'date_1', 'content_1' 
'title_2',  'subtitle_2',  'date_2', 'content_2'
'title_3',  'subtitle_3',  'date_3', 'content_3'

Kode berikut akan mencapai hal ini:

import pandas as pd
from datetime import date
def create_news_df(titles, subtitles, dates, contents):
    return pd.DataFrame(list(zip(titles, subtitles, dates, contents)),columns=['title', 'subtitle', 'date', 'content'])
if __name__ == '__main__':

    titles = ['title_1', 'title_2', 'title_3']
    subtitles = ['subtitle_1', 'subtitle_2', 'subtitle_3']
    dates = ['date_1', 'date_2', 'date_3']
    contents = ['content_1', 'content_2', 'content_3']

    news_df = create_news_df(titles, subtitles, dates, contents)
    print(news_df)
# output
     title    subtitle    date    content
0  title_1  subtitle_1  date_1  content_1
1  title_2  subtitle_2  date_2  content_2
2  title_3  subtitle_3  date_3  content_3

Untuk membuat file CSV Anda dapat menggunakan metode Pandas to_csv() :

news_df.to_csv("NewsData/" + str(date.today()) + "news.csv", index=False)

Penyiapan cepat Selenium untuk chrome dengan sakelar tanpa kepala

Selenium adalah perpustakaan yang sangat berguna untuk otomatisasi pengujian, otomatisasi browser, dan web scraping. Berikut dua variasi yang saya suka gunakan. Yang pertama mengharuskan Anda mengunduh chromedriver.exe. Biasanya saya membuat folder proyek bernama “driver” dan meletakkan file chromedriver.exe di sana.

# after doing pip install selenium
from selenium import webdriver
def create_chome_webdriver_instance():
    headless_mode = True
    options = webdriver.ChromeOptions()
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-blink-features=AutomationControlled')

    if headless_mode:
        options.add_argument('--headless')
    else:
        pass
    driver = webdriver.Chrome('driver/chromedriver', options=options)
    return driver
if __name__ == '__main__':
    driver = create_chome_webdriver_instance()
    driver.get("https://www.google.com")

Cara kedua hampir sama, bedanya mendownload file chromedriver.exe secara otomatis dan menyimpannya di cache. Anda harus menginstal webdriver-manager dan memanggil ChromeDriverManager().install()

# after doing pip install webdriver-manager
from webdriver_manager.chrome import ChromeDriverManager
...
def create_chome_webdriver_instance():
    headless_mode = True
    driver = ChromeDriverManager().install()
...

Menemukan kata kunci dalam sebuah teks

Tugas yang umum adalah memeriksa teks untuk kata kunci tertentu dan mengekstrak kecocokannya. Saya suka menggunakan “flashtext” (https://flashtext.readthedocs.io/en/latest/) untuk tugas ini. Pustaka ini mudah digunakan dan dibandingkan dengan pustaka NLP tertentu, mudah untuk ditambahkan ke kode Anda yang sudah ada. Apalagi algoritmanya sangat cepat. Kode di bawah ini menunjukkan implementasinya:

# after doing pip install flashtext
from flashtext import KeywordProcessor

def load_keywords_in_processor(keywords):
    keyword_processor = KeywordProcessor()
    for keyword in keywords:
        keyword_processor.add_keyword(keyword)
    return keyword_processor

if __name__ == '__main__':
    text_1 = "Lorem Impsum AWS and PYTHON"
    keywords = ['AWS', 'PYTHON', 'JAVA', 'REACT', 'PHP', 'CSS']

    keyword_processor = load_keywords_in_processor(keywords)
    found_keywords = keyword_processor.extract_keywords(text_1)
    print(found_keywords)
# Output
['AWS', 'PYTHON']

Menemukan kata kunci di Pandas DataFrames

Mampu menemukan kata kunci dalam sebuah teks itu bagus. Namun, bagaimana jika Anda perlu menganalisis banyak teks dan ingin menyimpannya dalam file CSV dengan kolom terpisah untuk semua kata kunci yang ditemukan? Caranya adalah dengan membuat Pandas Dataframe, dimana setiap teks berada pada barisnya masing-masing. Kemudian Anda dapat menggunakan metode Pandas apply() yang dikombinasikan dengan KeywordProcessor di setiap baris. Berikut ini contohnya:

import pandas as pd
from flashtext import KeywordProcessor
from pandas import DataFrame
...
if __name__ == '__main__':
    text_1 = "Lorem Impsum AWS and PYTHON"
    text_2 = "Lorem Impsum AWS and JAVA"
    text_3 = "Lorem Impsum CSS and REACT"

    list_of_texts = [text_1, text_2, text_3]

    keywords = ['AWS', 'PYTHON', 'JAVA', 'REACT', 'PHP', 'CSS']

    texts_df = DataFrame(list_of_texts, columns=['text'])
    print(texts_df)
# each text is now a separate row inside the dataframe
"""
                          text
0  Lorem Impsum AWS and PYTHON
1    Lorem Impsum AWS and JAVA
2   Lorem Impsum CSS and REACT
"""
#  now we can apply the extract_keywords method on each row
    keyword_processor = load_keywords_in_processor(keywords)
    texts_df["keyword"] =      
    texts_df['text'].apply(keyword_processor.extract_keywords)
    print(texts_df)
# output
"""
                          text       keywords
0  Lorem Impsum AWS and PYTHON  [AWS, PYTHON]
1    Lorem Impsum AWS and JAVA    [AWS, JAVA]
2   Lorem Impsum CSS and REACT   [CSS, REACT]
"""

Semoga cuplikan ini bermanfaat bagi Anda. Saya berjanji untuk memperluas blog ini dengan cuplikan yang lebih bermanfaat. Itu saja untuk saat ini. Selamat membuat kode!