【问题标题】:Updating a data frame using rows from another data frame使用来自另一个数据帧的行更新数据帧
【发布时间】:2015-12-31 20:50:35
【问题描述】:

如果您能帮我解决这个问题,请提前感谢您。我想要完成的是在同一日期使用另一个数据框(indexed_orders)更新一个用日期时间索引(我的交易数据框)填充零的数据框。我的代码如下:

import pandas as pd
import numpy as np
import os
import csv


orders = pd.read_csv('./orders/orders.csv', parse_dates=True, sep=',', dayfirst=True) #initiate orders data frame from csv data file
indexed_orders = orders.set_index(['Date']) #set Date as index for orders
print indexed_orders

symbol_list = orders['Symbol'].tolist() #creates list of symbols
symbols = list(set(symbol_list)) #gets rid of duplicates in list


dates_list = orders['Date'].tolist() #creates list of order dates
dates_orders = list(set(dates_list)) #gets rid of duplicates in list


start_date = '2011-01-05' #establish date range
end_date = '2011-01-20'

dates = pd.date_range(start_date, end_date) #establish dates from start_date and end_date

trade = pd.DataFrame(0, index = dates, columns = symbols) #establish trade data frame
trade['Cash'] = 0 #add column for future calculations
print trade

indexed_orders 的哪些输出:

Date         Symbol Order  Shares
2011-01-10   AAPL   BUY    1500
2011-01-13   AAPL  SELL    1500
2011-01-13    IBM   BUY    4000
2011-01-26   GOOG   BUY    1000
2011-02-02    XOM  SELL    4000
2011-02-10    XOM   BUY    4000
2011-03-03   GOOG  SELL    1000
2011-03-03    IBM  SELL    2200
2011-06-03    IBM  SELL    3300
2011-05-03    IBM   BUY    1500
2011-06-10   AAPL   BUY    1200
2011-08-01   GOOG   BUY      55
2011-08-01   GOOG  SELL      55
2011-12-20   AAPL  SELL    1200

并为交易输出以下内容:

            GOOG  AAPL  XOM  IBM  Cash
2011-01-05     0     0    0    0     0
2011-01-06     0     0    0    0     0
2011-01-07     0     0    0    0     0
2011-01-08     0     0    0    0     0
2011-01-09     0     0    0    0     0
2011-01-10     0     0    0    0     0
2011-01-11     0     0    0    0     0
2011-01-12     0     0    0    0     0
2011-01-13     0     0    0    0     0
2011-01-14     0     0    0    0     0
2011-01-15     0     0    0    0     0
2011-01-16     0     0    0    0     0
2011-01-17     0     0    0    0     0
2011-01-18     0     0    0    0     0
2011-01-19     0     0    0    0     0
2011-01-20     0     0    0    0     0

我想在我的 idexed_orders 中的日期更新我的交易数据框,在正确的“符号”下的列中插入“股票”的数量(这是交易中的 AAPL、IBM、GOOG 和 XOM 名称) .当 indexed_orders 中的“订单”列指定“卖出”时,我还希望“股票”的值为负数。换句话说,我正在尝试编写更新交易数据框的代码,以便: 印刷贸易

            GOOG  AAPL  XOM  IBM  Cash
2011-01-05     0     0    0    0     0
2011-01-06     0     0    0    0     0
2011-01-07     0     0    0    0     0
2011-01-08     0     0    0    0     0
2011-01-09     0     0    0    0     0
2011-01-10     0  1500    0    0     0
2011-01-11     0     0    0    0     0
2011-01-12     0     0    0    0     0
2011-01-13     0 -1500    0 4000     0
2011-01-14     0     0    0    0     0
2011-01-15     0     0    0    0     0
2011-01-16     0     0    0    0     0
2011-01-17     0     0    0    0     0
2011-01-18     0     0    0    0     0
2011-01-19     0     0    0    0     0
2011-01-20     0     0    0    0     0

我认为需要对嵌套布尔语句进行某种迭代,但我肯定很难弄清楚。特别是,我很难想出一种方法来遍历行并根据索引日期时间进行更新。

任何帮助将不胜感激。

【问题讨论】:

    标签: python loops pandas boolean updates


    【解决方案1】:

    首先,您可以使用Order 列来签署股份变更。然后,您可以按DateSymbol 分组,并通过汇总订单进行汇总。这将为您提供所有独特日期的Series 订单和那些日子交易的Symbols。最后,使用unstackSeries 转换为表格格式。

    import numpy as np
    import pandas as pd
    
    df = pd.io.parsers.read_csv('temp.txt', sep = '\t')
    
    print df
    
    '''
            Date Symbol Order  Shares
    0    1/10/11   AAPL   BUY    1500
    1    1/13/11   AAPL  SELL    1500
    2    1/13/11    IBM   BUY    4000
    3    1/26/11   GOOG   BUY    1000
    4     2/2/11    XOM  SELL    4000
    5    2/10/11    XOM   BUY    4000
    6     3/3/11   GOOG  SELL    1000
    7     3/3/11    IBM  SELL    2200
    8     6/3/11    IBM  SELL    3300
    9     5/3/11    IBM   BUY    1500
    10   6/10/11   AAPL   BUY    1200
    11    8/1/11   GOOG   BUY      55
    12    8/1/11   GOOG  SELL      55
    13  12/20/11   AAPL  SELL    1200
    '''
    
    df['SharesChange'] = df.Shares * df.Order.apply(lambda o: 1 if o == 'BUY' else -1)
    
    df = df.groupby(['Date', 'Symbol']).agg({'SharesChange' : np.sum}).unstack().fillna(0)
    
    print df
    '''
             SharesChange
    Symbol           AAPL  GOOG   IBM   XOM
    Date
    1/10/11          1500     0     0     0
    1/13/11         -1500     0  4000     0
    1/26/11             0  1000     0     0
    12/20/11        -1200     0     0     0
    2/10/11             0     0     0  4000
    2/2/11              0     0     0 -4000
    3/3/11              0 -1000 -2200     0
    5/3/11              0     0  1500     0
    6/10/11          1200     0     0     0
    6/3/11              0     0 -3300     0
    8/1/11              0     0     0     0
    '''
    

    【讨论】:

    • 谢谢。这看起来像是将我的 indexed_orders 转换为与我的交易数据框中的相应列对齐的好方法。但是,我仍然坚持如何根据这些行更新我的交易数据框。有什么想法吗?
    • @adisciu,我在 Yakym Priozhenko 的 df 和您的交易之间看到的唯一区别是存在与没有交易活动的日期相对应的行。如果您想恢复那些空行,您可以使用所需的日期范围重新索引数据框。
    • @jgloves 我希望交易仅包含为交易指定的日期时间范围内的日期。这将在我的程序中发生变化,但 indexed_orders 数据框将保持不变。如何为我想要的日期范围重新索引像 Priozhenko 的 df 这样的数据框?这会根据日期按顺序排列行吗?
    • @jgloves 当我尝试重新索引到我想要的日期范围(=我上面的代码中的日期)时,我的符号下的列填充了 NaN。我做错了吗?我用 df = df.reindex(index=dates)
    • @adisciu 我在 Yakym 的回答中添加了一个编辑,但它正在等待审核。基本上,您需要在重新索引之前将 Date 列中的日期转换为 Pandas 日期时间数据类型。然后使用 df.reindex(index=dates, fill_value = 0)
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 2016-12-20
    • 2020-09-20
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2019-01-28
    • 2021-06-19
    相关资源
    最近更新 更多