모든 슬롯 무료체험 설치와 함께 제공되는 객체 지향 API는 슬롯 무료체험 모델링을 기존 애플리케이션 및 IT 환경에 원활하게 통합할 수 있는 좋은 방법입니다. .NET, C++, Java, Python, Matlab 중에서 선택할 수 있습니다. 이 목록의 마지막 두 가지는 탐색적이고 대화형 방식으로 데이터를 분석해야 하는 사람들에게 특히 인기가 있습니다.
Python 커뮤니티에서 Pandas는 데이터 인덱싱 및 슬라이싱, 재구성, 병합 및 시각화를 위한 고급 작업을 통해 데이터를 편리하게 저장하고 조작할 수 있는 일반적으로 사용되는 패키지입니다.
Matlab에서 내장된 행렬, 테이블 및 구조체 형식은 데이터를 조작하기 위해 일반적으로 사용되는 데이터 구조입니다.
Python과 Matlab 모두 기존 슬롯 무료체험 API는 매우 강력하고 기능이 완벽하지만 슬롯 무료체험 데이터와 대화형으로 작업하는 것은 지루할 수 있습니다. 따라서 우리는라는 새로운 프로젝트를 시작했습니다.슬롯 무료체험 전송(슬롯 무료체험 37의 일부), Python 및 Matlab을 시작으로 슬롯 무료체험와 다른 언어 간의 데이터 교환 전용 API를 만드는 것을 목표로 합니다.
슬롯 무료체험 전송 프로젝트에서 우리는 몇 가지 핵심 사항에 중점을 둡니다.
- 속도: 대규모 데이터 세트에는 성능이 매우 중요합니다.
- 편의성: API는 환경별 데이터 형식을 사용하고 사용하기 위해 직관적이어야 합니다.
- 일관성: 다양한 환경에서 유사한 구문 사용
우리 팀은 처음으로 슬롯 무료체험 전송을 대중에게 공개했습니다.2021년 연례 회의를 알립니다. .
슬롯 무료체험 전송의 핵심 요소는 a의 개념입니다.컨테이너18797_19102파이썬그리고매트랩 .
아래에서는 간단한 예를 사용하여 슬롯 무료체험 Transfer API가 Python과 원활하게 통합되는 방법을 보여줍니다. 우리는
- 슬롯 무료체험 전송을 사용하여 GDX 파일에 일부 데이터 쓰기,
- 생성된 GDX 파일을 사용하는 슬롯 무료체험 작업 시작(기존 슬롯 무료체험 Python API 사용),
- 그런 다음 슬롯 무료체험 전송을 사용하여 Python 데이터 프레임으로 결과를 다시 읽고 지도에 데이터를 표시합니다.
여기서 요점은 슬롯 무료체험 전송의 모든 측면을 탐구하는 것이 아니라 시작하는 것이 얼마나 쉬운지를 강조하는 것입니다.
TRANSPORT 모델을 사용한 예
이 간단한 예는 다음을 기반으로 합니다.운송모델 라이브러리의 모델입니다. 예를 들어, 슬롯 무료체험 전송으로 생성할 GDX 파일에서 설정 및 매개변수 데이터를 로드하도록 모델을 수정합니다.
슬롯 무료체험 모델
|
|
이제 Python으로 슬롯 무료체험 전송을 사용해 보겠습니다. 먼저 몇 가지 패키지를 가져와야 합니다. 슬롯 무료체험 전송 자체 외에도 이 예에서는 Pandas 데이터 프레임을 사용합니다. 또한 몇 가지 도우미 함수(get_locations, calculate_distances)는 도시 간 거리를 계산합니다. geo.py 목록은 이 게시물 하단에 포함됩니다.
가져오기 gamstransfer as gt
가져오기 판다 as pd
가져오기 os
from 지역 가져오기get_locations,calculate_distances
working_dir=os.getcwd()모델_이름= "trnsport_gamsxfer_gdx" # 슬롯 무료체험 모델 파일의 이름
생산 공장 도시 목록과 시장 도시 목록에 대한 지리적 위치가 검색됩니다:
식물=['시애틀','샌디에고']시장=['뉴욕','시카고','토페카','덴버']
식물_위치=get_locations(식물)시장_위치=get_locations(시장)식물과 시장 사이의 거리가 계산되어 Pandas 데이터 프레임을 채우는 데 사용됩니다.
거리=pd.데이터프레임(데이터=calculate_distances(plant_locations,market_locations), 열=['로부터', '에', '거리(1000마일)'])거리| from | 에 | 거리(1000마일) | |
|---|---|---|---|
| 0 | 시애틀 | 뉴욕 | 2.408121 |
| 1 | 시애틀 | 시카고 | 1.737659 |
| 2 | 시애틀 | 토피카 | 1.457841 |
| 3 | 시애틀 | 덴버 | 1.021329 |
| 4 | 샌디에고 | 뉴욕 | 2.432916 |
| 5 | 샌디에고 | 시카고 | 1.734903 |
| 6 | 샌디에고 | 토피카 | 1.278299 |
| 7 | 샌디에고 | 덴버 | 0.833715 |
또한 각 공장의 생산 능력(cap)과 각 시장의 수요(dem)를 추가해야 합니다.
캡=pd.데이터프레임([('시애틀',650),('샌디에고',800)], 열=['식물','건수'])캡| 식물 | 건수 | |
|---|---|---|
| 0 | 시애틀 | 650 |
| 1 | 샌디에고 | 800 |
dem=pd.데이터프레임([('뉴욕', 325),('시카고', 300),('토페카', 275),('덴버',400)], 열=['시장','건수'])dem| 시장 | 건수 | |
|---|---|---|
| 0 | 뉴욕 | 325 |
| 1 | 시카고 | 300 |
| 2 | 토피카 | 275 |
| 3 | 덴버 | 400 |
이제 우리는 gamstransfer의 아름다움을 실제로 볼 수 있습니다. gamstransfer "컨테이너"에 세트와 매개변수를 추가합니다.동일한 기호 이름 사용슬롯 무료체험 모델에 존재합니다. 각 기호에 대한 레코드는 위에서 정의한 목록과 데이터프레임을 사용하여 채워집니다. 이 기능을 사용하면 Python에서 gamstransfer 작업이 매우 자연스럽게 느껴집니다(Matlab에도 동일하게 적용됨). 마지막 단계로 컨테이너를 디스크에 GDX 파일로 기록합니다.
m=gt.컨테이너()
i=m.추가세트('나', 기록=식물, 설명= '식물')
j=m.추가세트('j', 기록=시장, 설명= '시장')
a=m.추가매개변수('a', 도메인=나, 기록=캡, 설명= '용량')
b=m.추가매개변수('b', 도메인=j, 기록=dem, 설명= '수요')
d=m.추가매개변수('d', 도메인=[i,j], 기록=거리)f=m.추가매개변수('f', 기록= 90, 설명= '운송 비용 k$/건')
m.쓰기(os.경로.가입(working_dir,'input_data.gdx'))
이제 방금 생성한 GDX 파일을 입력으로 사용하여 슬롯 무료체험 모델을 실행할 수 있습니다. gamstransfer는 순수 데이터 API이므로 모델을 실행하려면 표준 슬롯 무료체험 Python API를 사용해야 합니다. 모델 결과는 다음과 같이 저장됩니다.모델_이름.gdx.
# 슬롯 무료체험 Python API 사용
에서 게임 가져오기 *
# 슬롯 무료체험 작업공간 생성
작업공간=GamsWorkspace(디버그=디버그레벨.자세한 내용, Working_directory=working_dir)
# 모델 실행
직업=작업공간.add_job_from_file(os.경로.join(working_dir,model_name+ '.gms'))
직업.실행()
# GDX 파일 저장
직업.out_db.내보내기(os.경로.join(working_dir,model_name+ '.gdx'))
짧은 슬롯 무료체험 로그 출력은 문제에 대한 최적의 솔루션을 찾았음을 보여줍니다.
[...]
변수 출력 변수의 반복 이중 목표 130.013745 x(샌디에고,덴버)수요(덴버)느슨함 2100.451280 x(시애틀,뉴욕)수요(뉴욕)느슨함 3147.293655 x(샌디에이고,시카고)수요(시카고)느슨함 4178.931551 x(샌디에고,토피카)수요(토피카)느슨함 5178.974961 x(시애틀,시카고)공급(샌디에고)느슨함
--- LP 상태(1): 최적입니다.--- Cplex 시간: 0.01초(디트. 0.01틱)
최적의 솔루션을 찾았습니다목표: 178.974961[...]
이제 출력 데이터가 포함된 GDX 파일을 로드할 수 있습니다:
결과=gt.컨테이너(os.경로.join(working_dir, 모델_이름+ ".gdx"))
우리는 변수에 관심이 있습니다x, 각 생산 공장에서 각 시장으로 배송할 수량이 포함되어 있습니다. 레코드는 pandas 데이터프레임으로 반환되므로 즉시 작업을 시작할 수 있습니다. 우리는 데이터프레임의 "딥 카피(deep copy)"를 사용한다는 점에 주목하세요. 왜냐하면 우리는 구조를 더 아래에서 약간 수정할 것이기 때문입니다. 딥 카피가 없으면 x는 컨테이너 내부 데이터에 대한 '실시간' 참조가 되며 데이터를 수정하면 컨테이너가 무효화됩니다.
x=결과.데이터['x'].기록.복사(깊은=참)
x| 식물 | 시장 | 레벨 | 한계 | 하위 | 상위 | 규모 | |
|---|---|---|---|---|---|---|---|
| 0 | 시애틀 | 뉴욕 | 325.0 | 0.000000 | 0.0 | inf | 1.0 |
| 1 | 시애틀 | 시카고 | 175.0 | 0.000000 | 0.0 | inf | 1.0 |
| 2 | 시애틀 | 토피카 | 0.0 | 0.015911 | 0.0 | inf | 1.0 |
| 3 | 시애틀 | 덴버 | 0.0 | 0.016637 | 0.0 | inf | 1.0 |
| 4 | 샌디에고 | 뉴욕 | 0.0 | 0.002480 | 0.0 | inf | 1.0 |
| 5 | 샌디에고 | 시카고 | 125.0 | 0.000000 | 0.0 | inf | 1.0 |
| 6 | 샌디에고 | 토피카 | 275.0 | 0.000000 | 0.0 | inf | 1.0 |
| 7 | 샌디에고 | 덴버 | 400.0 | 0.000000 | 0.0 | inf | 1.0 |
이름을 바꾸겠습니다i_0그리고j_1열을 좀 더 친근한 것으로 바꾸세요.
x.이름 바꾸기(열={'i_0':'식물','j_1':'시장', 내부=참)
이제 Python에 필요한 모든 데이터가 있습니다. 이제 사용 가능한 다양한 Python 패키지를 사용하여 원하는 방식으로 데이터를 분석할 수 있습니다. 아래에서는 Cartopy를 사용하여 공장과 시장 간에 배송되는 양을 표시하고 선이 굵을수록 운송할 상품의 양이 더 많다는 것을 나타냅니다.
가져오기 matplotlib.pyplot as plt
가져오기 cartopy.crs as ccrs
가져오기 cartopy.feature as cfeature
그림=plt.그림(그림 크기=(15, 10))
도끼=그림.add_subplot(1, 1, 1, 투영=ccrs.로빈슨())도끼.해안선()도끼.set_extent([-125, -66.5, 20, 50], crs=ccrs.측지())도끼.add_feature(cfeature.랜드)도끼.add_feature(cfeature.바다)도끼.add_feature(cfeature.상태)
for색인, 행inx.iterrows():p_loc= 목록(식물_위치[행.식물])m_loc= 목록(시장_위치[행.시장])w=행.레벨/ 50
도끼.플롯([p_loc[1],m_loc[1]],[p_loc[0],m_loc[0]], 변환=ccrs.PlateCarree(), 선폭=w)도끼.플롯(p_loc[1], p_loc[0], 마커='오', 색상='빨간색', 마커 크기=12, 변환=ccrs.플레이트카리())도끼.플롯(m_loc[1], m_loc[0], 마커='오', 색상='빨간색', 마커 크기=12, 변환=ccrs.플레이트카리())도끼.텍스트(p_loc[1]-2, p_loc[0]- 2, 행.식물, 변형=ccrs.측지(),비박스=dict(얼굴색상='샌디브라운', 박스스타일='둥근'))
도끼.텍스트(m_loc[1]+1, m_loc[0]+ 1, 행.시장, 변화=ccrs.측지(),비박스=dict(얼굴색상='#60b0f4', 박스스타일='둥근'))
plt.표시()
아래는 다음의 목록입니다geo.py도시 사이의 거리를 계산하는 도우미 함수가 포함된 모듈.
에서 geopy.geocoders 가져오기후보추천에서 geopy.distance 가져오기측지가져오기 시간
데프 get_locations(도시): '''OpenStreetMap 데이터에서 지리적 위치 검색'''
# 주소를 위치로 확인하기 위해 새 클라이언트 생성
지역=Nominatim(user_agent="gamstransfer_example")
위치={} for도시에도시:시간.수면(1) # 서버에 대한 요청 수 제한
loc=지역.지오코드(도시)위치[도시]=(loc.위도, 위치.경도)
반환위치
def calculate_distances(출처,목적지): ''' 모든 도시 쌍의 거리를 계산하세요'''
거리=[] for소스,sourceLocin출처.항목(): for대상, 대상Locin목적지.항목():거리.추가((소스,대상,0.001 *측지선((sourceLoc[0],sourceLoc[1]),(destLoc[0],destLoc[1])).마일)) 반환거리