Saya mencoba menggunakan Pandas untuk memproses dan memplot data dari file CSV. Skrip aslinya berasal dari di sini dan saya berhasil menjalankannya beberapa tahun yang lalu. Sekarang, bagaimanapun, bahkan dengan dataset yang sama selalu gagal dengan pengecualian yang saya tidak mengerti.

Ini adalah kode yang saya gunakan saat ini. Saya telah membagi baris kedua hingga terakhir dari file asli untuk dapat menunjukkan dengan tepat asal pengecualian:

#!/usr/bin/env python3

"""Plot bank account balance in CSV-MT940 format based on a starting balance."""

import argparse
import os

parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("filename", help="File to parse")
parser.add_argument("start_balance", help="Balance at beginning of file", type=float)
args = parser.parse_args()

# Import after argument parsing to reduce startup time if help flag passed/invalid arguments
import matplotlib.pyplot as plt
import pandas as pd

verlauf = pd.read_csv(os.path.expanduser(args.filename), sep=";", encoding="ISO-8859-1", decimal=",")
verlauf["Date"] = pd.to_datetime(verlauf.Buchungstag, format="%d.%m.%y")
verlauf = verlauf.reindex(index=verlauf.index[::-1])
verlauf["Kumulativer Umsat"] = verlauf.Betrag.cumsum()
verlauf["Kontostand"] = verlauf["Kumulativer Umsat"] + args.start_balance
verlauf.index = verlauf.Date
step1 = verlauf.resample("D")
step2 = step1.max()  # <- this is where it fails
step3 = step2.interpolate()
step4 = step3.Kontostand
step4.plot()
plt.show()

Saya dapat merebus file input menjadi yang berikut:

"Buchungstag";"Betrag";"Info"
"08.05.20";"1,00";""
"08.05.20";"1,00";"some info"

Pengecualian yang saya dapatkan terlihat seperti ini:

Traceback (most recent call last):
  File "/home/max/Entwicklung/python/plot_expenses/./plot_expenses.py", line 24, in <module>
    step2 = step1.max()  # <- this is where it fails
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/resample.py", line 957, in f
    return self._downsample(_method, min_count=min_count)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/resample.py", line 1080, in _downsample
    result = obj.groupby(self.grouper, axis=self.axis).aggregate(how, **kwargs)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/groupby/generic.py", line 945, in aggregate
    result, how = aggregate(self, func, *args, **kwargs)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/aggregation.py", line 579, in aggregate
    return obj._try_aggregate_string_function(arg, *args, **kwargs), None
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/base.py", line 315, in _try_aggregate_string_function
    return f(*args, **kwargs)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/groupby/groupby.py", line 1676, in max
    return self._agg_general(
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/groupby/groupby.py", line 1024, in _agg_general
    result = self._cython_agg_general(
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/groupby/generic.py", line 1015, in _cython_agg_general
    agg_mgr = self._cython_agg_blocks(
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/groupby/generic.py", line 1118, in _cython_agg_blocks
    new_mgr = data.apply(blk_func, ignore_failures=True)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/internals/managers.py", line 425, in apply
    applied = b.apply(f, **kwargs)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/internals/blocks.py", line 380, in apply
    return self._split_op_result(result)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/internals/blocks.py", line 416, in _split_op_result
    result = self.make_block(result)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/internals/blocks.py", line 286, in make_block
    return make_block(values, placement=placement, ndim=self.ndim)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/internals/blocks.py", line 2742, in make_block
    return klass(values, ndim=ndim, placement=placement)
  File "/home/max/Entwicklung/python/plot_expenses/venv/lib/python3.9/site-packages/pandas/core/internals/blocks.py", line 142, in __init__
    raise ValueError(
ValueError: Wrong number of items passed 1, placement implies 2

Mungkin ini hanya pengalaman saya yang terbatas dengan Pandas, tetapi pesan kesalahan ini sangat tidak membantu saya.

Saya perhatikan bahwa angka pertama dalam pesan kesalahan sesuai dengan jumlah nilai yang tidak kosong dari baris yang lebih pendek (dalam hal ini yang pertama) dikurangi satu, sedangkan angka kedua sesuai dengan jumlah nilai yang tidak kosong dari baris yang lebih panjang kurang satu. Urutan baris tidak masalah. Artinya, file CSV berikut menghasilkan pesan "Jumlah item yang lulus salah 2, penempatan menyiratkan 3":

"Buchungstag";"Betrag";"Info";"asdf"
"08.05.20";"1,00";"some info";"a"
"08.05.20";"1,00";"";"a"

Jika kedua baris memiliki jumlah nilai kosong yang sama, tidak ada pengecualian.

Selain itu, saya cukup tersesat, bahkan setelah menggali kode Panda selama sekitar dua jam. Saya sangat menghargai bantuan dari seseorang yang lebih berpengalaman dengan Panda daripada saya.

-1
Max Klein 18 Mei 2021, 01:03

1 menjawab

Jawaban Terbaik

Ini lebih merupakan solusi daripada mengatasi akar penyebab.

Masalahnya adalah karena nilai na di beberapa kolom. Anda dapat menyiasatinya dengan menggunakan keep_default_na=False di read_csv untuk mendapatkan string kosong alih-alih nilai na di kolom Info:

verlauf = pd.read_csv(os.path.expanduser(args.filename), sep=";", encoding="ISO-8859-1", decimal=",", keep_default_na=False)
0
Stef 18 Mei 2021, 13:39