Объединение списков в python, но в порядке - PullRequest
0 голосов
/ 25 апреля 2020

Пытаясь использовать matplotlib для составления графика данных о динамике цены пара Я пытаюсь получить усредненный график за определенный промежуток времени. Все работает нормально, пока matplotlib не выдаст ошибку при отображении дат.

Мой код:

import requests
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import datetime
from tkinter import *
from tkinter import ttk
import time
from tkinter import messagebox
import configparser
import os

def parseDate(dateString):
  month, day, year, hour, tz = dateString.split()
  month = ["", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"].index(month)
  day = int(day)
  year = int(year)
  hour = int(hour[:-1])
  return datetime.datetime(year, month, day, hour)

def get_data(id,item):
    page = requests.get(f"https://steamcommunity.com/market/listings/{id}/{item}")
    #To do: make sure that the response code is 200 etc...
    source = page.text
    line1Index = source.find("line1=[[")
    dataString = source[line1Index + 6: source.find("]]", line1Index) + 2]
    data = eval(dataString)
    #Convert quantity solds to integers
    data = list(map(lambda x : x[:2] + [int(x[-1])], data))
    data = list(map(lambda x: [parseDate(x[0])] + x[1:], data))
    return (data)

def smooth(data):
  newData = []
  currDate = data[0][0].date()
  totalPrice, numEntries, totalVolume = 0, 0, 0
  for quote in data:
    if quote[0].date() == currDate:
      totalPrice += quote[1]
      totalVolume += quote[2]
      numEntries += 1
    else:
      newData += [[currDate, totalPrice / numEntries, totalVolume]]
      totalPrice, numEntries, totalVolume = quote[1], 1, quote[2]
      currDate = quote[0].date()
  newData += [[currDate, totalPrice / numEntries, totalVolume]]
  return newData

def getLastXDays(data, days):
    today = datetime.datetime.now()
    today = datetime.datetime(today.year, today.month, today.day)
    startDate = today - datetime.timedelta(days = days)
    return list(filter(lambda quote: quote[0] >= startDate, data))

gameIDs = {"CS:GO" : 730, "RUST" : 252490}
def GetGameID(game):
  return gameIDs.get(game.upper(), None)

def plot_lastxdays(game,item,days):
  data = get_data(game,item)
  data=getLastXDays(data,days)
  data=smooth(data)
  xs = [quote[0] for quote in data]
  ys = [quote[1] for quote in data]
  plt.plot(xs,ys,)
def plot_lastxdays_quant(game,item,days,divisor) :
  data = get_data(game,item)
  data=getLastXDays(data,days)
  data=smooth(data)
  xx = [quote[2] for quote in data]
  xs = [x / divisor for x in xx]
  ys = [quote[0] for quote in data]
  plt.plot(ys,xs,)

def get_many_items():
  config = configparser.ConfigParser()
  config.read('config.ini')

  itemlist = config['Settings']['Items'].split(',')
  days = config['Settings']['Days']
  days = int(days)
  game = config['Settings']['Game']
  game = GetGameID(game)
  count=0

  for item in itemlist:
    plot_lastxdays(game, item, days)
    count +=1
    print(f'Completed : {count} / {len(itemlist)}')
    if count == len(itemlist):
      print('completed')
  plt.title(f'Price in USD over the past {days} days for {itemlist}')
  plt.show()

def myFancyAverage(*args):
  average = lambda xs: sum(xs) / len(xs)
  return list(map(average, zip(*args)))

def plottrend() :
  config = configparser.ConfigParser()
  config.read('config.ini')

  itemlist = config['Settings']['Items'].split(',')
  days = config['Settings']['Days']
  days = int(days)
  game = config['Settings']['Game']
  game = GetGameID(game)
  count=0

  for item in itemlist :
    print(f'Complete {count} of {len(itemlist)}')
    if count == 0 :
      olddata = get_data(game,item)
      olddata=getLastXDays(olddata,days)
      olddata=smooth(olddata)
      oldpricedata =  [quote[1] for quote in olddata]
      xaxis = [quote[0] for quote in olddata]
      plt.plot(xaxis)
      count += 1
    else:
      newdata = get_data(game,item)
      newdata=getLastXDays(newdata,days)
      newdata=smooth(newdata)
      newpricedata =  [quote[1] for quote in newdata]
      oldpricedata = myFancyAverage(oldpricedata,newpricedata)
      xaxis = [quote[0] for quote in newdata]
      plt.plot(xaxis)
      count += 1
      if count == len(itemlist):
        print('complete')
  yaxis = (oldpricedata)
  plt.plot((),yaxis)
  plt.title(f'General Trend for {itemlist} over  the last {days} days')
  plt.show()

plottrend()

Мой файл .ini:

[Settings]
Items =Danger Zone Case,Falchion Case,Prisma Case,Gamma Case,Prisma 2 Case,Gamma 2 Case,Horizon Case,Clutch Case,Glove Case,Spectrum Case
Days =365
Game =CS:GO
Divisor =10000

Моя ошибка:

C:\Users\Donov\OneDrive\Desktop\grapher_clean>python Grapher_clean.py
Complete 0 of 10
Complete 1 of 10
Complete 2 of 10
Complete 3 of 10
Complete 4 of 10
Complete 5 of 10
Complete 6 of 10
Complete 7 of 10
Complete 8 of 10
Complete 9 of 10
complete
Traceback (most recent call last):
  File "Grapher_clean.py", line 137, in <module>
    plottrend()
  File "Grapher_clean.py", line 133, in plottrend
    plt.plot(xaxis,yaxis)
  File "C:\Users\Donov\AppData\Local\Programs\Python\Python38-32\lib\site-packages\matplotlib\pyplot.py", line 2761, in plot
    return gca().plot(
  File "C:\Users\Donov\AppData\Local\Programs\Python\Python38-32\lib\site-packages\matplotlib\axes\_axes.py", line 1646, in plot
    lines = [*self._get_lines(*args, data=data, **kwargs)]
  File "C:\Users\Donov\AppData\Local\Programs\Python\Python38-32\lib\site-packages\matplotlib\axes\_base.py", line 216, in __call__
    yield from self._plot_args(this, kwargs)
  File "C:\Users\Donov\AppData\Local\Programs\Python\Python38-32\lib\site-packages\matplotlib\axes\_base.py", line 342, in _plot_args
    raise ValueError(f"x and y must have same first dimension, but "
ValueError: x and y must have same first dimension, but have shapes (366,) and (24,)

Я подозреваю, что это связано с тем фактом, что некоторые предметы вышли позже, чем другие имеют в виду, что их данные начинаются позднее, поэтому я не могу получить даты из самого последнего элемента, на который я смотрел, потому что другие элементы могут иметь данные более раннего времени, но я не знаю, как найти элемент с самыми ранними данными и извлечь только из что или как соединить строки, как показано ниже: Пожалуйста, помогите и спасибо

List1 = [7,8,9]
List2 = [6,7,8,9]
list3 = [2,3,4,5,6,7,8,9]

Ожидаемый результат:

newlist = [2,3,4,5,6,7,8,9]

1 Ответ

1 голос
/ 25 апреля 2020

Вы можете использовать:

list1 = [7,8,9]
list2 = [6,7,8,9]
list3 = [2,3,4,5,6,7,8,9]
print(sorted(set(list1+list2+list3)))
# [2, 3, 4, 5, 6, 7, 8, 9]

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...