MINERVA/Python 2023. 9. 16. 18:24
반응형

1. 기능 설명

- conda와 pip는 패키지 관리를 한다.

- pip install <패키지명> , conda install -c  conda-forge <패키지명> 

- pip repository는 https://pypi.org/이고, conda repository는 https://conda-forge.org/, https://repo.anaconda.com/pkgs/이다.

 

2. 차이점

- pip와 conda는 패키지를 가져오는 곳이 다름(당연함^^)

- 패키지 안정성(?)은 conda가 더 좋음, pip는 가끔 소스를 내려받아 cpp빌드를 하면서 문제가 발생하지만,conda는 os환경에 적합하게 미리 빌드된 패키지를 설치.(conda는 패키지 빌드시 의존성을 고려하기 때문에 사용하기 쉽고, 일괄 업데이트도 쉽다.(conda update --all))

- 하지만, conda는 pip보다 오래된(?) 버젼일수 있음

 

2. 정리

- anaconda 환경에는 가급적 pip를 사용하지 않는 것이 좋다. 왜냐면, 패키지 의존성(Dependency)에 문제 생김

- conda를 통해서 최대한 설치하고, 없으면 pip를 하용하지만, 추후 conda를 통해서 지원한다면, pip를 통해서 설치된 버젼을 제거하고, conda를 통해서 재설치를 추천 함.

 

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 8. 21. 20:02
반응형

기본 가상환경에서의 패지지 관리와 유사하지만, 

 

 

[Python] 패키지 일괄 업데이트

사용중인 패키지를 일괄 업데이트 하기 위해서 pipupgrade(파이썬 패키지 관리자)가 필요합니다. 1. pip 업그레이드 pipupgrade(파이썬 패키지 관리자)를 사용하기 위해서는 최신버젼으로 업그레이드를

choiwonwoo.tistory.com

Anaconda 가상 환경에서 패키지 관리 방법을 정리하면 아래와 같습니다.

[참조]

 

 

 

[Anaconda] 가상환경(virtual environment) 관리

가상환경을 제공하는 아나콘다(Anaconda)에서 필수적인 명령어를 정리하고자 합니다. 1) 버전 확인 [Anaconda Prompt(anaconda3)] (base) D:\NextTime\cwwDev>conda -V conda 4.13.0 2) 라이브러리(패키지) 설치, 업데이트

choiwonwoo.tistory.com

 

1.Anaconda prompt

2. 가상환경(anaconda) 업데이트 진행

- 진행순서: conda -> python -> pip --> 패키지 업데이트

 

2.1 현재 상용중인 환경 확인

conda/python/pip 버젼확인

2.2 업데이트

conda 업데이트
conda 환경에서 사용하는 python 업데이트
conda 환경에서 사용하는 pip 업데이트
conda 환경에 설치된 패키지 업데이트

3. conda 기본 명령어

 

3.1 설치된 패키지 확인

> conda list

3.2 사용중인(이미 생성된) 가상환경 확인

>conda env list

이외 기본적인 명령어는 위에 링크된 가상환경 관리 부분을 보면 쉽게 이해가 될것이라고 생각됩니다.

 

4. 정리

라이브 서비스를 도커(Docker)로 넘겨서 관리를 하기는 하지만, 개인적인 경험으로 개발단계에서는 아나콘다를 사용하는것이 직관적이면서 관리가 쉬운것으로 생각됩니다.

 

 

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 8. 20. 19:26
반응형

사용중인 패키지를 일괄 업데이트 하기 위해서 pipupgrade(파이썬 패키지 관리자)가 필요합니다.

 

1. pip 업그레이드

pipupgrade(파이썬 패키지 관리자)를 사용하기 위해서는 최신버젼으로 업그레이드를 진행

 

>python.exe -m pip install --upgrade pip

Collecting pip
  Using cached pip-23.2.1-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 20.2.3
    Uninstalling pip-20.2.3:
      Successfully uninstalled pip-20.2.3
Successfully installed pip-23.2.1

 

2. pipupgrade 설치

>  pip install pipupgrade

Requirement already satisfied: pipupgrade in d:\dev\python39\lib\site-packages (1.12.0)
Requirement already satisfied: pip in d:\dev\python39\lib\site-packages (from pipupgrade) (23.2.1)
Requirement already satisfied: bpyutils in d:\dev\python39\lib\site-packages (from pipupgrade) (0.5.8)

 

3. 설치된 패키지 확인

>pipupgrade --check

이 명령을 실행하면 설치된 패키지들 중에서 업그레이드 가능한 패키지들의 목록이 표시되며, 사용자의 승인하에 업그레이드를 진행할 수 있습니다.

 

4. 일괄 업데이트 진행

>pipupgrade --verbose --latest --yes

 

5. 정리

개인적은 경험으로 C/C++과 비교해서 파이썬이 좋은 점이 패키지(라이브러리) 버젼관리가 쉽다는 점이다.

물론, 아주 가끔 파이썬 신버전에서 동작하지 않는 패키지가 있기는 했지만. 그래도 단점보다는 장점이 많아 보입니다.

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 8. 20. 19:13
반응형

pip 업데이트를 진행시, 위와 같은 경고(warning)을 보게되는 경우가 있습니다.

개발을 진행하는 데는 문제가 없지만, 기분이 깔끔하지 않기에 아래와 같은 경고 메시지가 보였을때는 아래와 같이 처리하 처리하면 됩니다.

발생원인은 업데이트를 진행하는 디렉토리에 먼가 이상한, 유효한지 않은(invalid) 내용이 있기 때문입니다.

그래서 경고가 발생한 패키지의 디렉토리를 확인해보면, 이상한 디렉토리가 존재하는 것을 확인 할수 있습니다.

임시디렉토리(~)가 생긴 원인은 이전에 업데이트를 진행하면서 실패하였을때 생긴것으로 추정됩니다.

일단 위의 임시디렉토리(~)를 모두 지워주세요.

 

그리고, 다시 업데이트 진행하여주시면 경고문 없이 진행되는 것을 확인하실수 있습니다.

 

 

감사합니다.

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 8. 20. 18:56
반응형

주기적으로 프로젝트 파이썬 패키지를 일괄 업데이트를 하는데, 갑자기(?) 아래와 같이 pip가 또(?) 말썽을 부리네요. 

왜 이게 발생하는지 정확히는 모르겠지만, 발생하는 몇가지 패턴(?)은 있는것 같다.

 

그래도 일단은 일이 급하니 위와 같은 에러 발생시 해결하는 방법을 간단히 정리하자 합니다.

 

해결방법은 아래와 같습니다.

>> python -m ensurepip

 

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 4. 28. 12:35
반응형

공휴일과 대체 공휴일 확인을 위해서, nework API를 통해서 확인하는 부분을 정적으로 전환(이유: 방화벽과 속도 문제등)

 

import time
import datetime
from pytimekr import pytimekr

# alternative holiday: 대체휴일
alterHolidayList = ['20230124','20230501','20230529']

# 주말(weekend) & 연휴(holiday) & 대체휴일(alterHolidayList)
def CheckOffDay(d):
    holidayList = pytimekr.holidays()
    bHoliday = holidayList.__contains__(d)
    bWeekday = d.weekday() > 4
    strCheckDay = d.strftime('%Y%m%d')
    bAlterday = alterHolidayList.__contains__(strCheckDay)
    return(bWeekday or bHoliday or bAlterday)

# working day를 구해서 list로 반환
def GetWorkingDay(strBaseDay,nWorkingDay = 1):  # 1은 당일 하루를 의미
    nWorkingDayList = []

    # string -> datatime
    dtBaseDay = datetime.datetime.strptime(strBaseDay, '%Y%m%d')
    print(dtBaseDay)
    print(dtBaseDay.date())

    for day in range(0,nWorkingDay):

        while CheckOffDay(dtBaseDay.date()):
            dtBaseDay = dtBaseDay - datetime.timedelta(days=1)

        nWorkingDayList.append(dtBaseDay.strftime('%Y%m%d'))
        dtBaseDay = dtBaseDay - datetime.timedelta(days=1)

    return nWorkingDayList
if __name__ == '__main__':

    strBaseDay  = '20230505'    # 보통 오늘 기준으로 시총, 상장주식수등 고려
    nWorkingDay = 6             # 오늘 포험, 실제 일하는 날만

    dayList = GetWorkingDay(strBaseDay,nWorkingDay)
    print(dayList)

라이브 코드에서, 해당 기능 단위 테스트 코드부분을 발취

 

[실행결과]

['20230504', '20230503', '20230502', '20230428', '20230427', '20230426']

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 4. 28. 04:12
반응형

Pandas에서 데이터프레임의 열(column)의 데이터 타입을 변경하는 방법은 아래와 같습니다.

  1. astype() 메서드 사용
    • astype() 메서드는 데이터프레임 내의 모든 값을 지정한 데이터 타입으로 변환합니다.
    • 예시: df['column_name'] = df['column_name'].astype('int')
  2. to_numeric() 메서드 사용
    • to_numeric() 메서드는 데이터프레임 열의 값을 수치형으로 변환합니다.
    • 예시: df['column_name'] = pd.to_numeric(df['column_name'], errors='coerce')
  3. to_datetime() 메서드 사용
    • to_datetime() 메서드는 데이터프레임 열의 값을 날짜/시간형으로 변환합니다.
    • 예시: df['column_name'] = pd.to_datetime(df['column_name'], format='%Y-%m-%d')
  4. apply() 함수 사용
    • apply() 함수는 데이터프레임 열의 각 값을 특정 함수에 적용하여 변환합니다.
    • 예시: df['column_name'] = df['column_name'].apply(lambda x: x.lower())

개인적으로 적합한 방법을 선택하여 데이터프레임 열의 데이터 타입을 변경할 수 있습니다.

 

각 케이스별 구체적인 예는 아래와 같습니다.

 

1. astype() 

import pandas as pd

data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
        'age': ['23', '35', '27', '29', '31'],
        'score': [80, 90, 75, 85, 95]}
df = pd.DataFrame(data)

문자열로 된 'age'열이 포함된 데이터프레임이 있다고 가정해봅시다. 여기서 'age'열의 데이터 타입을 정수형으로 변경하려면 다음과 같이 astype() 메서드를 사용할 수 있습니다.

df['age'] = df['age'].astype(int)

위 코드에서 df['age']는 'age'열에 해당하는 시리즈(Series) 객체를 반환하고, astype(int)는 해당 시리즈의 모든 값들을 정수형으로 변환한 후 다시 시리즈 객체를 반환합니다. 마지막으로 이 값을 다시 'age'열에 대입하여 'age'열의 데이터 타입을 정수형으로 변경합니다.

 

2. to_numeric()

data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
        'age': [23, 35, 27, 29, 31],
        'score': ['80', '90', '75', '85', '95']}
df = pd.DataFrame(data)

문자열로 된 'score'열이 포함된 데이터프레임이 있다고 가정해봅시다.여기서 'score'열의 데이터 타입을 정수형으로 변경하려면 다음과 같이 to_numeric() 메서드를 사용할 수 있습니다.

df['score'] = pd.to_numeric(df['score'])

위 코드에서 pd.to_numeric(df['score'])는 'score'열의 모든 값을 수치형으로 변환한 후 시리즈 객체를 반환합니다. 이 값을 다시 'score'열에 대입하여 'score'열의 데이터 타입을 수치형으로 변경합니다. 만약 'score'열에 수치형이 아닌 값이 있으면 해당 값은 NaN(Not a Number)으로 변경됩니다. 이때 to_numeric() 메서드의 errors 매개변수를 'coerce'로 지정하면 수치형으로 변환할 수 없는 값을 NaN으로 변환할 수 있습니다. 예를 들어 다음과 같이 사용할 수 있습니다.

df['score'] = pd.to_numeric(df['score'], errors='coerce')

3. to_datetime()

data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
        'age': [23, 35, 27, 29, 31],
        'date': ['2022-04-20', '2022-04-21', '2022-04-22', '2022-04-23', '2022-04-24']}
df = pd.DataFrame(data)

문자열로 된 'date'열이 포함된 데이터프레임이 있다고 가정해봅시다.여기서 'date'열의 데이터 타입을 날짜/시간형으로 변경하려면 다음과 같이 to_datetime() 메서드를 사용할 수 있습니다.

df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')

위 코드에서 pd.to_datetime(df['date'], format='%Y-%m-%d')는 'date'열의 모든 값을 날짜/시간형으로 변환한 후 시리즈 객체를 반환합니다. 이 값을 다시 'date'열에 대입하여 'date'열의 데이터 타입을 날짜/시간형으로 변경합니다. 여기서 format 매개변수는 'date'열의 값이 어떤 형식으로 표현되어 있는지를 지정합니다. 위 예시에서는 '%Y-%m-%d' 형식으로 지정했으므로 'date'열의 값들이 'YYYY-MM-DD' 형식으로 표현되어 있다고 가정했습니다.

 

4.apply()

data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
        'age': [23, 35, 27, 29, 31],
        'score1': [80, 90, 75, 85, 95],
        'score2': [85, 95, 70, 80, 90]}
df = pd.DataFrame(data)

다음과 같은 데이터프레임이 있다고 가정해봅시다.여기서 'score1'과 'score2' 열의 값의 평균을 구해서 새로운 열 'score_mean'에 저장하려면 다음과 같이 apply() 메서드를 사용할 수 있습니다.

df['score_mean'] = df[['score1', 'score2']].apply(lambda x: x.mean(), axis=1)

위 코드에서 df[['score1', 'score2']]는 'score1'과 'score2' 열에 해당하는 데이터프레임을 반환합니다. 이 데이터프레임에 apply() 메서드를 적용하면 각 행(row)에 대해 함수를 적용하게 됩니다. 여기서는 lambda x: x.mean() 함수를 적용해서 각 행의 'score1'과 'score2' 열의 평균을 구하도록 했습니다. axis=1 매개변수를 지정하여 각 행(row)에 대해 함수를 적용하도록 했습니다. 마지막으로 이 값을 'score_mean' 열에 대입하여 'score_mean' 열을 추가합니다.

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 4. 4. 15:34
반응형

간단하게 샘플 코드로 정리하고자 합니다.

import os

import pandas as pd
import numpy as np

if __name__ == '__main__':
    print(f'{os.path.dirname(__file__)}')

    #
    df = pd.DataFrame(  np.random.randn(5, 5),
                        columns=['A','B','C','D','E' ]  )
    # show all data
    print(df)

    # print #2 row
    print(df.loc[2, :])

    # Dataframe to List
    rowList = df.loc[2, :].values.flatten().tolist()
    print(rowList)

    # subset dataframe to list
    rowList = df.loc[2, ['A','E']].values.flatten().tolist()
    print(rowList)

[실행결과]

# show all data
print(df)

          A         B         C         D         E
0  1.736102 -1.477961 -1.179571  1.411220 -0.211700
1  0.175911 -0.518549  0.594174  0.333632 -1.579409
2  0.595619 -0.224543 -0.715213 -0.049334 -0.471737
3  0.639203 -0.451774 -0.009238  0.684090 -0.036995
4 -0.303029 -0.655539 -1.132769  0.485218  1.205955

# print #2 row
print(df.loc[2, :])

A    0.595619
B   -0.224543
C   -0.715213
D   -0.049334
E   -0.471737
Name: 2, dtype: float64

 

# Dataframe to List
rowList = df.loc[2, :].values.flatten().tolist()
print(rowList)

[0.5956188992136562, -0.2245426559477047, -0.7152127642656871, -0.049333965859220306, -0.4717365476151358]

 

# subset dataframe to list
rowList = df.loc[2, ['A','E']].values.flatten().tolist()
print(rowList)


[0.5956188992136562, -0.4717365476151358]

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 4. 3. 12:31
반응형

 

# 특정 컬럼을 기준으로 DF를 비교하여, 다른 ROW를 추출
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve'],
    'Age': [25, 30, 35, 40, 45],
    'City': ['New York', 'San Francisco', 'Los Angeles', 'New York', 'San Francisco']
})

# City 컬럼을 기준으로 중복되는 데이터를 제거합니다.
unique_cities = df['City'].unique()

# 다른 row를 저장할 빈 DataFrame을 생성합니다.
result = pd.DataFrame()

# unique_cities를 순회하면서 다른 row를 추출합니다.
for city in unique_cities:
    temp_df = df[df['City'] == city]
    if len(temp_df) > 1:
        # City 컬럼이 같은 row를 비교합니다.
        # 중복을 제외한 첫 번째 row와 다른 row를 찾아냅니다.
        diff = temp_df.loc[temp_df.index.difference([temp_df.index[0]])]
        result = pd.concat([result, diff])

# 결과를 출력합니다.
print(result)
반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 4. 3. 12:29
반응형

dataframe의 row와 column 수가 같다면, compare등의 함수를 사용하여 쉽게 되는데, row수가 다른 경우는 이 방법이 최선듯하여 공유 합니다.

 

간단하게 예제 코드를 기록하였습니다.

 

 

import pandas as pd

# 첫 번째 DataFrame 생성
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4]})

# 두 번째 DataFrame 생성
df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': [5, 6, 7, 8]})

# 두 개의 DataFrame을 key 열을 기준으로 merge
merged = pd.merge(df1, df2, on='key', how='outer', suffixes=('_left', '_right'))

# value_left 열과 value_right 열이 다른 행을 추출
diff_rows = merged[merged['value_left'] != merged['value_right']]

print(diff_rows)

 

반응형
posted by choiwonwoo
: