람다 프로그래밍 – 람다에서 트윗하기

24201 단어 pythongithublambdaaws

⚠️ 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 파일을 읽는다. 그런 다음 모양을 만들고 그 위에 축을 그립니다. plotGeoDataFrame 방법을 사용하여 지도를 그립니다. 우리는 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이고 자전거 네트워크 상태를 트윗하는 계정은 입니다.

    좋은 웹페이지 즐겨찾기