1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python:PythonでVlookup的な事をやってみた#2

Last updated at Posted at 2020-10-26

   ---目的---
   在庫情報など日々変わる数値をデータベースから読み込んで指定のデータに流し込んで
   指定フォーマットで書き出しする。

   使用インタープリタ:Python3.8

   ---投稿者の作業環境---
   Windows10Pro 64Bit

コード

# !/usr/bin/env python
# -*- coding: utf-8 -*-

### 使用モジュール###
import sqlite3
import pandas as pd
import datetime

###### タイムスタンプの取得
ThisDate = datetime.datetime.today().strftime("%Y%m%d")

# CurStocks <<参照元の在庫マスタのデータベースを入れるデータフレーム用の変数


###### 在庫情報マスタを在庫参照元データフレームに変換
# ここでは、在庫参照元のデータをSQlite3形式のファイルから引っ張ってますが、
# お好きなな形式をPandasでデータフレーム変換してください。

dbpath = 'C:/参照元/在庫SQLite/Zaiko.db' 
conn = sqlite3.connect(dbpath)
cursor = conn.cursor()
cursor=cursor.execute('SELECT * FROM TurnOver_Data') 
CurStocks = pd.DataFrame(cursor.fetchall())
CurStocks.columns=["index", "商品名", "商品CD", "バーコード", "在庫"]
conn.close()
# (備考)↑上記のやり方「cursor.fetchall()」だと
#      カラムのタイトルが抜けてしまうので、後から足してます。
# 参照元のデータは上記のカラムタイトルという前提で。


###### 流し込み先のSqlite形式のファイルを用意

print("●在庫連絡ファイルの更新")
dbpath = 'C:/流し込み先/得意先_在庫FMT.db'
conn = sqlite3.connect(dbpath)
df_files=("C:/流し込み先ベースファイル/得意先_在庫FMT.xlsx")
# エクセルファイルで別で流し込み先のリストを作ってますが、これは対象アイテムが増えた時など
# メンテしやすいようにエクセルファイルでベースのリストを作っておいて書き換えるというやり方の為

df = pd.read_excel(df_files,encoding="cp932")
Chlist = (df["JAN"].transpose())
# df["JAN"].transpose()<<「JAN」のデータを1件つづ読み込めるように変換してます。
# 流し込み先のカラムに読み取りキーとなる「JAN」というタイトルをつけてます。


###### 在庫参照用のデータを回して順次参照していく。

for item in Chlist:
    CurStocksult = CurStocks.query('バーコード == @item')
    #ここでさっき作った参照元のデータフレームのキーとなるJANコードを参照して回していきます。
    #参照元カラム:「バーコード」 流し込み先:「JAN」というカラムのタイトル
    #ここで参照元のデータフレームから1件つづ読み取りを行っていきます。

    if len(CurStocksult) >= 1:
        #在庫数カウント:参照元フレームに当該JANがある場合は、当該データ位置を参照
        CurStocksult = (CurStocksult.iat[0, 3])

        # インデックス番号の取得(2次配列のリストのデータ位置)
        DFindex=int(df.query('JAN == @item').index.astype("int64").values[0])

        if(CurStocksult) < 3 :
            Buf = 0
            df.iat[DFindex, 7] = "欠品"
        else:
            Buf=CurStocksult
            df.iat[DFindex, 7] = ""
            
        df.iat[DFindex, 6]=Buf
        df.iat[DFindex, 8]=ThisDate
        # 流し込み先の6列が在庫列、7列目がフラグ欄、8列目が更新したタイムスタンプという設定

df.to_sql("Stock_Data", conn, if_exists="replace")
df.to_csv('C:/更新した在庫データ.csv')
# SqliteとCSVを更新。

conn.close()
print("●更新を完了しました")

del df
del df_files

詰まったポイント等

1:ループ処理用のリストの作成
Chlist = (df["JAN"].transpose())
流し込み先のリストを1件づつ処理するために、流し込み先のキーとなるリストを
ループで回せるように変換したところ

2:インデックス番号の取得
DFindex=int(df.query('JAN == @item').index.astype("int64").values[0])
2次配列のリストのデータ位置(Y軸?)を取得するための変換処理

1
4
2

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
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?