added weather api caller

This commit is contained in:
Neythen 2021-06-02 21:16:15 +01:00
parent aeda550210
commit a1dd720093
10 changed files with 204 additions and 54 deletions

View File

@ -176,9 +176,6 @@ def updateStockPricesIEX(symbols):
CSV.write(symbol + ',' + str(current_prices[i]) + ',' + str(opening_prices[i]) + '\n') CSV.write(symbol + ',' + str(current_prices[i]) + ',' + str(opening_prices[i]) + '\n')
CSV.close() CSV.close()
def updateCrypto(coins, coin_info, unique_bases): def updateCrypto(coins, coin_info, unique_bases):
response = coingecko_client.get_price(ids=','.join(coins), vs_currencies = unique_bases, include_24hr_change=True) response = coingecko_client.get_price(ids=','.join(coins), vs_currencies = unique_bases, include_24hr_change=True)
@ -222,7 +219,49 @@ def updateNews():
CSV.close() CSV.close()
def updateWeather(location, api_key):
url = "https://api.openweathermap.org/data/2.5/weather?q={}&units=metric&appid={}".format(location, api_key)
r = requests.get(url)
weather = r.json()
current_weather = {}
coords = weather['coord']
lat = coords['lat']
lon = coords['lon']
url = 'https://api.openweathermap.org/data/2.5/onecall?lat={}&units=metric&lon={}&appid={}'.format(lat, lon, api_key)
r = requests.get(url)
current_weather['main_weather'] = weather['weather'][0]['main']
current_weather['description'] = weather['weather'][0]['description']
current_weather['temp'] = weather['main']['temp']
current_weather['min_temp'] = weather['main']['temp_min']
current_weather['max_temp'] = weather['main']['temp_max']
current_weather['feels_like'] = weather['main']['feels_like']
current_weather['humidity'] = weather['main']['humidity']
current_weather['clouds'] = weather['clouds']['all']
current_weather['wind_speed'] = weather['wind']['speed']
current_weather['wind_direction'] = weather['wind']['deg']
current_weather['visibility'] = weather['visibility']
current_weather['uv'] = r.json()['current']['uvi']
json.dump( current_weather, open( "csv/current_weather.json", 'w+' ))
daily_weather = []
daily = r.json()['daily']
for day in daily:
dct = {}
dct['main_weather'] = day['weather'][0]['main']
dct['description'] = day['weather'][0]['description']
dct['min_temp'] = day['temp']['min']
dct['min_temp'] = day['temp']['max']
daily_weather.append(dct)
json.dump( daily_weather, open( "csv/daily_weather.json", 'w+' ))
if __name__ == '__main__': if __name__ == '__main__':
newsapi = NewsApiClient(api_key='cf08652bd17647b89aaf469a1a8198a9') newsapi = NewsApiClient(api_key='cf08652bd17647b89aaf469a1a8198a9')
@ -230,7 +269,11 @@ if __name__ == '__main__':
finnhubAPIkey = "c24qddqad3ickpckgg80" #Finnhub finnhubAPIkey = "c24qddqad3ickpckgg80" #Finnhub
finnhubsandboxAPIkey = "sandbox_c24qddqad3ickpckgg8g" #Finnhub finnhubsandboxAPIkey = "sandbox_c24qddqad3ickpckgg8g" #Finnhub
sleeptime = 2 #minutes stock_time = 2 #minutes
news_time = 30 #minutes
weather_time = 10 #minutes
# TODO: different update times for stocks, weather and news
finnhubClient = finnhub.Client(api_key=finnhubAPIkey) finnhubClient = finnhub.Client(api_key=finnhubAPIkey)
max_stocks = 200 max_stocks = 200
@ -238,12 +281,9 @@ if __name__ == '__main__':
iexSandboxAPIkey = 'Tpk_0078dff413ef4f979137f7111452dc4b' iexSandboxAPIkey = 'Tpk_0078dff413ef4f979137f7111452dc4b'
#updateStockPricesIEX(symbols) #updateStockPricesIEX(symbols)
finnhubClient = finnhub.Client(api_key=finnhubAPIkey) finnhubClient = finnhub.Client(api_key=finnhubAPIkey)
coingecko_client = CoinGeckoAPI() coingecko_client = CoinGeckoAPI()
NY_zone = pytz.timezone('America/New_York') NY_zone = pytz.timezone('America/New_York')
@ -258,6 +298,10 @@ if __name__ == '__main__':
updateStockPrices(symbols) updateStockPrices(symbols)
updateUpdate(NY_time) updateUpdate(NY_time)
coins, coin_info, unique_bases = readCryptoCSV('csv/crypto.csv', max_stocks) coins, coin_info, unique_bases = readCryptoCSV('csv/crypto.csv', max_stocks)
weather_location, weather_key = 'London', 'bd5d5096a5ba30bbcfb57ead42ab3fee'
updateWeather(weather_location, weather_key)
updateCrypto(coins, coin_info, unique_bases) updateCrypto(coins, coin_info, unique_bases)
@ -271,7 +315,7 @@ if __name__ == '__main__':
while True: while True:
msg = getInput() msg = getInput()
if msg == 'R' or time.time() - t > sleeptime*60: if msg == 'R' or time.time() - t > stock_time*60:
@ -281,6 +325,7 @@ if __name__ == '__main__':
updateCrypto(coins, coin_info, unique_bases) updateCrypto(coins, coin_info, unique_bases)
updateNews() updateNews()
updateWeather(weather_location, weather_key)
NY_time = datetime.now(NY_zone) NY_time = datetime.now(NY_zone)
symbols, stock_info = readCSV('csv/tickers.csv', max_stocks) symbols, stock_info = readCSV('csv/tickers.csv', max_stocks)

View File

@ -1,3 +1,3 @@
symbol,name,base,current,24hr change symbol,name,base,current,24hr change
BTC,bitcoin,usd,38140,5.220972287309966 BTC,bitcoin,usd,37943,5.398882470458167
ETH,ethereum,gbp,1966.44,8.603614342494295 ETH,ethereum,gbp,1950.25,8.111712194442813

1 symbol name base current 24hr change
2 BTC bitcoin usd 38140 37943 5.220972287309966 5.398882470458167
3 ETH ethereum gbp 1966.44 1950.25 8.603614342494295 8.111712194442813

1
csv/current_weather.json Normal file
View File

@ -0,0 +1 @@
{"main_weather": "Clouds", "description": "overcast clouds", "temp": 19.95, "min_temp": 17.32, "max_temp": 21.2, "feels_like": 19.54, "humidity": 59, "clouds": 96, "wind_speed": 1.31, "wind_direction": 113, "visibility": 10000, "uv": 0}

1
csv/daily_weather.json Normal file
View File

@ -0,0 +1 @@
[{"main_weather": "Rain", "description": "light rain", "min_temp": 27.04}, {"main_weather": "Clouds", "description": "scattered clouds", "min_temp": 24.89}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 16.33}, {"main_weather": "Clear", "description": "clear sky", "min_temp": 22.03}, {"main_weather": "Rain", "description": "light rain", "min_temp": 21.89}, {"main_weather": "Rain", "description": "light rain", "min_temp": 24.13}, {"main_weather": "Rain", "description": "light rain", "min_temp": 25.2}, {"main_weather": "Rain", "description": "light rain", "min_temp": 25.55}]

View File

@ -1 +1 @@
02/06/2021 11:35:50 02/06/2021 16:08:56

1 02/06/2021 11:35:50 02/06/2021 16:08:56

View File

@ -1,21 +1,21 @@
headline,source,date,time headline,source,date,time
First human case of H10N3 bird flu in China: These are the symptoms - MARCA.com,Marca,2021-06-02,14:25:39Z LKL finalo serijos starte užtikrinta „Žalgirio“ pergalė - Lrytas.lt,Lrytas.lt,2021-06-02,18:41:12Z
Canadarm2 damaged by lucky strike from space junk in orbit - Global News,Global News,2021-06-02,14:21:44Z Israeli Opposition Races Against Deadline to Oust Netanyahu: Live Updates - The New York Times,New York Times,2021-06-02,18:36:55Z
Coronavirus latest news: Matt Hancock warns vaccine fake news is a deadly threat - Telegraph.co.uk,Telegraph.co.uk,2021-06-02,14:20:59Z Help with roads^ rivers and rubble a priority as farmers take stock of flood devastation - Stuff.co.nz,Stuff.co.nz,2021-06-02,18:23:00Z
Space Debris Damages Robotic Arm Attached to the International Space Station - PCMag AU,PCMag.com,2021-06-02,14:09:11Z ICFO: Spain overtakes China in one of the biggest quantum communication problems | Science - Sunday Vision,Sundayvision.co.ug,2021-06-02,18:15:04Z
Big TSX companies tripled number of Black board members in past year — but there are still only 26 - CBC.ca,CBC News,2021-06-02,14:05:55Z Joel Embiid (knee) will not play in Game 5 - NBA.com,Heat.com,2021-06-02,18:00:00Z
Huawei officially launches Android alternative HarmonyOS for smartphones - Yahoo Finance Australia,Yahoo Entertainment,2021-06-02,14:05:17Z Elephant herd razes 500-kilometer path of destruction after escape from China nature reserve - CNN ,CNN,2021-06-02,17:58:00Z
Space junk slams into International Space Station^ leaving hole in robotic arm - CBS News,CBS News,2021-06-02,14:03:59Z President Biden News: Live Updates - The New York Times,New York Times,2021-06-02,17:57:48Z
COVID-19: Three-quarters of adults in UK have now had first vaccine dose - Sky News,Sky.com,2021-06-02,14:03:45Z Lack of papal apology for Canada indigenous schools abuses 'shameful' - minister - GMA News,GMA News,2021-06-02,17:45:42Z
Dalian Atkinson: PC's fear 'through the roof' during arrest - BBC News,BBC News,2021-06-02,14:02:38Z No Time To Die Singer Billie Eilish Rocks Blonde Locks In Lost Cause Video - CinemaBlend,CinemaBlend,2021-06-02,17:45:39Z
Dow Jones Today Targets 5th Advance As Stocks Inch Up; DXC Upgraded; BorgWarner Nails Hyundai EV Deal - Investor's Business Daily,Investor's Business Daily,2021-06-02,14:00:00Z Jaguar F-Type available only with V8 engine for 2022 - Driving,Driving,2021-06-02,17:42:02Z
Ford^ Lecce expected to make announcement about Ontario school reopening plan - CBC.ca,CBC News,2021-06-02,13:52:35Z Premier Doug Ford announces no in-class learning until September - Toronto Star,Toronto Star,2021-06-02,17:37:30Z
Huawei MatePad Pro 12.6 in for review - GSMArena.com news - GSMArena.com,GSMArena.com,2021-06-02,13:52:01Z Cricket: Devon Conway shines on debut as Black Caps dominate day one of first test against England at Lord's - New Zealand Herald,New Zealand Herald,2021-06-02,17:35:00Z
Everton set to begin talks with Nuno Espirito Santo over vacant manager role - Sky Sports,Sky Sports,2021-06-02,13:42:25Z Atmospheric metal layers appear with surprising regularity - Science Daily,Science Daily,2021-06-02,17:31:46Z
2021's first solar eclipse will show off a 'ring of fire' in the sky - CNET,CNET,2021-06-02,13:36:57Z Kevin Lunney attackers broke his leg and scored chest with blade^ court hears - The Irish Times,The Irish Times,2021-06-02,17:30:53Z
Asus ROG Strix G17^ ROG Strix G15 Advantage Edition Gaming Laptops With AMD Radeon RX 6800M GPU Announced - Gadgets 360,NDTV News,2021-06-02,13:21:30Z US wields $2bn tariff threat against 6 nations over digital taxes - Financial Times,Financial Times,2021-06-02,17:25:24Z
Venus Williams has perfect response to Naomi Osaka French Open drama - New York Post ,New York Post,2021-06-02,13:18:00Z Duke Blue Devils basketball coach Mike Krzyzewski plans to retire after season^ sources say - ESPN,ESPN,2021-06-02,17:24:40Z
Australia's Victoria extends Melbourne COVID-19 lockdown for 2nd week - Reuters,Reuters,2021-06-02,13:18:00Z Do not politick with land^ Malema warns Ramaphosa as he cranks up pressure on ANC over amendment - News24,News24,2021-06-02,17:24:10Z
Nets make quick work of short-handed Celtics in first round of playoffs^ but much tougher test awaits in Bucks - CBS Sports,CBS Sports,2021-06-02,13:09:00Z AMC frenzy triggers trading halts as stock surges 100 percent - NBC News,NBC News,2021-06-02,17:23:00Z
First Solar Eclipse of the year 2021: will be visible only from Arunachal Pradesh in India - Arunachal24,Arunachal24.in,2021-06-02,13:08:44Z Facebook doubles down on business tools with WhatsApp API updates^ Login Connect for Messenger and more - TechCrunch,TechCrunch,2021-06-02,17:21:52Z
CDPR Wont Reveal Cyberpunk 2077 Q1 Sales^ But Estimates Are Shockingly Low - Forbes,Forbes,2021-06-02,13:05:30Z BJP leader Rakesh Pandit shot dead by terrorists outside his home in Kashmir - Moneycontrol.com,Moneycontrol,2021-06-02,17:19:38Z

1 headline source date time
2 First human case of H10N3 bird flu in China: These are the symptoms - MARCA.com LKL finalo serijos starte – užtikrinta „Žalgirio“ pergalė - Lrytas.lt Marca Lrytas.lt 2021-06-02 14:25:39Z 18:41:12Z
3 Canadarm2 damaged by ‘lucky strike’ from space junk in orbit - Global News Israeli Opposition Races Against Deadline to Oust Netanyahu: Live Updates - The New York Times Global News New York Times 2021-06-02 14:21:44Z 18:36:55Z
4 Coronavirus latest news: Matt Hancock warns vaccine fake news is a ‘deadly threat’ - Telegraph.co.uk Help with roads^ rivers and rubble a priority as farmers take stock of flood devastation - Stuff.co.nz Telegraph.co.uk Stuff.co.nz 2021-06-02 14:20:59Z 18:23:00Z
5 Space Debris Damages Robotic Arm Attached to the International Space Station - PCMag AU ICFO: Spain overtakes China in one of the biggest quantum communication problems | Science - Sunday Vision PCMag.com Sundayvision.co.ug 2021-06-02 14:09:11Z 18:15:04Z
6 Big TSX companies tripled number of Black board members in past year — but there are still only 26 - CBC.ca Joel Embiid (knee) will not play in Game 5 - NBA.com CBC News Heat.com 2021-06-02 14:05:55Z 18:00:00Z
7 Huawei officially launches Android alternative HarmonyOS for smartphones - Yahoo Finance Australia Elephant herd razes 500-kilometer path of destruction after escape from China nature reserve - CNN Yahoo Entertainment CNN 2021-06-02 14:05:17Z 17:58:00Z
8 Space junk slams into International Space Station^ leaving hole in robotic arm - CBS News President Biden News: Live Updates - The New York Times CBS News New York Times 2021-06-02 14:03:59Z 17:57:48Z
9 COVID-19: Three-quarters of adults in UK have now had first vaccine dose - Sky News Lack of papal apology for Canada indigenous schools abuses 'shameful' - minister - GMA News Sky.com GMA News 2021-06-02 14:03:45Z 17:45:42Z
10 Dalian Atkinson: PC's fear 'through the roof' during arrest - BBC News No Time To Die Singer Billie Eilish Rocks Blonde Locks In Lost Cause Video - CinemaBlend BBC News CinemaBlend 2021-06-02 14:02:38Z 17:45:39Z
11 Dow Jones Today Targets 5th Advance As Stocks Inch Up; DXC Upgraded; BorgWarner Nails Hyundai EV Deal - Investor's Business Daily Jaguar F-Type available only with V8 engine for 2022 - Driving Investor's Business Daily Driving 2021-06-02 14:00:00Z 17:42:02Z
12 Ford^ Lecce expected to make announcement about Ontario school reopening plan - CBC.ca Premier Doug Ford announces no in-class learning until September - Toronto Star CBC News Toronto Star 2021-06-02 13:52:35Z 17:37:30Z
13 Huawei MatePad Pro 12.6 in for review - GSMArena.com news - GSMArena.com Cricket: Devon Conway shines on debut as Black Caps dominate day one of first test against England at Lord's - New Zealand Herald GSMArena.com New Zealand Herald 2021-06-02 13:52:01Z 17:35:00Z
14 Everton set to begin talks with Nuno Espirito Santo over vacant manager role - Sky Sports Atmospheric metal layers appear with surprising regularity - Science Daily Sky Sports Science Daily 2021-06-02 13:42:25Z 17:31:46Z
15 2021's first solar eclipse will show off a 'ring of fire' in the sky - CNET Kevin Lunney attackers broke his leg and scored chest with blade^ court hears - The Irish Times CNET The Irish Times 2021-06-02 13:36:57Z 17:30:53Z
16 Asus ROG Strix G17^ ROG Strix G15 Advantage Edition Gaming Laptops With AMD Radeon RX 6800M GPU Announced - Gadgets 360 US wields $2bn tariff threat against 6 nations over digital taxes - Financial Times NDTV News Financial Times 2021-06-02 13:21:30Z 17:25:24Z
17 Venus Williams has perfect response to Naomi Osaka French Open drama - New York Post Duke Blue Devils basketball coach Mike Krzyzewski plans to retire after season^ sources say - ESPN New York Post ESPN 2021-06-02 13:18:00Z 17:24:40Z
18 Australia's Victoria extends Melbourne COVID-19 lockdown for 2nd week - Reuters Do not politick with land^ Malema warns Ramaphosa as he cranks up pressure on ANC over amendment - News24 Reuters News24 2021-06-02 13:18:00Z 17:24:10Z
19 Nets make quick work of short-handed Celtics in first round of playoffs^ but much tougher test awaits in Bucks - CBS Sports AMC frenzy triggers trading halts as stock surges 100 percent - NBC News CBS Sports NBC News 2021-06-02 13:09:00Z 17:23:00Z
20 First Solar Eclipse of the year 2021: will be visible only from Arunachal Pradesh in India - Arunachal24 Facebook doubles down on business tools with WhatsApp API updates^ Login Connect for Messenger and more - TechCrunch Arunachal24.in TechCrunch 2021-06-02 13:08:44Z 17:21:52Z
21 CDPR Won’t Reveal ‘Cyberpunk 2077’ Q1 Sales^ But Estimates Are Shockingly Low - Forbes BJP leader Rakesh Pandit shot dead by terrorists outside his home in Kashmir - Moneycontrol.com Forbes Moneycontrol 2021-06-02 13:05:30Z 17:19:38Z

View File

@ -1,4 +1,4 @@
name,current,opening name,current,opening
MSFT,248.47,248.125 MSFT,247.3,248.125
NFLX,500.285,499.82 NFLX,499.24,499.82
GOOG,2430.27,2435.31 GOOG,2421.28,2435.31

1 name current opening
2 MSFT 248.47 247.3 248.125
3 NFLX 500.285 499.24 499.82
4 GOOG 2430.27 2421.28 2435.31

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
final.ppm Executable file

Binary file not shown.

143
test.py
View File

@ -13,6 +13,9 @@ import finnhub
import pexpect import pexpect
from pycoingecko import CoinGeckoAPI from pycoingecko import CoinGeckoAPI
from newsapi import NewsApiClient from newsapi import NewsApiClient
import configparser
import requests
import json
import sys, os import sys, os
try: try:
@ -21,29 +24,129 @@ except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info() exc_type, exc_obj, exc_tb = sys.exc_info()
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
print(exc_type, fname, exc_tb.tb_lineno, exc_obj, exc_tb) print(exc_type, fname, exc_tb.tb_lineno, exc_obj, exc_tb)
def update_weather():
api_key = 'bd5d5096a5ba30bbcfb57ead42ab3fee'
location = 'London'
url = "https://api.openweathermap.org/data/2.5/weather?q={}&units=metric&appid={}".format(location, api_key)
r = requests.get(url)
weather = r.json()
current_weather = {}
coords = weather['coord']
lat = coords['lat']
lon = coords['lon']
url = 'https://api.openweathermap.org/data/2.5/onecall?lat={}&units=metric&lon={}&appid={}'.format(lat, lon, api_key)
r = requests.get(url)
current_weather['main_weather'] = weather['weather'][0]['main']
current_weather['description'] = weather['weather'][0]['description']
current_weather['temp'] = weather['main']['temp']
current_weather['min_temp'] = weather['main']['temp_min']
current_weather['max_temp'] = weather['main']['temp_max']
current_weather['feels_like'] = weather['main']['feels_like']
current_weather['humidity'] = weather['main']['humidity']
current_weather['clouds'] = weather['clouds']['all']
current_weather['wind_speed'] = weather['wind']['speed']
current_weather['wind_direction'] = weather['wind']['deg']
current_weather['visibility'] = weather['visibility']
current_weather['uv'] = r.json()['current']['uvi']
json.dump( current_weather, open( "csv/current_weather.json", 'w+' ))
daily_weather = []
daily = r.json()['daily']
for day in daily:
dct = {}
dct['main_weather'] = day['weather'][0]['main']
dct['description'] = day['weather'][0]['description']
dct['min_temp'] = day['temp']['min']
dct['min_temp'] = day['temp']['max']
daily_weather.append(dct)
json.dump( daily_weather, open( "csv/daily_weather.json", 'w+' ))
if __name__ == '__main__': if __name__ == '__main__':
update_weather()
sys.exit()
newsapi = NewsApiClient(api_key='cf08652bd17647b89aaf469a1a8198a9') api_key = 'bd5d5096a5ba30bbcfb57ead42ab3fee'
location = 'London'
top_headlines = newsapi.get_top_headlines(q='bitcoin',
category='business', url = "https://api.openweathermap.org/data/2.5/weather?q={}&units=metric&appid={}".format(location, api_key)
country='us') r = requests.get(url)
weather = r.json()
''' current_weather = {}
top_headlines = newsapi.get_everything(q='bitcoin',
sources='bbc-news,the-verge', coords = weather['coord']
page=1) lat = coords['lat']
''' lon = coords['lon']
#print(top_headlines) url = 'https://api.openweathermap.org/data/2.5/onecall?lat={}&units=metric&lon={}&appid={}'.format(lat, lon, api_key)
headline_titles = [top_headline['title'] for top_headline in top_headlines['articles']] r = requests.get(url)
headline_ids = [top_headline['source']['name'] for top_headline in top_headlines['articles']] print()
headline_times = [top_headline['publishedAt']for top_headline in top_headlines['articles']] print('main weather: ', weather['weather'][0]['main'])
print('description: ', weather['weather'][0]['description'])
print('temp (degrees C): ', weather['main']['temp'])
print('min: ', weather['main']['temp_min'])
print('max: ', weather['main']['temp_max'])
print('feels like: ', weather['main']['feels_like'])
print('humidity (%): ', weather['main']['humidity'])
print('clouds: ', weather['clouds']['all'])
print('wind speed (m/s): ', weather['wind']['speed'], 'direction:', weather['wind']['deg'])
print('visibility (metres): ', weather['visibility'])
print('UV index: ', r.json()['current']['uvi'])
current_weather['main_weather'] = weather['weather'][0]['main']
current_weather['description'] = weather['weather'][0]['description']
current_weather['temp'] = weather['main']['temp']
current_weather['min_temp'] = weather['main']['temp_min']
current_weather['max_temp'] = weather['main']['temp_max']
current_weather['feels_like'] = weather['main']['feels_like']
current_weather['humidity'] = weather['main']['humidity']
current_weather['clouds'] = weather['clouds']['all']
current_weather['wind_speed'] = weather['wind']['speed']
current_weather['wind_direction'] = weather['wind']['deg']
current_weather['visibility'] = weather['visibility']
current_weather['uv'] = r.json()['current']['uvi']
print()
print(current_weather)
json.dump( current_weather, open( "csv/current_weather.json", 'w+' ))
daily_weather = []
daily = r.json()['daily']
for day in daily:
dct = {}
dct['main_weather'] = day['weather'][0]['main']
dct['description'] = day['weather'][0]['description']
dct['min_temp'] = day['temp']['min']
dct['min_temp'] = day['temp']['max']
daily_weather.append(dct)
json.dump( daily_weather, open( "csv/daily_weather.json", 'w+' ))
print()
print(weather)
print()
print(r.json()['daily'][0])
print()
print(daily_weather)
#print([top_headline.keys()for top_headline in top_headlines['articles']])
print(headline_titles)
print(headline_ids)
print(headline_times)