我正在尝试创建一个 pandas.DataFrame
记录每笔交易记录。
这是我创建的:
def create_blotter():
blotter = []
return blotter
def create_blotter_columns():
columns = ['Buy|Sell', 'Ticker', 'Volume', 'PricePerShare', 'Timestamp', 'TotalCosts']
return columns
class Ledger:
_blotter = create_blotter()
_blotter_columns = create_blotter_columns()
def update_blotter(self, side, ticker, quantity, price, timestamp, transaction):
columns = self._blotter_columns
line = [side, ticker, quantity, price, timestamp, transaction]
self._blotter.append(line)
self._blotter = pd.DataFrame(self._blotter, columns=columns)
self._blotter.sort_index(ascending=False)
return self._blotter
我这样做的原因是,当我如下创建记事本和列时,它将返回元组,因此我无法向其中添加新的列表行。
def create_blotter_frame():
blotter = []
columns = ['Buy|Sell', 'Ticker', 'Volume', 'PricePerShare', 'Timestamp', 'TotalCosts']
return blotter, columns
无论如何,第一个代码第一次工作,但它返回错误消息:
RuntimeWarning: '<' not supported between instances of 'str' and 'int', sort order is undefined for incomparable objects result = result.union(other)
第一次我无法理解它是如何工作的,第二次它返回这样的错误。该列表应该能够包含任何类型的数据。
我的目标是记录所有交易记录并将它们聚合为行
并将其附加到记事本
并最终显示每条交易记录。
示例数据如下:
side = 'Buy'
ticker = 'AAPL'
quantity = 100
price = 100
timestamp = "2018-02-27 23:12:50"
transaction = 100000
每笔交易都会创建带有时间戳的新值。
最佳答案
您可以使用pandas.Dataframe.append()
:
代码:
blotter.append(
dict(zip(columns, (side, ticker, quantity, price, timestamp, transaction))),
ignore_index=True).set_index('Timestamp').sort_index(ascending=False)
测试代码:
class Ledger:
columns = ('Side', 'Ticker', 'Volume', 'PricePerShare',
'Timestamp', 'TotalCosts')
def __init__(self):
self._blotter = pd.DataFrame([], columns=self.columns).set_index(
'Timestamp')
def update_blotter(self, side, ticker, quantity, price, timestamp,
transaction):
self._blotter = self._blotter.append(
dict(zip(self.columns, (
side, ticker, quantity, price, timestamp, transaction))),
ignore_index=True).set_index('Timestamp').sort_index(
ascending=False)
return self._blotter
@property
def blotter(self):
return self._blotter
ledger = Ledger()
ledger.update_blotter(
side='Buy',
ticker='AAPL',
quantity=100,
price=100,
timestamp="2018-02-27 23:12:50",
transaction=100000,
)
print(ledger.blotter)
结果:
Side Ticker Volume PricePerShare TotalCosts
Timestamp
2018-02-27 23:12:50 Buy AAPL 100.0 100.0 100000.0
关于python - 如何将列表作为新行附加到 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49008713/