LoginSignup
5

More than 5 years have passed since last update.

某POSシステムから取り出したデータを処理して商品・時間別の集計表を作る

Last updated at Posted at 2016-11-13

はじめに

数人の知人から「POSから取り出したデータが扱いにくいので集計して下さい」との依頼を受けたので、Pythonで扱いやすいデータに変換するスクリプトを作ってみました。

受け取ったデータを確認

テキストエディタで開いて確認してみる。

zitem.csv
0000,0000,0000,20160000,201600000000,1000
メニューコード/PLUコード,自社コード,商品名称,商品区分,商品区分名称,サブ/セット/コメント 親メニューコード,親メニュー名称,単価,フリー1集計コード,フリー1集計名称,フリー2集計コード,フリー2集計名称,フリー3集計コード,フリー3集計名称,テイクアウト区分,テイクアウト区分名称,原単価,GPコード,GP名称,DPコード,DP名称,時間帯開始時間,時間帯終了時間,時間帯01出数(点数),時間帯開始時間,時間帯終了時間,時間帯02出数(点数),時間帯開始時間,時間帯終了時間,時間帯03出数(点数),時間帯開始時間,時間帯終了時間,時間帯04出数(点数),時間帯開始時間,時間帯終了時間,時間帯05出数(点数),時間帯開始時間,時間帯終了時間,時間帯06出数(点数),時間帯開始時間,時間帯終了時間,時間帯07出数(点数),時間帯開始時間,時間帯終了時間,時間帯08出数(点数),時間帯開始時間,時間帯終了時間,時間帯09出数(点数),時間帯開始時間,時間帯終了時間,時間帯10出数(点数),時間帯開始時間,時間帯終了時間,時間帯11出数(点数),時間帯開始時間,時間帯終了時間,時間帯12出数(点数),時間帯開始時間,時間帯終了時間,時間帯13出数(点数),時間帯開始時間,時間帯終了時間,時間帯14出数(点数),時間帯開始時間,時間帯終了時間,時間帯15出数(点数),時間帯開始時間,時間帯終了時間,時間帯16出数(点数),時間帯開始時間,時間帯終了時間,時間帯17出数(点数),時間帯開始時間,時間帯終了時間,時間帯18出数(点数),時間帯開始時間,時間帯終了時間,時間帯19出数(点数),時間帯開始時間,時間帯終了時間,時間帯20出数(点数),時間帯開始時間,時間帯終了時間,時間帯21出数(点数),時間帯開始時間,時間帯終了時間,時間帯22出数(点数),時間帯開始時間,時間帯終了時間,時間帯23出数(点数),時間帯開始時間,時間帯終了時間,時間帯24出数(点数),エンプロイ出数,プロモーション出数,商品別データ1,商品別データ2,商品別データ3,時間帯01 値割引 点数,時間帯01 値割引 金額,時間帯01 プロモ 出数,時間帯01 予備,時間帯02 値割引 点数,時間帯02 値割引 金額,時間帯02 プロモ 出数,時間帯02 予備,時間帯03 値割引 点数,時間帯03 値割引 金額,時間帯03 プロモ 出数,時間帯03 予備,時間帯04 値割引 点数,時間帯04 値割引 金額,時間帯04 プロモ 出数,時間帯04 予備,時間帯05 値割引 点数,時間帯05 値割引 金額,時間帯05 プロモ 出数,時間帯05 予備,時間帯06 値割引 点数,時間帯06 値割引 金額,時間帯06 プロモ 出数,時間帯06 予備,時間帯07 値割引 点数,時間帯07 値割引 金額,時間帯07 プロモ 出数,時間帯07 予備,時間帯08 値割引 点数,時間帯08 値割引 金額,時間帯08 プロモ 出数,時間帯08 予備,時間帯09 値割引 点数,時間帯09 値割引 金額,時間帯09 プロモ 出数,時間帯09 予備,時間帯10 値割引 点数,時間帯10 値割引 金額,時間帯10 プロモ 出数,時間帯10 予備,時間帯11 値割引 点数,時間帯11 値割引 金額,時間帯11 プロモ 出数,時間帯11 予備,時間帯12 値割引 点数,時間帯12 値割引 金額,時間帯12 プロモ 出数,時間帯12 予備,時間帯13 値割引 点数,時間帯13 値割引 金額,時間帯13 プロモ 出数,時間帯13 予備,時間帯14 値割引 点数,時間帯14 値割引 金額,時間帯14 プロモ 出数,時間帯14 予備,時間帯15 値割引 点数,時間帯15 値割引 金額,時間帯15 プロモ 出数,時間帯15 予備,時間帯16 値割引 点数,時間帯16 値割引 金額,時間帯16 プロモ 出数,時間帯16 予備,時間帯17 値割引 点数,時間帯17 値割引 金額,時間帯17 プロモ 出数,時間帯17 予備,時間帯18 値割引 点数,時間帯18 値割引 金額,時間帯18 プロモ 出数,時間帯18 予備,時間帯19 値割引 点数,時間帯19 値割引 金額,時間帯19 プロモ 出数,時間帯19 予備,時間帯20 値割引 点数,時間帯20 値割引 金額,時間帯20 プロモ 出数,時間帯20 予備,時間帯21 値割引 点数,時間帯21 値割引 金額,時間帯21 プロモ 出数,時間帯21 予備,時間帯22 値割引 点数,時間帯22 値割引 金額,時間帯22 プロモ 出数,時間帯22 予備,時間帯23 値割引 点数,時間帯23 値割引 金額,時間帯23 プロモ 出数,時間帯23 予備,時間帯24 値割引 点数,時間帯24 値割引 金額,時間帯24 プロモ 出数,時間帯24 予備
0000000000000,0000000000000,サンプル1          ,00,メイン  ,0000,                    ,+001200,01,フリー1            ,01,フリー2            ,01,フリー3            ,0,店内飲食,+000000,01,食事                ,01,水                  ,0000,0059,+0000,0100,0159,+0000,0200,0259,+0000,0300,0359,+0000,0400,0459,+0000,0500,0559,+0000,0600,0659,+0000,0700,0759,+0000,0800,0859,+0000,0900,0959,+0000,1000,1059,+0000,1100,1159,+0000,1200,1259,+0000,1300,1359,+0000,1400,1459,+0000,1500,1559,+0000,1600,1659,+0000,1700,1759,+0002,1800,1859,+0000,1900,1959,+0000,2000,2059,+0000,2100,2159,+0000,2200,2259,+0000,2300,2359,+0000,+0000,+0000,+0000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000
0000000000000,0000000000000,テスト サンプル   ,00,メイン  ,0000,                    ,+000400,01,フリー1            ,01,フリー2            ,01,フリー3            ,0,店内飲食,+000000,01,食事                ,01,水                  ,0000,0059,+0000,0100,0159,+0000,0200,0259,+0000,0300,0359,+0000,0400,0459,+0000,0500,0559,+0000,0600,0659,+0000,0700,0759,+0000,0800,0859,+0000,0900,0959,+0000,1000,1059,+0000,1100,1159,+0000,1200,1259,+0000,1300,1359,+0000,1400,1459,+0000,1500,1559,+0000,1600,1659,+0000,1700,1759,+0000,1800,1859,+0000,1900,1959,+0000,2000,2059,+0000,2100,2159,+0000,2200,2259,+0000,2300,2359,+0000,+0000,+0000,+0000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000,+0000,+0000000,+0000,+0000
(以下、略)

...確かにこれをそのまま使うのは厳しい(-_-;)

データの内容や要望について少し聞いてみると、
- メニューコードは13桁あるけど0〜9999を使用している
- メニューコードを設定していても販売しなかった商品名はCSVには含まれない
- 0時〜23時までの商品別の販売数が欲しい
- このファイルは1日ごとに出力され、毎日作成する
- 最終的には複数日のファイルを結合させたい

出力CSVのデータ形式

ヘッダーはメニューコードと商品名、単価として、以降時間ごとに出た商品の数を整理します。

output.csv
メニューコード,0,1,2,〜,9999
商品名称,サンプル1,サンプル2,サンプル3,〜,サンプル10000
単価,100,200,300,〜10000
2016/1/1 0:00,1,2,3,〜,10
2016/1/1 1:00,4,5,6,〜,0
2016/1/1 2:00,6,2,9,〜,20
(中略)
2016/1/1 23:00,1,2,3,〜,10

ライブラリの読み込み

import pandas as pd
import os
import datetime

ファイルの読み込み

ファイル名が固定とのことなので、ファイル名を設定し、作成日から日付のデータを取得して読み込む。

# ファイル名
filename = "zitem.csv"    

# 日付データ取得
dt = datetime.datetime.fromtimestamp(os.stat(filename).st_mtime)
y = dt.year
m = dt.month
d = dt.day

# データ読み込み
df = pd.read_csv(filename,encoding="SHIFT-JIS",skiprows=1)

商品名と価格を取得

商品名と価格について、CSVのデータに入っている時と入っていない時があるとのことなので、今後複数のデータをまとめることを考慮し、とりあえず枠を用意しておいてデータがある部分を埋めていくことにする。

cnt = 10001

names = [""] * cnt
prices = [0] * cnt

for i in range(len(df)):
    key = int(df.loc[i][0]) + 1
    names[key] = df.loc[i][2]
    prices[key] = int(df.loc[i][7])

0〜9999なので、10000種類のデータなのですが、日時データを付与するので10001個のデータ配列にしてます。

販売数を取得

23列目から3列ごとに販売数のデータが入っているようなので、24時間分のデータを3列ごとに取得する。

x = 23

datas = []

for i in range(24):
    items = [0] * cnt
    items[0] = datetime.datetime(y,m,d,i,0).strftime("%Y-%m-%d %H:%M")
    for j in range(len(df)):
        key = df.loc[j][0] + 1
        num = int(df.loc[j][x])
        items[key] = num
    datas.append(items)
    x += 3

ファイル出力

取得した情報をCSVファイルに保存。

f = open('output.csv', 'w')

sName = ""
sPrice = ""

for i in range(len(names)):
    sName += names[i] + ","
    sPrice += str(prices[i]) + ","

f.write(sName + "\n" + sPrice + "\n")

for i in range(len(datas)):
    data = datas[i]
    sData = ""
    for j in range(len(data)):
        sData += str(data[j]) + ","
    f.write(sData + "\n")

f.close()

ここまでのコードを「pos.py」として保存し、実行。

$ python pos.py

できた!

全ソースコード掲載

pos.py
import pandas as pd
import os
import datetime

# ファイル名
filename = "zitem.csv"    

# 日付データ取得
dt = datetime.datetime.fromtimestamp(os.stat(filename).st_mtime)
y = dt.year
m = dt.month
d = dt.day

# データ読み込み
df = pd.read_csv(filename,encoding="SHIFT-JIS",skiprows=1)

# 必要なデータを取得

cnt = 10001

names = [""] * cnt
prices = [0] * cnt

for i in range(len(df)):
    key = int(df.loc[i][0]) + 1
    names[key] = df.loc[i][2]
    prices[key] = int(df.loc[i][7])

x = 23

datas = []

for i in range(24):
    items = [0] * cnt
    items[0] = datetime.datetime(y,m,d,i,0).strftime("%Y-%m-%d %H:%M")
    for j in range(len(df)):
        key = df.loc[j][0] + 1
        num = int(df.loc[j][x])
        items[key] = num
    datas.append(items)
    x += 3

# ファイル出力

f = open('output.csv', 'w')

sName = ""
sPrice = ""

for i in range(len(names)):
    sName += names[i] + ","
    sPrice += str(prices[i]) + ","

f.write(sName + "\n" + sPrice + "\n")

for i in range(len(datas)):
    data = datas[i]
    sData = ""
    for j in range(len(data)):
        sData += str(data[j]) + ","
    f.write(sData + "\n")

f.close()

さいごに

きっともっといい方法があるに違いない!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5