람다 프로그래밍 – 람다에서 트윗하기
⚠️ I like to use Pipenv to manage dependencies and virtual environments for Python applications – you can use any other dependency manager that suits you best.
내가 사용할 라이브러리는 다음과 같습니다.
정보 얻기
가장 먼저 해야 할 일은 런던 자전거 정류장의 정보를 다운로드하는 것입니다. 이를 위해 TFL API를 쿼리하기 위해 제가 직접 만든 라이브러리(나중에 알려드릴 수 있음)를 사용하고 별도의 정보를 모듈화할 수 있는 파일.
mind-the-gap
로 할 수 있는 방법은 다음과 같습니다.from tfl.api import bike_point
all_bike_points = bike_point.all()
# Now we can take a single element and verify its content
place = all_bike_points[0]
print(f"{place.commonName} (LAT: {place.lat}, LON: {place.lon})")
# out: Vicarage Gate, Kensington (LAT: 51.504723, LON: -0.192538)
또한 장소와 같은 각 요소에는 사용 가능한 도크 수, 사용 중인 도크 수, 사용 가능한 자전거 수와 같은 정보를 추출할 수 있는 추가 속성 또는
AdditionalProperties
세트가 포함되어 있습니다. 이 추가 정보를 추출하기 위해 이 도우미 함수를 만들었습니다.def get_number(additional_properties: List[AdditionalProperties], key: str) -> int:
[nb] = [prop.value for prop in additional_properties if prop.key == key]
return int(nb)
# Then we can use it as:
bikes = get_number(place.additionalProperties, "NbBikes")
empty_docks = get_number(place.additionalProperties, "NbEmptyDocks")
docks = get_number(place.additionalProperties, "NbDocks")
print(f"{place.commonName} tiene {bikes} bicicletas disponibles y {docks} docks en total")
# out: Vicarage Gate, Kensington tiene 3 bicicletas disponibles y 18 docks en total
그런 다음 for 주기를 사용하여 데이터 프레임을 만들 수 있습니다.
def download_cycles_info() -> pd.DataFrame:
all_bike_points = bike_point.all()
query_time = datetime.now()
data = []
for place in all_bike_points:
bikes = get_number(place.additionalProperties,"NbBikes")
empty_docks = get_number(place.additionalProperties,"NbEmptyDocks")
docks = get_number(place.additionalProperties,"NbDocks")
data.append(
(
place.id, place.commonName,
place.lat, place.lon,
bikes, empty_docks, docks,
)
)
data_df = pd.DataFrame(
data, columns=["id","name","lat","lon","bikes","empty_docks","docks"]
).set_index("id")
data_df["query_time"] = pd.to_datetime(query_time).floor("Min")
data_df["proportion"] = (data_df["docks"] - data_df["empty_docks"]) / data_df["docks"]
return data_df
bike_info_data_frame = download_cycles_info()
bike_info_data_frame.head()
| id | name | lat | lon | bikes | empty_docks | docks | query_time | proportion |
|:---------------|:--------------------------|--------:|----------:|--------:|--------------:|--------:|:--------------------|-------------:|
| BikePoints_103 | Vicarage Gate, Kensingt | 51.5047 | -0.192538 | 1 | 17 | 18 | 2022-01-28 16:18:00 | 0.0555556 |
| BikePoints_105 | Westbourne Grove, Baysw | 51.5155 | -0.19024 | 14 | 11 | 26 | 2022-01-28 16:18:00 | 0.576923 |
| BikePoints_106 | Woodstock Street, Mayfa | 51.5141 | -0.147301 | 13 | 8 | 21 | 2022-01-28 16:18:00 | 0.619048 |
| BikePoints_107 | Finsbury Leisure Centre's | 51.526 | -0.096317 | 8 | 12 | 20 | 2022-01-28 16:18:00 | 0.4 |
| BikePoints_108 | Abbey Orchard Street, W | 51.4981 | -0.132102 | 21 | 8 | 29 | 2022-01-28 16:18:00 | 0.724138 |
이 두 함수를 이름이 지정된 파일에 배치했습니다.
Yo he puesto estas dos funciones en un archivo llamado download.py en la raíz de mi repositorio; más adelante lo usaré.
정보 플로팅
런던에는 약 750개의 자전거 스테이션이 있습니다. 이 정보를 가능한 한 쉽게 이용할 수 있도록 하고 싶기 때문에 각 스테이션의 점유를 보여주는 이미지를 통해 이를 수행하는 가장 좋은 방법이라는 생각이 들었습니다.
지도 받기
시작하기 전에 컴퓨터가 해석할 수 있는 형식의 런던 지도가 필요하고 시 정부 웹사이트에서 프로그래밍 방식으로 다운로드할 수도 있는 지도를 방금 찾았습니다. 내 인생을 더 쉽게 만들기 위해 필요한 파일을 다운로드하고 이동하는
shapefiles
라는 작업으로 Makefile을 만들었습니다.shapefiles:
wget https://data.london.gov.uk/download/statistical-gis-boundary-files-london/9ba8c833-6370-4b11-abdc-314aa020d5e0/statistical-gis-boundaries-london.zip
unzip statistical-gis-boundaries-london.zip
mv statistical-gis-boundaries-london/ESRI shapefiles/
rm -rf statistical-gis-boundaries-london statistical-gis-boundaries-london.zip
그러면 내용이 다음과 같은 shapefiles라는 폴더가 남게 됩니다.
shapefiles
├── London_Borough_Excluding_MHW.GSS_CODE.atx
├── London_Borough_Excluding_MHW.NAME.atx
├── London_Borough_Excluding_MHW.dbf
├── London_Borough_Excluding_MHW.prj
├── London_Borough_Excluding_MHW.sbn
├── London_Borough_Excluding_MHW.sbx
├── London_Borough_Excluding_MHW.shp
├── London_Borough_Excluding_MHW.shp.xml
└── London_Borough_Excluding_MHW.shx
지도 그리기
이 기능은 다소 간단합니다. 지도를 만든 방법에 대해 자세히 설명하는 후속 게시물이 있습니다. 당분간은 코드를 게시하고 진행 상황에 대해 일반적으로 이야기하겠습니다.
def plot_map(cycles_info: pd.DataFrame) -> str:
london_map = gpd.read_file("shapefiles/London_Borough_Excluding_MHW.shp").to_crs(epsg=4326)
fig = plt.figure(figsize=(6, 4), dpi=170)
ax = fig.gca()
london_map.plot(ax=ax)
sns.scatter(y="lat", x="lon", hue="proportion", palette="Blues", data=cycles_info, s=25, ax=ax)
prepare_axes(ax, cycles_info)
map_file = save_fig(fig)
return map_file
먼저 사용할 맵의 .shp 파일을 읽는다. 그런 다음 모양을 만들고 그 위에 축을 그립니다.
plot
의 GeoDataFrame
방법을 사용하여 지도를 그립니다. 우리는 seaborn을 사용하여 스테이션을 지도에 표시합니다. 각 포인트에 대해 위치( lat
, lon
)를 지정하고 각 포인트의 색상은 열proportion
에 의해 정의되고 마지막으로 각각의 크기는 25입니다. 완료하려면 축을 약간 조정하고 그림을 임시 주소에만 저장하여 생성된 이미지가 저장된 경로를 반환합니다.이 함수를 plot.py라는 별도의 파일에 저장했습니다.
정보 트윗하기
이미 이미지가 있으므로 Twython을 사용하여 트윗할 시간입니다. 지금은 이전 게시물에서 Twitter에서 얻은 몇 가지 비밀이 필요합니다. 이러한 비밀을 사용하여 Twython 클라이언트를 생성해 보겠습니다.
app_key = os.environ["API_KEY"]
app_secret = os.environ["API_SECRET"]
oauth_token = os.environ["ACCESS_TOKEN"]
oauth_token_secret = os.environ["ACCESS_TOKEN_SECRET"]
twitter = Twython(app_key, app_secret, oauth_token, oauth_token_secret)
Twitter API가 작동하는 방식은 먼저 이미지를 서비스에 업로드한 다음 트윗해야 합니다. 둘 다 새로 생성된 변수
twitter
를 사용할 것입니다. 영상:with open(image_path, "rb") as cycles_png:
image = twitter.upload_media(media=cycles_png)
now = datetime.now().strftime("%m/%d/%Y, %H:%M")
twitter.update_status(
status=f'London Cycles update at {now}',
media_ids=[image['media_id']]
)
코드를 모듈화하기 위해 이 코드를 함수 안에 넣고 이 함수를 고유한 tweeter.py 파일에 넣었습니다.
결론
우리는 이미 모든 것을 갖추고 있으므로 이제 정보를 다운로드하고 지도를 생성하고 트윗하는 단일 스크립트로 모든 기능을 결합하여 이를 달성할 수 있습니다.
from download import download_cycles_info
from plot import plot_map
from tweeter import tweet
def execute():
information = download_cycles_info()
map_image = plot_map(information)
tweet(map_image)
이 코드를 app.py라는 파일에 저장했습니다. 그리고 이것은 이 게시물의 끝에서 how it looks like입니다.
뭔가 명확하지 않거나 오타를 발견한 경우 Twitter에서 저를 찾아 이 게시물에 대해 질문할 수 있습니다. 이 시리즈의 최종 코드는 GitHub이고 자전거 네트워크 상태를 트윗하는 계정은 입니다.
Reference
이 문제에 관하여(람다 프로그래밍 – 람다에서 트윗하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/feregri_no/programming-the-lambda-tweeting-from-a-lambda-3d7h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)