Задать вопрос
jo2aro
@jo2aro
i`m so stupid

Как конвертировать список с ценами в Float или любой формат с которым можно проводить математические операции!?

Пробовал много разных способов, пробовал преобразовать через float(), пытался через библиотеку pandas, не смог, пытался через map() уже 4й день не могу найти способ.

with open(r"skinstrashbase.txt", "r") as file: #в качестве ссылки из файла можете использовать:'https://steamcommunity.com/market/listings/730/Recoil%20Case'
    for line in file:
        requests.get(line)
req = requests.get(line)
search = re.search('var line1=(.+);', req.text)
data_str = search.group(1)
data = json.loads(data_str)
result = '\n'.join(map(str, data))
f_res = '[Date, Amount]\n' + result

f_res1 = re.findall(r', *.*,', f_res)

f_res1_1 = ' '.join(f_res1[0:30])#КОЛ-ВО АНАЛИЗИРУЕМЫХ СДЕЛОК

f_res2 = f_res1_1.replace(',', ' ')

time.sleep(5)

f_res3 = f_res2.strip("\"")

f_res4 = f_res3.strip(' ')

f_res5 = f_res4.strip(' ')

f_res6 = map(float, f_res5)

f_res7 = float(f_res6)

print(sum(f_res6))

ошибка: float() argument must be a string or a real number, not 'map'

пытался и так:
f_res1 = re.findall(r', *.*,', f_res)

f_res1_1 = ' '.join(f_res1[0:30])

f_res2 = f_res1_1.replace(',', ' ')

f_res3 = {'price': f_res2}
f_res4 = pd.DataFrame(f_res3, index=[0])
f_res5 = f_res4.mean(numeric_only=True)
print(f_res5)

PyCharm выдаёт: Series([], dtype: float64) и на этом останавливается.

заранее спасибо за помощь.
  • Вопрос задан
  • 131 просмотр
Подписаться 1 Простой 3 комментария
Решения вопроса 1
@PavelMos
Ты пытаешься использовать прикладные модули питона, не овладев достаточно основами языка.
data = json.loads(data_str)
#получается список списков из форматированной строки. 
#Этот список списков вероятно надо загрузить в Pandas,  в таблицу.
result = '\n'.join(map(str, data)) # 
#join берёт список и объединяет его в строку с символом или строкой разделителем.  
#И еще и map http://pythonicway.com/python-functinal-programming. 
# Результат не имеет смысла для твоей задачи.
f_res = '[Date, Amount]\n' + result #Как бы верно, если для таблицы в виде списка 
#списков надо добавить заголовки, то можно к заголовкам присоединить  саму таблицу . 
#Но здесь  не имеет смысла.  Cам заголовок в виде строки, а не списка из элементов, 
#в таблице не 2, а 3 столбца, и самой таблицы в виде #списка списков уже нет - 
#преобразована обратно в строку
f_res1 = re.findall(r', *.*,', f_res) # непонятно что нужно найти. См. про регекспы, удобно тренироваться на #regext101.com
f_res1_1 = ' '.join(f_res1[0:30])
f_res2 = f_res1_1.replace(',', ' ') # тут код имеет смысл,  если предположить, что в f_res1 есть 
#список найденных результатов и от него берётся первые 30 элементов 
#(надо заранее проверять, есть ли в нём столько, или предусмотреть обработку ошибки).  
f_res3 = {'price': f_res2} # допустим создаётся словарь ключ price, значение - длинная строка
f_res4 = pd.DataFrame(f_res3, index=[0])# создать датафрейм из словаря это pd.DataFrame.from_records(...


Можно сделать как в предыдущем вопросе
https://qna.habr.com/q/1195350
import pandas as pd
req = requests.get('https://steamcommunity.com/market/listings/730/Glove%20Case')
search = re.search('var line1=(.+);', req.text)
data_str = search.group(1)
data1 = json.loads(data_str) #получем с помощью json или через split список строк, 
#который будет преобразован в 3 колонки
data2 = [i.replace('"', '').split(',') for i in data] # обработать строки  - 
#убрать лишние двойные кавычки, разбить каждую строку на 3 элемента
df1 = pandas.DataFrame.from_records(data=data2, columns=['c1','c2','c3']) #загрузить, назвать колонки
df1.dtypes()#проверить, какие типы получились при импорте, и привести колонки к нужным типам
df1['c1'] = df1.apply(lambda x: x[1].replace(' +',''), axis=1)  #убрать из строки с датой лишние символы, 
#но это можно было бы сделать и на каком-то из предыдущих шагов с помощью регекспа или replace
df1['c1'] = pandas.to_datetime(df1['c1']) #преобразовать в тип datetime
df1['c2'] = pandas.to_numeric(df1['c2']) #преобразовать в число,  пандас должен понять, что будет float
df1['c3'] = pandas.to_numeric(df1['c3']) # преобразовать в число, паднас должен понять, что будет int


а можно было до загрузки пройтись по списку и удалить одинарные кавычки и 2 и 3 колонки и возможно тогда бы пандас сразу их проимпортировать как float и int например так
data3 = [(i[0].replace(' +', ''), i[1], int(i[2])) for i in data2]

и тогда осталось бы только преобразовать в дату первую колонку датафрейма
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы