Exemplo n.º 1
0
def create(database_list: list):
    """ Create a database to the game.sql

    Args:
        database_list:
    """
    # Create database using pre-created CREATE script
    for j in database_list:

        service.log("Loading database file : {}".format(j))
        script = ""

        with open("config/database/{}".format(j)) as sql_script:
            for i in sql_script:

                if i.find("--") == -1:
                    script += "{}\n".format(i)

            sql_script.close()  # Close file

        DATABASE.execute(script)
        DATABASE.commit()

    # make sure the database change is closed.
    DATABASE.close()
Exemplo n.º 2
0
def reset():
    """ Reset the database to make it newly generated

    NOTE: This function will be called during the game initiation.

    Args:
        none

    Return:
        none

    Raise:
        none
    """
    service.log("Resetting the database")
    # Open the database
    database.connect()

    try:
        # Delete the old database file
        os.remove(configuration.CONFIG['database_path'])

        # Create the new database file
        file = open(configuration.CONFIG['database_path'], 'w+')
        file.close()

    except Exception as inst:
        # Rollback the change
        service.error(inst)
    pass
Exemplo n.º 3
0
def insert(table_name: str, values: list):
    """ Do an INSERT script on database

    INSERT INTO <table_name> VALUES (<values>);

    Args:
        values:
        table_name:

    Return:
        none

    Raise:
        none
    """
    # Open the database
    database.connect()

    # Change the values of list into a string
    values = str(values).lstrip('[').rstrip(']')

    # Execute a SQL command
    try:
        sql_script = "INSERT INTO {} VALUES ({})".format(table_name, values)

        DATABASE.execute(sql_script)
        DATABASE.commit()
        DATABASE.close()

        service.log("Execute SQL : {}".format(sql_script))
    except Exception as inst:
        DATABASE.rollback()
        service.error(inst)

    pass
Exemplo n.º 4
0
 def _handshake(self) -> None:
     'Handshakes with the client.'
     while True:
         key = self._client.recv()
         try:
             self._scheme.importBinaryKey(key)
             self._send(Status.ok(self._scheme.exportBinaryKey()), False)
             break
         except elite.secret.CurveKindMismatch:
             self._send(
                 Status(StatusCode.SC_KEY_INVALID), False
             )
     log("密钥协商完毕。共享密钥如下:\n{}".format(hexdump(self._scheme.secret().hex())))
def getallsubs(content, allowed_languages, filename="", search_string=""):

    #parser = HTMLParser()
#    parser = et.XMLParser(html=1)
#    html = et.fromstring(content, parser).getroot()
#    html = ElementSoup.parse(StringIO(content))

    soup = BeautifulSoup(content)
    #elements = html.findall(".//tr[./td/a/img[@title='Download Thai Subtitle']]")

    subtitles = []
    sub_list = soup.fetch("div", dict(id="subtitle_list"))
    if not sub_list:
        return []
    table = sub_list[0].fetch("table")[0]
    if table is None:
        return []

    for element in table.findAll("tr")[1:]:
        num, title, rating, translate, upload, download = element.findAll("td")
        subtitle_name = title.find('br').previousSibling.strip().strip(" [En]")
        rating = int(round(float(rating.getText().strip('%'))/100.0*5))
        sync = False
        if filename != "" and string.lower(filename) == string.lower(subtitle_name):
            sync = True

        for lang_name, _, let2, let3, _, _  in [
            ("Thai", "0", "th", "tha", "41", 30243),
            ("English", "2", "en", "eng", "11", 30212)
        ]:
            if let3 not in allowed_languages:
                continue
            # rating is really the completeness. 0 means no thai, so not point showing it
            if let3 == 'tha' and rating < 1:
                continue

            link = download.fetch("img",{'title':'Download %s Subtitle'%lang_name})[0].parent['href']
            link = urljoin(MAIN_URL + "/manage/", link)
            lang = {'name': lang_name, '2let': let2, '3let': let3}

            subtitles.append({'rating': str(rating),
                              'filename': subtitle_name,
                              'sync': sync,
                              'link': link,
                              'lang': lang,
                              'hearing_imp': False})

    log(__name__, "got %s results" % len(subtitles))
#    subtitles.sort(key=lambda x: [not x['sync']])
    return subtitles
def geturl(url):
    log(__name__, "Getting url: %s" % url)
    try:
        response = urllib2.urlopen(url)
        content = response.read()
        #Fix non-unicode characters in movie titles
        strip_unicode = re.compile("([^-_a-zA-Z0-9!@#%&=,/'\";:~`\$\^\*\(\)\+\[\]\.\{\}\|\?<>\\]+|[^\s]+)")
        content = strip_unicode.sub('', content)
        return_url = response.geturl()
    except:
        log(__name__, "Failed to get url: %s" % url)
        content = None
        return_url = None
    return content, return_url
Exemplo n.º 7
0
    def login(self):
        self.username = request.json['username']
        password = request.json['password']

        try:
            self.gin_token = gin_ensure_token(user.username, password)
            log("debug", 'GIN token ensured.')
        except errors.ServerError as e:
            log('critical', e)
            return e, HTTPStatus.INTERNAL_SERVER_ERROR

        if ensure_key(self.gin_token) and drone_ensure_secrets(self.username):
            return {'token': self.gin_token}, HTTPStatus.OK
        else:
            return 'login failed', HTTPStatus.UNAUTHORIZED
Exemplo n.º 8
0
 def lifecycle(self, multithread: bool=False) -> None:
     'Runs the lifecycle, either in this thread or in another.'
     if multithread:
         t = Thread(name='Session-{}:{}'.format(*self._client.getpeername()), target=self.lifecycle)
         t.start()
         return
     try:
         self._handshake()
         self._main()
     except PeerDisconnect: pass
     log("会话结束。")
     if self._room:
         self._room.userLeft(self._user)
         self._room.metaMessage('{} 离开了房间。'.format(self._user))
         self._room = None
     self._server.sessionExit(self)
Exemplo n.º 9
0
 def serve(self, multithread: bool=False) -> None:
     'Launches the server.'
     if multithread:
         t = Thread(name='ServerDaemon', target=self.serve, daemon=True)
         t.start()
         return
     log('使用配置: {}'.format(format_config(config)))
     log('正在监听 0.0.0.0 端口 {}'.format(self._port))
     self._sock.listen(config.get('BacklogSize', 5))
     while True:
         client, addr = self._sock.accept()
         log('客户端 {}:{} 已连接'.format(*addr))
         session = Session(client, self)
         self._sessions.add(session)
         session.lifecycle(True)
Exemplo n.º 10
0
def getep(showid, since):
    count = getcount(showid)
    if count:
        res = []
        resb = []
        #        resc = []
        limit = 30
        #sinceb = since[:-3]
        #sincec = since[:-6]
        since = since[:-3]
        sinceb = since[:-6]
        for i in range(0, count, limit):
            epdata = getepisodes(showid, i, limit)
            if 'data' in epdata:
                data = epdata['data']
                for itm in data:
                    #_since = itm['attributes']['since'][:-9]
                    _since = itm['attributes']['since'][:-12]
                    if _since == since:
                        res.append(itm)
                    if _since[:-3] == sinceb:
                        resb.append(itm)
#                    if _since[:-6] == sincec:
#                        resc.append(itm)
        if res:
            log("res = " + repr(res))
            return res
        if resb:
            log("resb =" + repr(resb))
            return resb


#        if resc:
#            log("resc =" + repr(resc))
#            return resc
        return ''

    else:
        log("Count is none or 0")
Exemplo n.º 11
0
def get_audio(kind):
    if sys.listitem.getPath() != xbmc.getInfoLabel('ListItem.FolderPath'):
        okdialog(LANG(30402))
        return
    label = xbmc.getInfoLabel('ListItem.Label')
    log("label = " + repr(label))
    plot = xbmc.getInfoLabel('ListItem.Plot')
    icon = xbmc.getInfoLabel('ListItem.Icon')
    channel = xbmc.getInfoLabel('ListItem.ChannelName')
    starttime = xbmc.getInfoLabel('ListItem.StartTime')
    statid = None
    if decode(channel) in chann_dict:
        statid = decode(chann_dict[decode(channel)])
    if statid is not None:
        day = parsedatetime(xbmc.getInfoLabel('ListItem.Date'),
                            xbmc.getInfoLabel('ListItem.StartDate'))
        starttime = starttime if len(starttime) == 5 else '0' + starttime
        since = '%sT%s' % (day, starttime)
        log("since = " + repr(since))
        url = base_url + 'schedule-day?filter[day]=' + day + '&filter[stations.id]=' + statid
        data = jsonrequest(url)
        if data is not None and 'links' in data:
            links = data['links']
            if 'next' in links and links['next'] == None:
                if 'data' in data:
                    data = data['data']
                    ep1a = [
                        i for i in data
                        if i['attributes']['since'][:-9] == since and encode(
                            i['attributes']['mirroredShow']['title']) == label
                    ]
                    ep2a = [
                        i for i in data
                        if i['attributes']['since'][:-12] == since[:-3]
                        and encode(i['attributes']['mirroredShow']
                                   ['title']) == label
                    ]
                    ep3a = [
                        i for i in data
                        if i['attributes']['since'][:-15] == since[:-6]
                        and encode(i['attributes']['mirroredShow']
                                   ['title']) == label
                    ]
                    ep1b = [
                        i for i in data
                        if i['attributes']['since'][:-9] == since
                        and encode(i['attributes']['title']) == label
                    ]
                    ep2b = [
                        i for i in data
                        if i['attributes']['since'][:-12] == since[:-3]
                        and encode(i['attributes']['title']) == label
                    ]
                    ep3b = [
                        i for i in data
                        if i['attributes']['since'][:-15] == since[:-6]
                        and encode(i['attributes']['title']) == label
                    ]
                    ep = ep1a if ep1a else ep1b if ep1b else ep2a if ep2a else ep2b if ep2b else ep3a if ep3a else ep3b
                    if len(ep) > 1:
                        notify(LANG(30410))
                    ep = ep[0] if len(ep) else None
                    if isinstance(ep, dict):
                        log("scheduled episode  = " + repr(ep))
                        if 'attributes' in ep:
                            till = ep['attributes']['till'][:-6]
                            nowd = xbmc.getInfoLabel('System.Date(yyyy-mm-dd)')
                            nowt = xbmc.getInfoLabel('System.Time(hh:mm)')
                            now = '%sT%s' % (nowd, nowt)
                            if till >= now:
                                notify(LANG(30401))
                                return
                            #show = ep['relationships']['show']
                            show = ep['attributes']['mirroredShow']
                            if 'data' in show and 'id' in show['data']:
                                showid = show['data']['id']
                            else:  # must be searched by aired show title
                                log("show id not in show['data'] or 'data' not in response"
                                    )
                                showid = ''
                                title = ep['attributes']['mirroredShow'][
                                    'title']
                                log("mirroredShow title  = " + title)
                                showid = findshowid(statid, title)
                                if not showid:
                                    title = ep['attributes']['title']
                                    log("title  = " + title)
                                    showid = findshowid(statid, title)
                        else:
                            notify(LANG(30405))
                            return
                        if showid:
                            log("showid = " + showid)
                            epis = getep(showid, since)
                            if epis is None:
                                notify(LANG(30404))
                                return
                            if epis:
                                res = []
                                for epi in epis:
                                    log("epi = " + repr(epi))
                                    if 'attributes' in epi:
                                        part = total = 0
                                        attrs = epi['attributes']
                                        if len(epis) > 1:
                                            descr = attrs[
                                                'description'].replace(
                                                    '<p>',
                                                    '').replace('</p>',
                                                                '').replace(
                                                                    '&nbsp;',
                                                                    ' ')
                                            title = attrs['title']
                                            if 'part' in attrs and 'mirroredSerial' in attrs and 'totalParts' in attrs[
                                                    'mirroredSerial']:
                                                part = attrs['part']
                                                total = attrs[
                                                    'mirroredSerial'][
                                                        'totalParts']
                                        else:
                                            descr = plot
                                            title = label
                                        if 'asset' in attrs and 'url' in attrs[
                                                'asset'] and attrs['asset'][
                                                    'url']:
                                            icon = attrs['asset']['url']
                                        if 'audioLinks' in attrs:
                                            al = attrs['audioLinks'][0]
                                            if len(al):
                                                if kind == 'down' and 'playableTill' in al:
                                                    notify(LANG(30409))
                                                    return
                                                link = attrs['audioLinks'][0][
                                                    'url']
                                                res.append(
                                                    (link, title,
                                                     attrs['since']
                                                     [:-9].replace('T', ' '),
                                                     descr, part, total))
                                res.sort(key=lambda x: (x[1], x[4]))
                                log("result = " + repr(res))
                                return [label, channel, icon, res]
                            else:
                                notify(LANG(30403))
                        else:
                            notify(LANG(30404))
                    else:
                        notify(LANG(30403))
            else:
                log("################  paging ? ################")
        else:
            log("############## 'links' not in data or data is None ##############"
                )
    else:
        log("############ unknown id of station ############")
    return
Exemplo n.º 12
0
def count_day_in_stock(forecast_path, start_date, end_date, f_log):
    service.log('Расчет количества дней на остатке по месяцам', f_log, False)
    # Календарь
    df_date = pd.to_datetime(start_date) + pd.to_timedelta(
        np.arange(((end_date - start_date).days + 1)), 'D')
    df_date = df_date.to_frame()
    df_date = df_date.reset_index()
    df_date = df_date.drop(columns=['index'])
    df_date.rename(columns={0: 'Period'}, inplace=True)
    df_date = df_date.astype({'Period': 'datetime64'})
    df_date['Year_Month'] = df_date['Period'].map(
        lambda x: str(x.year) + '_' + service.fill_month(x.month))
    file_name = service.naming(start_date, end_date, period_name='Day')
    service.log('Загрузка данных из таблицы остатков: ' + file_name, f_log,
                True)
    # Таблица остатков по дням - Артикул,Period,Склад,Остаток
    df_rest = pd.read_csv(forecast_path + file_name,
                          sep=',',
                          dtype={
                              'Артикул': 'object',
                              'Period': 'object',
                              'Склад': 'object',
                              'Остаток': 'int64'
                          },
                          encoding='cp1251')
    df_rest = df_rest.astype({'Period': 'datetime64'})
    # Таблица среднего отпуска товара по дням - Period,Артикул,Склад,СреднийОтпуск
    file_name = service.naming(start_date,
                               end_date,
                               period_name='Day',
                               count=2)
    service.log(
        'Загрузка данных из таблицы среднего отпуска товара по дням: ' +
        file_name, f_log, True)
    df_clqnty = pd.read_csv(forecast_path + file_name,
                            sep=',',
                            dtype={
                                'Period': 'object',
                                'Артикул': 'object',
                                'Склад': 'object',
                                'СреднийОтпуск': 'float64'
                            },
                            encoding='cp1251')
    df_rest = df_rest.merge(df_clqnty, 'left', on=['Артикул', 'Склад'])
    df_rest = df_rest.astype({'Period': 'datetime64'})
    df_rest = df_date.merge(df_rest, 'left', on='Period')
    service.log('Данные загружены', f_log, True)
    del df_clqnty, df_date
    # Артикул,Склад,Year_Month,ДнейНаОстатке
    df_rest['ДнейНаОстатке'] = np.where(
        df_rest['Остаток'] > df_rest['СреднийОтпуск'], 1, 0)
    df_rest = pd.pivot_table(df_rest,
                             values='ДнейНаОстатке',
                             index=['Year_Month', 'Артикул', 'Склад'],
                             aggfunc=sum,
                             fill_value=0)
    df_rest = df_rest.reset_index()
    cols = df_rest.columns.tolist()
    #Перестановка столбцов
    col = cols[0]
    cols[0] = cols[1]
    cols[1] = cols[2]
    cols[2] = col
    df_rest = df_rest[cols]
    #Запись
    file_name = service.naming(start_date,
                               end_date,
                               period_name='Month',
                               count=3)
    service.log('Запись данных: ' + file_name, f_log, True)
    df_rest.to_csv(forecast_path + file_name, encoding='cp1251', index=False)
    service.log('Запись завершена', f_log, True)
    del col, cols, df_rest, end_date, file_name, forecast_path, start_date
Exemplo n.º 13
0
# Год начала расчета
year = int(config['start_date']['year'])
# Месяц начала расчета
month = int(config['start_date']['month'])
# Определение границ периода статистики
start_date = service.get_date(year, month)
get_end_date = service.get_end_date(config['dir']['rest_dir'], year)
end_date = get_end_date[0]
# Количество месяцев статистики
num_files = get_end_date[1]
now = datetime.datetime.now()
# Создаем файл лога
log_file_name = 'Forecast_log_' + str(now.year) + str(
    service.fill_month(now.month)) + str(service.fill_month(now.day)) + '.txt'
f_log = open(config['dir']['log_dir'] + log_file_name, 'w')
service.log('НАЧАЛО', f_log, False)
service.log('Начало периода: ' + str(start_date), f_log, False)
service.log('Конец периода:  ' + str(end_date), f_log, False)
# Расчет количества уникальных клиентов в день и группировка продаж по дням и по месяцам
operation.client_qty_by_day(config['dir']['request_dir'],
                            config['dir']['forecast_dir'], con_cfg,
                            str(start_date).replace('-', ','),
                            str(end_date).replace('-', ','), f_log)
# Расчет продаж в день и агрегирование по месяцам
operation.aggr_sales(res_dir, config['dir']['request_dir'],
                     config['dir']['forecast_dir'], con_cfg,
                     str(start_date).replace('-', ','),
                     str(end_date).replace('-', ','), f_log)
# Группировка продаж по дням и по месяцам
operation.aggr_rest(res_dir, config['dir']['rest_dir'],
                    config['dir']['forecast_dir'], num_files, start_date,
def search_movie(title, year, languages, filename):
    title = string.strip(title)
    search_string = prepare_search_string(title)

    log(__name__, "Search movie = %s" % search_string)
    url = MAIN_URL + "manage/search.php?movie_name=" + urllib.quote_plus(search_string)
    content, response_url = geturl(url)

    if content is not None:
        log(__name__, "Multiple movies found, searching for the right one ...")
        subspage_url = find_movie(content, title, year)
        if subspage_url is not None:
            log(__name__, "Movie found in list, getting subs ...")
            url = MAIN_URL + subspage_url
            content, response_url = geturl(url)
            if content is not None:
                getallsubs(content, languages, filename)
        else:
            log(__name__, "Movie not found in list: %s" % title)
            if string.find(string.lower(title), "&") > -1:
                title = string.replace(title, "&", "and")
                log(__name__, "Trying searching with replacing '&' to 'and': %s" % title)
                subspage_url = find_movie(content, title, year)
                if subspage_url is not None:
                    log(__name__, "Movie found in list, getting subs ...")
                    url = MAIN_URL + subspage_url
                    content, response_url = geturl(url)
                    if content is not None:
                        getallsubs(content, languages, filename)
                else:
                    log(__name__, "Movie not found in list: %s" % title)
Exemplo n.º 15
0
def aggr_sales(path, request_path, forecast_path, config, start_date, end_date,
               f_log):
    service.log('Расчет деневной статистики продаж и агрегирование по месяцам',
                f_log, False)
    service.log('Подключение к SQL серверу', f_log, True)
    con = pymssql.connect(host=config[0],
                          user=config[1],
                          password=config[2],
                          database=config[3])
    service.log('Подключение установлено', f_log, True)
    # Загружаем текст запроса
    f = open(request_path + 'requestSell.txt')
    set_sell_request = f.read()
    f.close()
    # Загружаем фрейм
    service.log('Чтение из БД', f_log, True)
    df_sell = pd.read_sql(set_sell_request.format(start_date, end_date), con)
    service.log('Чтение данных завершено', f_log, True)
    df_sell = df_sell.astype({'Period': 'datetime64'})
    con.close()
    # Формирование даты из строки для запроса
    start_date = datetime.datetime.strptime(start_date.replace(",", "-"),
                                            '%Y-%m-%d').date()
    end_date = datetime.datetime.strptime(end_date.replace(",", "-"),
                                          '%Y-%m-%d').date()
    # Список складов с сопоставлением для агрегации
    df_whouse = pd.read_excel(path + 'infWhouse.xlsx')
    service.log('Обработка данных по дням:', f_log, True)
    df_sell = df_sell.merge(df_whouse, 'left', on='WH')
    df_sell = pd.pivot_table(df_sell,
                             values='Qnty',
                             index=['Art', 'Period', 'Whouse'],
                             aggfunc=np.sum,
                             fill_value=0)
    df_sell = df_sell.reset_index()
    # Имя файла для записи
    file_name = service.naming(start_date, end_date, 'Day')
    service.log('Запись данных продаж по дням: ' + file_name, f_log, True)
    df_sell.to_csv(forecast_path + file_name, encoding='cp1251', index=False)
    service.log('Запись завершена', f_log, True)
    service.log('Формирование сводной по месяцам:', f_log, True)
    df_date = pd.to_datetime(start_date) + pd.to_timedelta(
        np.arange(((end_date - start_date).days + 1)), 'D')
    df_date = df_date.to_frame()
    df_date = df_date.reset_index()
    df_date = df_date.drop(columns=['index'])
    df_date.rename(columns={0: 'Period'}, inplace=True)
    df_date = df_date.astype({'Period': 'datetime64'})
    for index, row in df_date.iterrows():
        df_date.at[index, 'Year_Month'] = datetime.datetime.strftime(
            df_date.at[index, 'Period'], "%Y_%m")
    df_sell = df_date.merge(df_sell, 'left', on='Period')
    df_sell = pd.pivot_table(df_sell,
                             values='Qnty',
                             index=['Art', 'Year_Month', 'Whouse'],
                             aggfunc=np.sum,
                             fill_value=0)
    df_sell = df_sell.reset_index()
    # Имя файла для записи
    file_name = service.naming(start_date, end_date, period_name='Month')
    service.log('Запись данных: ' + file_name, f_log, True)
    df_sell.to_csv(forecast_path + file_name, encoding='cp1251', index=False)
    service.log('Запись завершена', f_log, True)
    del df_sell, df_whouse, df_date, index, row, file_name, request_path, forecast_path
Exemplo n.º 16
0
def aggr_rest(path, rest_path, forecast_path, num_files, start_date, end_date,
              f_log):
    service.log('Группировка остатка по дням и по месяцам в отдельные файлы',
                f_log, False)
    service.log('Загрузка данных из таблиц:', f_log, True)
    # Загружаем фрейм-список складов
    df_whouse = pd.read_excel(path + 'infWhouse.xlsx')
    df_whouse.rename(columns={"WH": "Склад"}, inplace=True)
    # df_rest - Period, Остаток, Артикул, Склад
    df_rest = pd.DataFrame()
    for i in range(1, num_files + 1):
        # Дата файла
        date = service.get_date(start_date.year + ((i - 1) // 12),
                                i - 12 * ((i - 1) // 12))
        # Имя файла
        file_name = service.naming(date, period_name='Day')
        # Чтение даных
        df_rest = df_rest.append(
            pd.read_csv(rest_path + file_name, sep=',', encoding='cp1251'))
        # Запись в лог
        if i > 1:
            service.log(
                file_name + ' Загружен. Операций соеденения произведено: ' +
                str(i - 1), f_log, True)
        else:
            service.log(file_name + ' Загружен', f_log, True)
    del date, i
    df_rest = df_rest.astype({'Period': 'datetime64'})
    service.log('Данные загружены', f_log, True)
    service.log('Агрегация складов', f_log, True)
    df_rest = df_rest.merge(df_whouse, 'left', on='Склад')
    df_rest = df_rest.drop(columns=['Склад'])
    df_rest.rename(columns={'Whouse': 'Склад'}, inplace=True)
    df_rest = pd.pivot_table(df_rest,
                             values='Остаток',
                             index=['Артикул', 'Period', 'Склад'],
                             aggfunc=np.sum,
                             fill_value=0)
    df_rest['Остаток'] = np.around(df_rest['Остаток'], decimals=2)
    df_rest = df_rest.reset_index()
    service.log('Загрузка уникальных артикулов', f_log, True)
    # Артикул
    df_art = pd.DataFrame(pd.unique(df_rest['Артикул']), columns=['Артикул'])
    df_art = df_art.reset_index()
    df_art = df_art.drop(columns=['index'])
    service.log('Загрузка уникальных складов', f_log, True)
    # Склад
    df_whouse = pd.DataFrame(pd.unique(df_rest['Склад']), columns=['Склад'])
    df_whouse = df_whouse.reset_index()
    df_whouse = df_whouse.drop(columns=['index'])
    service.log('Группировка по дням', f_log, True)
    # Запись файла по дням
    file_name = service.naming(start_date,
                               end_date,
                               period_name='Day',
                               count=2)
    service.log('Запись данных: ' + file_name, f_log, True)
    df_rest.to_csv(forecast_path + file_name, encoding='cp1251', index=False)
    service.log('Данные записаны', f_log, True)
    service.log('Группировка по месяцам', f_log, True)
    df_rest['Year_Month'] = df_rest['Period'].map(
        lambda x: str(x.year) + '_' + service.fill_month(x.month))
    df_rest = pd.pivot_table(df_rest,
                             values='Остаток',
                             index=['Артикул', 'Year_Month', 'Склад'],
                             aggfunc=np.mean,
                             fill_value=0)
    df_rest = df_rest.reset_index()
    df_rest['Остаток'] = np.around(df_rest['Остаток'], decimals=2)
    service.log('Соединение с календарем', f_log, True)
    # Календарь
    df_date = pd.to_datetime(start_date) + pd.to_timedelta(
        np.arange(((end_date - start_date).days + 1)), 'D')
    df_date = df_date.to_frame()
    df_date = df_date.reset_index()
    df_date = df_date.drop(columns=['index'])
    df_date.rename(columns={0: 'Period'}, inplace=True)
    df_date = df_date.astype({'Period': 'datetime64'})
    df_date['Year_Month'] = df_date['Period'].map(
        lambda x: str(x.year) + '_' + service.fill_month(x.month))
    df_date = df_date.groupby('Year_Month').count()
    df_date = df_date.reset_index()
    df_date = df_date.drop(columns=['Period'])
    index = pd.MultiIndex.from_product(
        [df_date['Year_Month'], df_whouse['Склад'], df_art['Артикул']],
        names=['Year_Month', 'Склад', 'Артикул'])
    df_date = pd.DataFrame(index=index).reset_index()
    df_rest = df_date.merge(df_rest,
                            'left',
                            on=['Year_Month', 'Склад', 'Артикул'])
    df_rest = df_rest.fillna(0)
    # Запись файла по имесяцам
    file_name = service.naming(start_date,
                               end_date,
                               period_name='Month',
                               count=2)
    service.log('Запись данных: ' + file_name, f_log, True)
    df_rest.to_csv(forecast_path + file_name, encoding='cp1251', index=False)
    service.log('Запись завершена', f_log, True)
    del df_date, df_rest, df_art, df_whouse, end_date, index, path, start_date, file_name, rest_path, forecast_path,
Exemplo n.º 17
0
def set_ABT(path, forecast_path, start_date, end_date, f_log):
    service.log('Создание базовой аналитической таблицы', f_log, False)
    # Календарь
    df_date = pd.to_datetime(start_date) + pd.to_timedelta(
        np.arange(((end_date - start_date).days + 1)), 'D')
    df_date = df_date.to_frame()
    df_date = df_date.reset_index()
    df_date = df_date.drop(columns=['index'])
    df_date.rename(columns={0: 'Period'}, inplace=True)
    df_date = df_date.astype({'Period': 'datetime64'})
    df_date['Year_Month'] = df_date['Period'].map(
        lambda x: str(x.year) + '_' + service.fill_month(x.month))
    # Определение максимальной даты в календаре
    period_count = df_date['Period'].count() - 1
    max_date = df_date.at[period_count, 'Period']
    # Дата начала прогнозируемого месяца
    max_date = max_date + datetime.timedelta(days=1)
    # Количество дней в прогнозируемом месяце
    #days = calendar.monthrange(max_date.year, max_date.month)[1]
    df_date = df_date.groupby('Year_Month').count()
    df_date = df_date.reset_index()
    df_date.rename(columns={'Period': 'ДнейВМесяце'}, inplace=True)
    df_date = df_date.reset_index()
    df_date = df_date.drop(columns=['index'])
    file_name = service.naming(start_date, end_date)
    service.log('Загрузка данных из сводной таблицы: ' + file_name, f_log,
                True)
    df_rest = pd.read_csv(forecast_path + file_name,
                          sep=',',
                          dtype={
                              'Year_Month': 'object',
                              'Склад': 'object',
                              'Артикул': 'object',
                              'СреднийОстаток': 'float64',
                              'Продано': 'int64',
                              'ДнейНаОстатке': 'int64'
                          },
                          encoding='cp1251')
    service.log('Данные загружены', f_log, True)
    df_rest = df_date.merge(df_rest, 'left', on='Year_Month')
    service.log('Добавление количества дней в каждом месяце', f_log, True)
    df_rest = df_rest.sort_values(by=['Артикул', 'Склад', 'Year_Month'])
    #df_rest = df_rest.query("Склад == 'Новосибирск' and (Артикул == '2750' or Артикул == '2696')")
    # Перестановка столбцов
    df_rest = column_shift(df_rest, 1, 3, 0, False)
    df_rest = column_shift(df_rest, 3, 5, 1, True)
    file_name = service.naming(start_date, end_date, count=2)
    service.log('Загрузка данных из сводной таблицы: ' + file_name, f_log,
                True)
    df_status = pd.read_csv(forecast_path + file_name,
                            sep=',',
                            encoding='cp1251')
    service.log('Данные загружены', f_log, True)
    df_rest = df_rest.merge(df_status, 'left', on=['Артикул', 'Склад'])
    service.log('Соединение таблиц', f_log, True)
    del df_status
    # Перестановка столбцов
    df_rest = column_shift(df_rest, 3, 6, 4, True)
    df_rest['IsImputation'] = False
    df_rest['Forecasted'] = False
    # Перестановка столбцов
    df_rest = column_shift(df_rest, 7, 8, 4, True)
    # Соединяем никальные значениz Год_месяц из df_date со всеми артикулами и складами
    # Декартово произведение трех таблиц, соединяем с df_rest. Получим строку прогноза
    # Уникальные значениz артикулов
    #df_art = pd.DataFrame(pd.unique(df_rest['Артикул']), columns=['Артикул'])
    # Уникальные значениz складов
    #df_whouse = pd.DataFrame(pd.unique(df_rest['Склад']), columns=['Склад'])
    file_name = service.naming(start_date, end_date, count=3)
    service.log('Запись данных: ' + file_name, f_log, True)
    df_rest.to_csv(forecast_path + file_name, encoding='cp1251', index=False)
    service.log('Запись завершена', f_log, True)
    del df_rest, file_name, df_date, max_date, period_count
Exemplo n.º 18
0
def set_status(request_path, forecast_path, threshhold, config, start_date,
               end_date, f_log):
    service.log('Расчет статусов номенклатуры', f_log, False)
    service.log('Подключение к SQL серверу', f_log, True)
    con = pymssql.connect(host=config[0],
                          user=config[1],
                          password=config[2],
                          database=config[3])
    service.log('Подключение установлено', f_log, True)
    # Загружаем текст запроса списка артикулов
    f = open(request_path + 'requestArt.txt')
    sql_art = f.read()
    f.close()
    # Загружаем список артикулов
    service.log('Чтение из БД', f_log, True)
    df_art_all = pd.read_sql(sql_art, con)
    con.close()
    del con, sql_art
    service.log('Чтение данных завершено', f_log, True)
    # Календарь
    df_date = pd.to_datetime(start_date) + pd.to_timedelta(
        np.arange(((end_date - start_date).days + 1)), 'D')
    df_date = df_date.to_frame()
    df_date = df_date.reset_index()
    df_date = df_date.drop(columns=['index'])
    df_date.rename(columns={0: 'Period'}, inplace=True)
    df_date = df_date.astype({'Period': 'datetime64'})
    df_date['Year_Month'] = df_date['Period'].map(
        lambda x: str(x.year) + '_' + service.fill_month(x.month))
    df_date = df_date.groupby('Year_Month').count()
    df_date = df_date.reset_index()
    df_date.rename(columns={'Period': 'DayCount'}, inplace=True)
    df_date = df_date.reset_index()
    df_date = df_date.drop(columns=['index'])
    file_name = service.naming(start_date, end_date)
    service.log('Загрузка данных из сводной таблицы: ' + file_name, f_log,
                True)
    # Year_Month,Склад,Артикул,СреднийОстаток,Продано,ДнейНаОстатке
    df_rest = pd.read_csv(forecast_path + file_name,
                          sep=',',
                          dtype={
                              'Year_Month': 'object',
                              'Склад': 'object',
                              'Артикул': 'object',
                              'СреднийОстаток': 'float64',
                              'Продано': 'int64',
                              'ДнейНаОстатке': 'int64'
                          },
                          encoding='cp1251')
    df_rest = df_date.merge(df_rest, 'left', on='Year_Month')
    df_rest['Отличие'] = np.where(
        df_rest['ДнейНаОстатке'] < (df_rest['DayCount'] - threshhold), 1, 0)
    service.log('Загрузка уникальных артикулов', f_log, True)
    # Артикул
    df_art = pd.DataFrame(pd.unique(df_rest['Артикул']), columns=['Артикул'])
    df_art = df_art.reset_index()
    df_art = df_art.drop(columns=['index'])
    service.log('Загрузка уникальных складов', f_log, True)
    # Склад
    df_whouse = pd.DataFrame(pd.unique(df_rest['Склад']), columns=['Склад'])
    df_whouse = df_whouse.reset_index()
    df_whouse = df_whouse.drop(columns=['index'])
    full_set = set(df_art_all['Артикул'])
    del df_art_all, df_date
    # Присваиваем статус - Для тех артикулов у которых не было статистики продаж или остатков, назначаем статусы вручную
    present_set = set(df_art['Артикул'])
    df_art_all = pd.DataFrame(full_set.difference(present_set))
    del full_set, present_set
    df_art_all.rename(columns={0: 'Артикул'}, inplace=True)
    #Артикул,Склад,IsEmpty,IsNew,IsGap
    index = pd.MultiIndex.from_product(
        [df_art_all['Артикул'], df_whouse['Склад']],
        names=['Артикул', 'Склад'])
    df_art_all = pd.DataFrame(index=index).reset_index()
    df_art_all['IsEmptySale'] = True
    df_art_all['IsEmpty'] = True
    df_art_all['IsGap'] = False
    df_art_all['IsNew'] = False
    del df_whouse
    # Расчет признаков для тех артикулов, у которых есть статистика
    service.log('Загрузка завершена', f_log, True)
    service.log('Расчт признаков: Наличие продаж; Остатка; Разрыв в остатке',
                f_log, True)
    df_rest = df_rest.sort_values(by=['Артикул', 'Склад', 'Year_Month'])
    #df_rest = df_rest.query("Склад == 'Новосибирск' and (Артикул == '2750' or Артикул == '2696')")
    #df_rest = df_rest.query("Склад == 'Питер'")
    #df_rest = df_rest.query("Склад == 'Ботаково' and (Артикул == '11' or Артикул == '4382' or Артикул == 'фк380')")
    # Расчет сводных признаков до артикула за месяц на складе
    df_rest['ID'] = df_rest['Артикул'] + df_rest['Склад']
    df_rest1 = pd.pivot_table(
        df_rest,
        values=['Продано', 'СреднийОстаток', 'Отличие', 'DayCount'],
        index=['Артикул', 'Склад'],
        aggfunc={
            'Продано': np.sum,
            'СреднийОстаток': np.sum,
            'Отличие': np.sum,
            'DayCount': 'count'
        },
        fill_value=0)
    df_rest1 = df_rest1.reset_index()
    df_rest1['ID'] = df_rest1['Артикул'] + df_rest1['Склад']
    df_rest1 = df_rest1.drop(columns=['Артикул', 'Склад'])
    df_rest1.rename(columns={
        'DayCount': 'ВсегоМес',
        'Продано': 'ВсегоПродано',
        'СреднийОстаток': 'СрОстЗапериод',
        'Отличие': 'ВсегоОтличие'
    },
                    inplace=True)
    result = df_rest.merge(df_rest1, 'left', on='ID')
    del df_rest1
    #Year_Month DayCount Склад Артикул СреднийОстаток Продано ДнейНаОстатке Отличие ВсегоМес ВсегоОтличие ВсегоПродано СрОстЗапериод
    df_rest = df_rest.drop(columns=['ID'])
    # Отбрасываем по месячные данные, оставляем только агрегированные по артикулу, по складу
    result = result.drop(columns=[
        'ID', 'Year_Month', 'DayCount', 'СреднийОстаток', 'Продано',
        'ДнейНаОстатке', 'Отличие'
    ]).drop_duplicates()
    #Склад	Артикул	ВсегоМес	ВсегоОтличие	ВсегоПродано	СрОстЗапериод
    result['IsEmptySale'] = np.where(result['ВсегоПродано'] == 0, True, False)
    result['IsEmpty'] = np.where(result['СрОстЗапериод'] == 0, True, False)
    result['IsGap'] = np.where(result['ВсегоОтличие'] != 0, True, False)
    result = result.drop(
        columns=['ВсегоМес', 'ВсегоОтличие', 'ВсегоПродано', 'СрОстЗапериод'])
    # Ищем новинки только среди тех артикулов, которые имели разрыв в остатках
    service.log('Определение новинок', f_log, True)
    df_art = pd.DataFrame(pd.unique(result.query("IsGap == True")['Артикул']),
                          columns=['Артикул'])
    df_art = df_art.reset_index()
    df_art = df_art.drop(columns=['index'])
    df_art['1'] = 1
    # Формируем исходный фрейм со статистикой по тем артикулам, для которых будем расчитывать статус новинки
    df_res = df_rest.drop(
        columns=['Продано', 'DayCount', 'Отличие', 'СреднийОстаток'])
    df_res = df_res.merge(df_art, 'left', on='Артикул')
    del df_art, df_rest
    df_res = df_res.dropna(how='any')
    df_res = df_res.drop(columns=['1'])
    df_res = df_res.reset_index()
    df_res = df_res.drop(columns=['index'])
    df_res['ID'] = df_res['Артикул'] + df_res['Склад']
    # date_count - количество месяцев всего
    # head_count - количество месяцев, остатка в которых не должно быть, для того, чтобы считать позицию новой
    date_count = pd.DataFrame(pd.unique(df_res['Year_Month']),
                              columns=['Year_Month'])['Year_Month'].count()
    head_count = date_count - threshhold
    # Разделяем исходный фрейм на два, в первом те месяцы, в которых не должно быть остатка
    # во втором, месяцы с остатком
    df_head = df_res.groupby('ID').head(head_count).reset_index(drop=True)
    df_tail = df_res.groupby('ID').tail(threshhold).reset_index(drop=True)
    del date_count, head_count, threshhold
    # Создаем соответствующие сводные за период по складу и артикулу
    df_head = pd.pivot_table(df_head,
                             values=['ДнейНаОстатке'],
                             index=['Артикул', 'Склад'],
                             aggfunc={'ДнейНаОстатке': np.sum},
                             fill_value=0)
    df_tail = pd.pivot_table(df_tail,
                             values=['ДнейНаОстатке'],
                             index=['Артикул', 'Склад'],
                             aggfunc={'ДнейНаОстатке': np.sum},
                             fill_value=0)
    # Присваиваем статус новинки
    df_head['IsNew'] = np.where(df_head['ДнейНаОстатке'] == 0, True, False)
    df_tail['IsNew'] = np.where(df_tail['ДнейНаОстатке'] > 0, True, False)
    # Если оба условия True присваиваем окончательны статус
    df_res = df_head.merge(df_tail, 'left', on=['Артикул', 'Склад'])
    # Соединяем с результирующим фреймом и проставляем в нем, False, для остальных позиций
    del df_head, df_tail
    df_res['IsNew'] = np.where(
        (df_res['IsNew_x'] == True) & (df_res['IsNew_y'] == True), True, False)
    df_res = df_res.drop(
        columns=['ДнейНаОстатке_x', 'ДнейНаОстатке_y', 'IsNew_x', 'IsNew_y'])
    df_res = df_res.reset_index()
    result = result.merge(df_res, 'left', on=['Артикул', 'Склад'])
    del df_res
    result = result.fillna(False)
    # Добавляем номенклатуру без продаж и остатков
    service.log('Добавление статусов номенклатуры без статистики', f_log, True)
    result = result.append(df_art_all, sort=False)
    result = result.reset_index()
    result = result.drop(columns=['index'])
    file_name = service.naming(start_date, end_date, count=2)
    service.log('Запись данных: ' + file_name, f_log, True)
    result.to_csv(forecast_path + file_name, encoding='cp1251', index=False)
    service.log('Запись завершена', f_log, True)
    del df_art_all, end_date, forecast_path, request_path, result, start_date, file_name
Exemplo n.º 19
0
def client_qty_by_day(request_path, forecast_path, config, start_date,
                      end_date, f_log):
    service.log('Расчет количества уникальных клиентов в день', f_log, False)
    service.log('Подключение к SQL серверу', f_log, True)
    con = pymssql.connect(host=config[0],
                          user=config[1],
                          password=config[2],
                          database=config[3])
    service.log('Подключение установлено', f_log, True)
    # Загружаем текст запроса
    f = open(request_path + 'AvgSale.txt')
    set_clqnty_request = f.read()
    f.close()
    # Загружаем фрейм
    service.log('Чтение из БД', f_log, True)
    df_clqnty = pd.read_sql(set_clqnty_request.format(start_date, end_date),
                            con)
    service.log('Чтение данных завершено', f_log, True)
    con.close()
    df_clqnty = df_clqnty.astype({'Period': 'datetime64'})
    service.log('Обработка данных', f_log, True)
    df_clqnty = pd.pivot_table(df_clqnty,
                               values='СреднийОтпуск',
                               index=['Артикул', 'Склад'],
                               aggfunc=np.mean,
                               fill_value=0)
    df_clqnty['СреднийОтпуск'] = np.around(df_clqnty['СреднийОтпуск'],
                                           decimals=2)
    df_clqnty = df_clqnty.reset_index()
    start_date = datetime.datetime.strptime(start_date.replace(",", "-"),
                                            '%Y-%m-%d').date()
    end_date = datetime.datetime.strptime(end_date.replace(",", "-"),
                                          '%Y-%m-%d').date()
    # Имя файла для записи
    file_name = service.naming(start_date, end_date, 'Day')
    service.log('Запись данных в файл: ' + file_name, f_log, True)
    df_clqnty.to_csv(forecast_path + file_name, encoding='cp1251', index=False)
    service.log('Запись завершена', f_log, True)
    del df_clqnty, file_name
Exemplo n.º 20
0
def pivot_data(forecast_path, start_date, end_date, f_log):
    service.log('Соединение всх таблиц, группированных по месяцам в одну',
                f_log, False)
    file_name = service.naming(start_date, end_date, period_name='Month')
    service.log('Загрузка данных из таблицы остатков: ' + file_name, f_log,
                True)
    df_rest = pd.read_csv(forecast_path + file_name,
                          sep=',',
                          encoding='cp1251')
    df_rest.rename(columns={'Остаток': 'СреднийОстаток'}, inplace=True)
    file_name = service.naming(start_date,
                               end_date,
                               period_name='Month',
                               count=2)
    service.log('Загрузка данных из таблицы продаж: ' + file_name, f_log, True)
    df_sell = pd.read_csv(forecast_path + file_name,
                          sep=',',
                          encoding='cp1251')
    df_sell.rename(columns={'Whouse': 'Склад'}, inplace=True)
    df_sell.rename(columns={'Art': 'Артикул'}, inplace=True)
    df_sell.rename(columns={'Qnty': 'Продано'}, inplace=True)
    service.log('Соединение остатков и продаж', f_log, True)
    result = pd.merge(df_rest,
                      df_sell,
                      how='left',
                      on=['Артикул', 'Склад', 'Year_Month'])
    del df_sell, df_rest
    result = result.fillna(0)
    file_name = service.naming(start_date,
                               end_date,
                               period_name='Month',
                               count=3)
    service.log(
        'Загрузка данных из таблицы кол-ва дней на остатке: ' + file_name,
        f_log, True)
    df_count = pd.read_csv(forecast_path + file_name,
                           sep=',',
                           encoding='cp1251')
    service.log('Соединение остатков и продаж с количеством дней на остатке',
                f_log, True)
    result = pd.merge(result,
                      df_count,
                      how='left',
                      on=['Артикул', 'Склад', 'Year_Month'])
    result = result.fillna(0)
    result['Продано'] = np.around(result['Продано'], decimals=0)
    result = result.astype({'Продано': 'int64'})
    result['ДнейНаОстатке'] = np.around(result['ДнейНаОстатке'], decimals=0)
    result = result.astype({'ДнейНаОстатке': 'int64'})
    file_name = service.naming(start_date, end_date, count=4)
    service.log('Запись данных: ' + file_name, f_log, True)
    result.to_csv(forecast_path + file_name, encoding='cp1251', index=False)
    service.log('Запись завершена', f_log, True)
    del df_count, result, start_date, end_date, file_name, forecast_path
Exemplo n.º 21
0
    i = 0
    for itm in plist:
        i += 1
        disassembled = urlparse(itm[0])
        file_ext = splitext(basename(disassembled.path))[1]

        if len(plist) > 1:
            filename = '%s_%s_%s[%i]%s' % (channel, itm[2], decode(_label), i, file_ext)
        else:
            filename = '%s_%s_%s%s' % (channel, itm[2], decode(_label), file_ext)
        localfile  = join(addon.getSetting('downfolder'), filename).encode('utf-8')

        req = Request(itm[0], headers = headers)
        code = 0
        try:
            resp = urlopen(req)
            notify(LANG(30406) % filename)
            code = resp.getcode()
            if code == 200:
                datatowrite = resp.read()
                with open(localfile, 'wb') as f:
                    f.write(datatowrite)
        except HTTPError as e:
            log(repr(e.read))

        if code == 200:
            notify(LANG(30407) % filename)
        else:
            notify(LANG(30408) % filename, False, True)