熊猫:确定两个时间序列在何处相交以及在哪个方向上相交

时间:2018-10-01 02:54:28

标签: python pandas

这是此问题的后续措施:determine the coordinates where two pandas time series cross, and how many times the time series cross

我的Pandas数据框中有2个序列,想知道它们相交的位置。

   A    B
0  1  0.5
1  2  3.0
2  3  1.0
3  4  1.0
4  5  6.0

使用此代码,我们可以创建第三列,每当两个系列相交时将包含True:

df['difference'] = df.A - df.B

df['cross'] = np.sign(df.difference.shift(1))!=np.sign(df.difference)
np.sum(df.cross)-1

现在,我要知道相交发生在哪个方向,而不是简单的True或False。例如:从1到2,向上相交,从2到3向下相交,从3到4无相交,从4到5向上相交。

enter image description here

   A    B  Cross_direction
0  1  0.5  None
1  2  3.0  Upwards
2  3  1.0  Downwards
3  4  1.0  None
4  5  6.0  Upwards

在伪代码中,应该像这样:

cross_directions = [none, none, ... * series size]
for item in df['difference']:
    if item > 0 and next_item < 0:
        cross_directions.append("up")
    elif item < 0 and next_item > 0:
        cross_directions.append("down")

问题在于此语法无法使用next_item(我们使用.shift(1)在原始语法中获得了该语法),并且需要很多代码。

我应该考虑使用可以一次将循环按2个项目分组的方法来实现上述代码吗?还是有一个更简单,更优雅的解决方案,例如上一个问题?

2 个答案:

答案 0 :(得分:2)

您可以使用numpy.select

下面的代码应该对您有用,代码如下:

df = pd.DataFrame({'A': [1, 2, 3, 4,5], 'B': [0.5, 3, 1, 1, 6]})
df['Diff'] = df.A - df.B
df['Cross'] = np.select([((df.Diff < 0) & (df.Diff.shift() > 0)), ((df.Diff > 0) & (df.Diff.shift() < 0))], ['Up', 'Down'], 'None')

#Output dataframe
   A    B  Diff Cross
0  1  0.5   0.5  None
1  2  3.0  -1.0    Up
2  3  1.0   2.0  Down
3  4  1.0   3.0  None
4  5  6.0  -1.0    Up

我希望这在某种程度上对您有所帮助。

答案 1 :(得分:0)

我非常糟糕和多余的解决方案。

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> {

    private Map<Integer, Integer> mSpinnerSelectedItem = new HashMap<Integer, Integer>();

    //this context we will use to inflate the layout
     //Remove this..Please
     // CheckBox checkBox;

    //private Context mCtx;
    private SearchableSpinner spinner;

    //we are storing all the products in a list
    private List<Product> productList;

    private Activity create;

    public  ProductAdapter(Activity activity){
        create = activity;
    }

    //getting the context and product list with constructor
    public  ProductAdapter(Activity activity, List<Product> productList) {
       // this.mCtx = mCtx;
        create = activity;
        this.productList = productList;
    }

    @Override
    public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //inflating and returning our view holder
        LayoutInflater inflater = LayoutInflater.from(create);
        View view = inflater.inflate(R.layout.layout_products, null);
        return new ProductViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ProductViewHolder holder, final int position) {
        // //getting the product of the specified position


        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(create, R.layout.item_spinner_layout,
                Product.getSpinnerItemsList());
        spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        holder.spinner.setAdapter(spinnerArrayAdapter);

        holder.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int mPosition, long id) {
                mSpinnerSelectedItem.put(position, mPosition);

                TextView mTextView = view.findViewById(R.id.mSpinnerText);
               /* Toast.makeText(create, "Selected Item: " + mTextView.getText().toString(), Toast.LENGTH_LONG).show();
                Log.e("***************", "Selected Item: " + mTextView.getText().toString());*/
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        //binding the data with the viewholder views
        if (mSpinnerSelectedItem.containsKey(position)) {
            holder.spinner.setSelection(mSpinnerSelectedItem.get(position));
        }

        holder.getView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(create);

                // set title
                alertDialogBuilder.setTitle("Delete Item");

                // set dialog message
                alertDialogBuilder
                        .setMessage("Are you sure you want to delete this item?")
                        .setCancelable(false)
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // if this button is clicked, close
                                // current activity

                                productList.remove(position);
                                notifyItemRemoved(position);

                                Toast.makeText(create, "Item removed.",Toast.LENGTH_LONG).show();
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // if this button is clicked, just close
                                // the dialog box and do nothing
                                dialog.cancel();
                            }
                        });

                // create alert dialog
                AlertDialog alertDialog = alertDialogBuilder.create();

                // show it
                alertDialog.show();
            }
        });

        //checkbox ticked
        //here do holder.checkbox take your view holder checkbox

        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // makes the set disappear when checkbox is ticked.

                productList.remove(position);
                notifyItemRemoved(position);
                notifyDataSetChanged();

                Toast.makeText(create, "Done!",Toast.LENGTH_LONG).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return productList.size();
    }

    class ProductViewHolder extends RecyclerView.ViewHolder {

        SearchableSpinner spinner;
        EditText editText;
        TextView textView5;
        CheckBox checkBox;
        LinearLayout linearLayout;
        View rootView;

        public ProductViewHolder(View itemView) {
            super(itemView);

            spinner = itemView.findViewById(R.id.spinner);
            editText = itemView.findViewById(R.id.editText);
            textView5 = itemView.findViewById(R.id.textView5);
            checkBox = itemView.findViewById(R.id.checkBox);
            rootView = itemView.findViewById(R.id.linearLayout);
        }

        public View getView() {
            return rootView;
        }
    }
}