Folium — пример изображения времени работы мировых бирж

Всем привет!


Для работы нам потребуется Jupyter Notebook, библиотеки Folium, Pandas и хорошее настроение.


Мануал для новобранцев по библиотеке Folium смотрим здесь.


Данные мы возьмем с сайта. Я воспользовался Википедией и нашел координаты всех городов.


# http://stocktime.ru/info.htm
import pandas as pd

df = pd.DataFrame({"lines":"""
New Zealand Exchange - NZX
ВЕЛЛИНГТОН  10:00 - 16:45   UTC +12     UTC +13     
Australian Securities Exchange - ASX
СИДНЕЙ  10:00 - 16:00   UTC +10     UTC +11     
Japan Exchange Group - JPX
ТОКИО   09:00 - 15:00   UTC +9  -   
Singapore Exchange - SGX
СИНГАПУР    09:00 - 17:00   UTC +8  -   
Hong Kong - HKEX
Гонконг     09:30 - 16:00   UTC +8  -   
Shanghai Stock Exchange - SSE
ШАНХАЙ  09:30 - 15:00   UTC +8  -   
National Stock Exchange of India - NSE
Мумбай  09:15 - 15:30   UTC +5:30   -   
Moscow Exchange - MOEX
МОСКВА  09:30 - 19:00   UTC +3  -   
Dubai Financial Market’s - DFM
ДУБАЙ   10:00 - 14:00   UTC +4  -   
Saudi Stock Exchange - Tadawul
ЭР-РИЯД     10:00 - 15:00   UTC +3  -   
Johannesburg Stock Exchange - JSE
ЙОХАННЕСБУРГ    09:00 - 17:00   UTC +2  -   
Frankfurt Stock Exchange - FWB
ФРАНКФУРТ   09:00 - 17:30   UTC +1  UTC +2  
Swiss Exchange - SIX
ЦЮРИХ   09:00 - 17:30   UTC +1  UTC +2  
London Stock Exchange - LSE
ЛОНДОН  08:00 - 16:30   UTC 0   UTC +1  
BM&FBOVESPA
САН-ПАУЛУ Бразилия  10:00 - 17:20   UTC -3  UTC -2  
New York Stock Exchange - NYSE
НЬЮ-ЙОРК    09:30 - 16:00   UTC -5  UTC -4  
Toronto Stock Exchange - TSX
ТОРОНТО     09:30 - 16:00   UTC -5  UTC -4  
Chicago Stock Exchange - CHX
ЧИКАГО  08:30 - 15:00   UTC -6  UTC -5  """.split("\t\n")})
df.reindex()
df["id"] = df.index
df["фондовая биржа"] = df["lines"].apply(lambda s: s.split('\t')[0].replace("\n", " "))
df["время торговой сессии"] = df["lines"].apply(lambda s: s.split('\t')[1].replace("\n", " ") if len(s.split('\t')) > 1 else "")
df["часовой пояс"] = df["lines"].apply(lambda s: s.split('\t')[2].replace("\n", " ") if len(s.split('\t')) > 2 else "")
df["при переходе на летнее время"] = df["lines"].apply(lambda s: s.split('\t')[3].replace("\n", " ") if len(s.split('\t')) > 3 else "")
df["в данный момент действует время"] = df["lines"].apply(lambda s: s.split('\t')[4].replace("\n", " ") if len(s.split('\t')) > 4 else "")
m = {0: (-41.1720,174.4638) # Веллингтон
    ,1: (-33.5210,151.1230) # Сидней
    ,2: (35.41,139.41) # Токио
    ,3: (1.17,103.50) # Сингапур
    ,4: (22.3,114.2) # Гонг Конг
    ,5: (31.2014,121.1313) # Шан Хай
    ,6: (18.58,72.50) # Мумбаи
    ,7: (55.4521, 37.3704) # Москва
    ,8: (25.1611, 55.1834) # Дубаи
    ,9: (24.3900, 46.4236) # Эр-рияд
    ,10: (-26.0842, 28.0301) # ЙОХАННЕСБУРГ
    ,11: (50.0649, 8.4047) # Франкфурт
    ,12: (47.2230, 8.3230) # ЦЮРИХ
    ,13: (51.3026, -0.0739) # ЛОНДОН
    ,14: (-23.30, -46.37) # САН-ПАУЛУ
    ,15: (40.4342, -73.5939) # НЬЮ ЙОРК
    ,16: (43.3855, -79.2307) # ТОРОНТО
    ,17: (41.54, -87.39)} # ЧИКАГО
df["lat"] = df["id"].apply(lambda i: m[i][0] if i >= 0 else 56.0)
df["lon"] = df["id"].apply(lambda i: m[i][1] if i >= 0 else 37.0)

print(len(df))
display(df)

lines id фондовая биржа время торговой сессии часовой пояс при переходе на летнее время в данный момент действует время lat lon 0 \nNew Zealand Exchange - NZX\nВЕЛЛИНГТОН \t10:... 0 New Zealand Exchange - NZX ВЕЛЛИНГТОН 10:00 - 16:45 UTC +12 UTC +13 -41.1720 174.4638 1 Australian Securities Exchange - ASX\nСИДНЕЙ \... 1 Australian Securities Exchange - ASX СИДНЕЙ 10:00 - 16:00 UTC +10 UTC +11 -33.5210 151.1230 2 Japan Exchange Group - JPX\nТОКИО \t09:00 - 15... 2 Japan Exchange Group - JPX ТОКИО 09:00 - 15:00 UTC +9 - 35.4100 139.4100 3 Singapore Exchange - SGX\nСИНГАПУР \t09:00 - 1... 3 Singapore Exchange - SGX СИНГАПУР 09:00 - 17:00 UTC +8 - 1.1700 103.5000 4 Hong Kong - HKEX\nГонконг \t09:30 - 16:00 \tUT... 4 Hong Kong - HKEX Гонконг 09:30 - 16:00 UTC +8 - 22.3000 114.2000 5 Shanghai Stock Exchange - SSE\nШАНХАЙ \t09:30 ... 5 Shanghai Stock Exchange - SSE ШАНХАЙ 09:30 - 15:00 UTC +8 - 31.2014 121.1313 6 National Stock Exchange of India - NSE\nМумбай... 6 National Stock Exchange of India - NSE Мумбай 09:15 - 15:30 UTC +5:30 - 18.5800 72.5000 7 Moscow Exchange - MOEX\nМОСКВА \t09:30 - 19:00... 7 Moscow Exchange - MOEX МОСКВА 09:30 - 19:00 UTC +3 - 55.4521 37.3704 8 Dubai Financial Market’s - DFM\nДУБАЙ \t10:00 ... 8 Dubai Financial Market’s - DFM ДУБАЙ 10:00 - 14:00 UTC +4 - 25.1611 55.1834 9 Saudi Stock Exchange - Tadawul\nЭР-РИЯД \t10:0... 9 Saudi Stock Exchange - Tadawul ЭР-РИЯД 10:00 - 15:00 UTC +3 - 24.3900 46.4236 10 Johannesburg Stock Exchange - JSE\nЙОХАННЕСБУР... 10 Johannesburg Stock Exchange - JSE ЙОХАННЕСБУРГ 09:00 - 17:00 UTC +2 - -26.0842 28.0301 11 Frankfurt Stock Exchange - FWB\nФРАНКФУРТ \t09... 11 Frankfurt Stock Exchange - FWB ФРАНКФУРТ 09:00 - 17:30 UTC +1 UTC +2 50.0649 8.4047 12 Swiss Exchange - SIX\nЦЮРИХ \t09:00 - 17:30 \t... 12 Swiss Exchange - SIX ЦЮРИХ 09:00 - 17:30 UTC +1 UTC +2 47.2230 8.3230 13 London Stock Exchange - LSE\nЛОНДОН \t08:00 - ... 13 London Stock Exchange - LSE ЛОНДОН 08:00 - 16:30 UTC 0 UTC +1 51.3026 -0.0739 14 BM&FBOVESPA\nСАН-ПАУЛУ Бразилия \t10:00 - 17:2... 14 BM&FBOVESPA САН-ПАУЛУ Бразилия 10:00 - 17:20 UTC -3 UTC -2 -23.3000 -46.3700 15 New York Stock Exchange - NYSE\nНЬЮ-ЙОРК \t09:... 15 New York Stock Exchange - NYSE НЬЮ-ЙОРК 09:30 - 16:00 UTC -5 UTC -4 40.4342 -73.5939 16 Toronto Stock Exchange - TSX\nТОРОНТО \t09:30 ... 16 Toronto Stock Exchange - TSX ТОРОНТО 09:30 - 16:00 UTC -5 UTC -4 43.3855 -79.2307 17 Chicago Stock Exchange - CHX\nЧИКАГО \t08:30 -... 17 Chicago Stock Exchange - CHX ЧИКАГО 08:30 - 15:00 UTC -6 UTC -5 41.5400 -87.3900


Взял московское время с шагом по 20 минут и нарисовал биржи зеленым, желтым, красным и синим в соответствии с тем сколько времени прошло с открытия: ноль, четверть, две четверти или три.


#README http://python-visualization.github.io/folium/docs-v0.5.0/quickstart.html#Markers

import folium

m = folium.Map(location=[55.5236, 37.6750],tiles='Mapbox Bright',zoom_start=1)
for k in range(0, len(df)):
    color='green'
    folium.Marker(location=[df.at[k,"lat"], df.at[k,"lon"]]
        ,popup=df.at[k,"фондовая биржа"],icon=folium.Icon(color=color)).add_to(m)
m.save("C:\\code\\_.htm")
display(m)

for i in range(0, 24):
    for j in range(0, 3):
        print("%02d:%02d"%(i,j*20))
        utc_hh = (i - 3) % 24
        utc_mm = j * 20
        m = folium.Map(location=[55.5236, 37.6750],tiles='Mapbox Bright',zoom_start=1)
        for k in range(0, len(df)):
            delta_hh = int(df.at[k,"часовой пояс"].split(" ")[1].replace(":30",""))
            delta_mm = 0
            cur_hh = (utc_hh + delta_hh) % 24
            cur_mm = (utc_mm + delta_mm) % 60
            min_hh = int(df.at[k,"время торговой сессии"].split("-")[0].split(":")[0])
            min_mm = int(df.at[k,"время торговой сессии"].split("-")[0].split(":")[1])
            max_hh = int(df.at[k,"время торговой сессии"].split("-")[1].split(":")[0])
            max_mm = int(df.at[k,"время торговой сессии"].split("-")[1].split(":")[1])
            step_mm = (max_hh - min_hh) * 15
            if cur_hh*60+cur_mm >= min_hh*60+min_mm and cur_hh*60+cur_mm < max_hh*60+max_mm:
                color='green'
                if cur_hh*60+cur_mm >= min_hh*60+min_mm+step_mm and cur_hh*60+cur_mm < min_hh*60+min_mm+step_mm*2:
                    color='orange'
                if cur_hh*60+cur_mm >= min_hh*60+min_mm+step_mm*2 and cur_hh*60+cur_mm < min_hh*60+min_mm+step_mm*3:
                    color='red'
                if cur_hh*60+cur_mm >= min_hh*60+min_mm+step_mm*3 and cur_hh*60+cur_mm < min_hh*60+min_mm+step_mm*4:
                    color='blue'
                folium.Marker(location=[df.at[k,"lat"], df.at[k,"lon"]]
                          ,popup=df.at[k,"фондовая биржа"]+df.at[k,"время торговой сессии"]+df.at[k,"часовой пояс"]
                          ,icon=folium.Icon(color=color)).add_to(m)
        m.save("C:\\code\\%02d_%02d.htm"%(i,j*20))
        display(m)

Получилась интересная картина.


Много картинок










































































Очень рекомендую вам не полениться, установить себе Anaconda и тоже попробовать.


Успехов вам!

Теги:
folium,pandas,python3

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.