Technologia

ChatGPT jako asystent programowania w języku Python

  • 20 stycznia, 2023
  • 11 min read
ChatGPT jako asystent programowania w języku Python


ChatGPT jako asystent programowania w języku Python
Oryginalny obraz Sigmunda na Unsplash | Edycje według autora

ChatGPT od OpenAI to… już wiesz. Przeczytałeś wystarczająco dużo na ten temat, a wstępy nie są już potrzebne. Jeśli zdarzy ci się nie wiesz, czym jest ChatGPT, najpierw spójrz na to, a potem wróć, aby kontynuować.

Rozmowy z ChatGPT mogą być zabawne, a nawet pouczające. Ale spójrzmy, jak bardzo może to być pomocne.

Zobaczmy, co ChatGPT może zrobić, jeśli chodzi o pisanie kodu na podstawie dostarczonych przez nas specyfikacji. Zaczniemy prosto i od tego zaczniemy budować.

Doszedłem do wniosku, że dobrym miejscem do rozpoczęcia jest jakiś skrypt do przetwarzania danych. Ponieważ zamierzam, aby ChatGPT napisał później kilka skryptów uczenia maszynowego przy użyciu różnych bibliotek Pythona, wydawało mi się to rozsądnym miejscem do rozpoczęcia.

Cel

Najpierw chciałem wykonać kilka prób załadowania zestawu danych; upewnienie się, że wszystkie wartości zestawu danych są wartościami liczbowymi lub przekształcenie ich w takie wartości; sprawdzanie brakujących wartości; oraz podzielenie zestawu danych na zestawy pociągów i zestawów testowych.

Podpowiedź

Napisz skrypt w Pythonie, który wykona następujące czynności:
– ładuje zestaw danych z csv na dysku do Pandas DataFrame
– zapewnia, że ​​zbiór danych jest w całości numeryczny; konwertuje wartości łańcuchowe na wartości liczbowe i śledzi tę konwersję w słowniku, aby później móc się do nich odnieść
– sprawdza brakujące wartości w DataFrame i przypisuje brakujące wartości dla każdego rekordu, który ma jedną brakującą wartość; całkowicie usuwa rekord, który ma więcej niż jedną brakującą wartość
– dzieli zbiór danych na zestawy testowe i treningowe

Odpowiedź

import pandas as pd

# Load dataset from csv to DataFrame
df = pd.read_csv('dataset.csv')

# Initialize dictionary to track string to numeric conversions
conversions = {}

# Convert string values to numeric and track conversions in dictionary
for col in df.columns:
    if df[col].dtype == object:
        conversions[col] = {val: i for i, val in enumerate(df[col].unique())}
        df[col] = df[col].map(conversions[col])

# Check for missing values
missing_values = df.isna().sum()

# Impute missing values for records with one missing value
for col in missing_values[missing_values == 1].index:
    df[col].fillna(df[col].median(), inplace=True)

# Drop records with more than one missing value
df.dropna(thresh=len(df.columns) - 1, inplace=True)

# Split dataset into test and training sets
from sklearn.model_selection import train_test_split
train_df, test_df = train_test_split(df, test_size=0.2)

Uwaga: skrypt ładuje zestaw danych z pliku csv o nazwie „dataset.csv” i dzieli ramkę danych na zestawy testowe i treningowe w stosunku 80/20. Jeśli chcesz użyć innej nazwy pliku lub współczynnika, zmień odpowiednio ścieżkę/współczynnik.

Analiza

ChatGPT stworzył przydatny skrypt. Zdecydowano o nazwie zestawu danych, a także o procentowym podziale pociągu/testu i odnotowano oba te punkty oraz sposób ich zmiany w razie potrzeby. Ogólnie rzecz biorąc, misja wykonana.

Warto przeczytać!  Wydanie GTA 6 może napotkać problemy na jednej platformie

Cel

Teraz, gdy mamy już skrypt, który coś robi, zrefaktoryzujmy go trochę. Podstawą dobrego kodowania jest użycie funkcji do logicznego organizowania kodu, ułatwienia ponownego użycia i zapewnienia, że ​​się nie powtórzysz.

Podpowiedź

Przepisz powyższy skrypt, aby używał serii funkcji, które mają sens

Odpowiedź

import pandas as pd
from sklearn.model_selection import train_test_split

def load_and_convert_data(file_path):
    # Load dataset from csv to DataFrame
    df = pd.read_csv(file_path)
    
    # Initialize dictionary to track string to numeric conversions
    conversions = {}
    
    # Convert string values to numeric and track conversions in dictionary
    for col in df.columns:
        if df[col].dtype == object:
            conversions[col] = {val: i for i, val in enumerate(df[col].unique())}
            df[col] = df[col].map(conversions[col])
    
    return df, conversions

def handle_missing_values(df):
    # Check for missing values
    missing_values = df.isna().sum()
    
    # Impute missing values for records with one missing value
    for col in missing_values[missing_values == 1].index:
        df[col].fillna(df[col].median(), inplace=True)
    
    # Drop records with more than one missing value
    df.dropna(thresh=len(df.columns) - 1, inplace=True)
    
    return df

def split_data(df, test_size):
    return train_test_split(df, test_size=test_size)

# Use the functions
file_path = "dataset.csv"
df, conversions = load_and_convert_data(file_path)
df = handle_missing_values(df)
train_df, test_df = split_data(df, 0.2)

Tutaj użyłem trzech funkcji:

1. load_and_convert_data(file_path) ładuje zestaw danych csv i konwertuje wartości łańcuchowe na liczbowe.
2. handle_missing_values(df) obsługuje brakujące wartości w zbiorze danych.
3. split_data(df, test_size) dzieli zbiór danych na zbiory testowe i uczące.

Główny skrypt używa tych funkcji do ładowania, konwertowania i czyszczenia zestawu danych, a następnie dzielenia go na zestawy testowe i treningowe.

Ścieżka zbioru danych i współczynnik testowy są danymi wejściowymi dla tych funkcji.

Analiza

Jeśli spojrzysz na pierwszy skrypt wyjściowy ChatGPT, prawdopodobnie zobaczysz kilka dość oczywistych linii, które byś narysował, o ile funkcjonalność byłaby podzielona na funkcje. z pewnością tak. Pod tym względem ChatGPT zrobił dokładnie to, czego oczekiwałem. Ponownie wygenerowano kompetentny skrypt.

Cel

OK, nasz skrypt wygląda teraz trochę lepiej, ponieważ używa niektórych funkcji organizacyjnych. Następnie rozszerzmy nieco skrypt, aby użytkownik mógł określić kilka parametrów podczas uruchamiania skryptu.

Podpowiedź

Przepisz powyższy program tak, aby pobierał z wiersza poleceń następujące argumenty i używał ich w programie:
– ścieżka/nazwa pliku csv zestawu danych
– rozmiar podziału pociągu/testu
– próg liczby brakujących wartości na rekord, po przekroczeniu którego ma zostać usunięty cały rekord, zamiast imputowania brakujących wartości

Odpowiedź

import pandas as pd
import argparse
from sklearn.model_selection import train_test_split

def load_and_convert_data(file_path):
    # Load dataset from csv to DataFrame
    df = pd.read_csv(file_path)
    
    # Initialize dictionary to track string to numeric conversions
    conversions = {}
    
    # Convert string values to numeric and track conversions in dictionary
    for col in df.columns:
        if df[col].dtype == object:
            conversions[col] = {val: i for i, val in enumerate(df[col].unique())}
            df[col] = df[col].map(conversions[col])
    
    return df, conversions

def handle_missing_values(df, threshold):
    # Check for missing values
    missing_values = df.isna().sum()
    
    # Impute missing values for records with one missing value
    for col in missing_values[missing_values == 1].index:
        df[col].fillna(df[col].median(), inplace=True)
    
    # Drop records with more than threshold missing value
    df.dropna(thresh=len(df.columns) - threshold, inplace=True)
    
    return df

def split_data(df, test_size):
    return train_test_split(df, test_size=test_size)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("file_path", help="path/name of the dataset csv file")
    parser.add_argument("test_size", help="train/test split size", type=float)
    parser.add_argument("threshold", help="threshold for the number of missing values per record", type=int)
    args = parser.parse_args()
    
    # Use the functions
    df, conversions = load_and_convert_data(args.file_path)
    df = handle_missing_values(df, args.threshold)
    train_df, test_df = split_data(df, args.test_size)

W tej wersji użyłem modułu argparse do pobrania danych wejściowych dotyczących ścieżki pliku, rozmiaru podziału testu/pociągu i progu liczby brakujących wartości na rekord jako argumentów wiersza poleceń. Użytkownik będzie musiał uruchomić skrypt z poprawnymi argumentami, na przykład:

Warto przeczytać!  Najgorętsze gry minionego roku, które znalazły się na szczycie list przebojów

python script.py dataset.csv 0.2 1

Spowoduje to uruchomienie skryptu przy użyciu pliku „dataset.csv”, parametru test_size równego 0,2 i progu 1 dla brakujących wartości.

Skrypt główny używa tych argumentów w funkcjach do ładowania, konwertowania i czyszczenia zestawu danych, a następnie dzielenia go na zestawy testowe i uczące.

Warto również wspomnieć, że podczas uruchamiania skryptu skrypt powinien być uruchamiany z wiersza poleceń, a nie z poziomu IDE.

Analiza

Szczerze mówiąc, nie potrzeba tu zbyt wielu analiz, biorąc pod uwagę, że ChatGPT dość dobrze wyjaśnił, co zrobił. Właściwie odnotuję tutaj coś, czego wcześniej nie zauważyłem, i poklepuję ChatGPT po plecach za komentarze, które są wyraziste i zwięzłe.

Cel

Teraz powiedzmy, że chcieliśmy, aby ten kod był gotowy do „produkcji” (uśmiechajcie się). Niech ChatGPT zapakuje te funkcje w aplikację Streamlit.

Podpowiedź

Przepisz powyższy program jako aplikację Streamlit, umożliwiając użytkownikowi podanie tych samych argumentów, co w argumentach wiersza poleceń powyżej

Odpowiedź

import pandas as pd
import streamlit as st
from sklearn.model_selection import train_test_split

def load_and_convert_data(file_path):
    # Load dataset from csv to DataFrame
    df = pd.read_csv(file_path)
    
    # Initialize dictionary to track string to numeric conversions
    conversions = {}
    
    # Convert string values to numeric and track conversions in dictionary
    for col in df.columns:
        if df[col].dtype == object:
            conversions[col] = {val: i for i, val in enumerate(df[col].unique())}
            df[col] = df[col].map(conversions[col])
    
    return df, conversions

def handle_missing_values(df, threshold):
    # Check for missing values
    missing_values = df.isna().sum()
    
    # Impute missing values for records with one missing value
    for col in missing_values[missing_values == 1].index:
        df[col].fillna(df[col].median(), inplace=True)
    
    # Drop records with more than threshold missing value
    df.dropna(thresh=len(df.columns) - threshold, inplace=True)
    
    return df

def split_data(df, test_size):
    return train_test_split(df, test_size=test_size)

def main():
    st.set_page_config(page_title="Data Preprocessing", page_icon=":guardsman:", layout="wide")
    st.title("Data Preprocessing")
    
    file_path = st.text_input("Enter the path/name of the dataset csv file: ")
    test_size = st.number_input("Enter the train/test split size (decimal between 0 and 1): ", step=0.01, value=0.2)
    threshold = st.number_input("Enter the threshold for the number of missing values per record: ", step=1, value=1)
    
    if st.button("Process Data"):
        df, conversions = load_and_convert_data(file_path)
        df = handle_missing_values(df, threshold)
        train_df, test_df = split_data(df, test_size)
        st.success("Data preprocessing completed!")

if __name__ == '__main__':
    main()

Ta wersja to aplikacja Streamlit, która pozwala użytkownikowi podać te same argumenty, co argumenty wiersza poleceń. Wykorzystuje bibliotekę Streamlit do tworzenia interaktywnej aplikacji internetowej, która umożliwia użytkownikowi wprowadzenie ścieżki pliku, rozmiaru podziału testu/uczenia oraz progu liczby brakujących wartości na rekord. Użytkownik może następnie kliknąć przycisk „Przetwórz dane”, aby uruchomić skrypt i wstępnie przetworzyć dane. Używa tych samych funkcji co poprzednia wersja skryptu do ładowania, konwertowania i czyszczenia zestawu danych, a następnie dzielenia go na zestawy testowe i treningowe.

Warto przeczytać!  Jak iPhone zmienił moje uprzedzenia po latach używania Androida

Aby uruchomić skrypt, musisz mieć zainstalowany Streamlit, możesz uruchomić polecenie pip install streamlit w swoim terminalu. Po zainstalowaniu uruchom skrypt za pomocą polecenia streamlit run script.py.

Analiza

Zrobiło to, co miało zrobić. ChatGPT wziął nasze funkcjonujące… funkcje i zbudował z nimi prostą aplikację internetową Streamlit.

Zrzut ekranu aplikacji internetowej Streamlit utworzonej za pomocą skryptu wygenerowanego przez ChatGPT
Aplikacja internetowa Streamlit utworzona za pomocą skryptu wygenerowanego przez ChatGPT

ChatGPT wykonał doskonale kompetentną pracę, tworząc, refaktoryzując, rozszerzając i dodając opakowanie wokół prostego skryptu Pythona do wstępnego przetwarzania danych, który chcieliśmy, aby napisał dla nas, na podstawie dostarczonych przez nas specyfikacji. Chociaż z perspektywy czasu nie był to najbardziej złożony program, był to krok w kierunku, aby ChatGPT był naprawdę użyteczny, działając jako asystent programowania. Wyniki uderzały w znak na każdym kroku.

Następnym razem zbudujemy mniej trywialny program z większą złożonością i dodatkowymi wymaganiami. Nie mogę się doczekać, aby zobaczyć, jak dobrze ChatGPT radzi sobie pod presją. Mam nadzieję, że ty też.

Mateusz Majo (@mattmayo13) jest Data Scientist i redaktorem naczelnym KDnuggets, nowatorskiego internetowego zasobu Data Science i Machine Learning. Jego zainteresowania obejmują przetwarzanie języka naturalnego, projektowanie i optymalizację algorytmów, uczenie bez nadzoru, sieci neuronowe i zautomatyzowane podejście do uczenia maszynowego. Matthew posiada tytuł magistra informatyki oraz dyplom ukończenia studiów podyplomowych z eksploracji danych. Można się z nim skontaktować pod adresem editor1 pod adresem kdnuggets[dot]kom.




Źródło