TypeError: '<' not supported between instances of 'NoneType' and 'float'
What @Taras Mogetich wrote was pretty correct, however you might need to put the if-statement in its own for-loop. Liko so:
for row in hqm_dataframe.index:
for time_period in time_periods:
change_col = f'{time_period} Price Return'
percentile_col = f'{time_period} Return Percentile'
if hqm_dataframe.loc[row, change_col] == None:
hqm_dataframe.loc[row, change_col] = 0.0
And then separately:
for row in hqm_dataframe.index:
for time_period in time_periods:
change_col = f'{time_period} Price Return'
percentile_col = f'{time_period} Return Percentile'
hqm_dataframe.loc[row, percentile_col] = score(hqm_dataframe[change_col], hqm_dataframe.loc[row, change_col])
I'm working through this tutorial as well. I looked deeper into the data in the four '___ Price Return' columns. Looking at my batch API call, there's four rows that have the value 'None' instead of a float which is why the 'NoneError' appears, as the percentileofscore function is trying to calculate the percentiles using 'None' which isn't a float.
To work around this API error, I manually changed the None values to 0 which calculated the Percentiles, with the code below...
time_periods = [
'One-Year',
'Six-Month',
'Three-Month',
'One-Month'
]
for row in hqm_dataframe.index:
for time_period in time_periods:
if hqm_dataframe.loc[row, f'{time_period} Price Return'] == None:
hqm_dataframe.loc[row, f'{time_period} Price Return'] = 0
Funny to google the problem I'm having and it's literally the exact same tutorial you're working through!
As mentioned, some data from the API call has a value of None, which causes an error with the percentileofscore function. My solution is to convert all None type to integer 0 upon initial creation of the hqm_dataframe.
hqm_columns = [
'Ticker',
'Price',
'Number of Shares to Buy',
'One-Year Price Return',
'One-Year Return Percentile',
'Six-Month Price Return',
'Six-Month Return Percentile',
'Three-Month Price Return',
'Three-Month Return Percentile',
'One-Month Price Return',
'One-Month Return Percentile'
]
hqm_dataframe = pd.DataFrame(columns=hqm_columns)
convert_none = lambda x : 0 if x is None else x
for symbol_string in symbol_strings:
batch_api_call_url = f'https://sandbox.iexapis.com/stable/stock/market/batch?symbols={symbol_string}&types=price,stats&token={IEX_CLOUD_API_TOKEN}'
data = requests.get(batch_api_call_url).json()
for symbol in symbol_string.split(','):
hqm_dataframe = hqm_dataframe.append(
pd.Series(
[
symbol,
data[symbol]['price'],
'N/A',
convert_none(data[symbol]['stats']['year1ChangePercent']),
'N/A',
convert_none(data[symbol]['stats']['month6ChangePercent']),
'N/A',
convert_none(data[symbol]['stats']['month3ChangePercent']),
'N/A',
convert_none(data[symbol]['stats']['month1ChangePercent']),
'N/A'
],
index = hqm_columns
),
ignore_index=True
)