পান্ডারা কি খেজুরের হিস্টোগ্রাম প্লট করতে পারে?


106

আমি আমার সিরিজটি নিয়েছি এবং এটি জোর করে জেনেছি টাইপ = এর একটি ডেটটাইম কলামে datetime64[ns](যদিও কেবলমাত্র দিনের রেজোলিউশন প্রয়োজন ... কীভাবে পরিবর্তন করবেন তা নিশ্চিত নন)।

import pandas as pd
df = pd.read_csv('somefile.csv')
column = df['date']
column = pd.to_datetime(column, coerce=True)

কিন্তু ষড়যন্ত্র কাজ করে না:

ipdb> column.plot(kind='hist')
*** TypeError: ufunc add cannot use operands with types dtype('<M8[ns]') and dtype('float64')

আমি একটি হিস্টোগ্রাম প্লট করতে চাই যা কেবল সপ্তাহ, মাস বা বছর অনুসারে তারিখের গণনা দেখায়

এটি করার উপায় অবশ্যই আছে pandas?


4
আপনি যে ডিএফ আছে তার একটি নমুনা দেখাতে পারবেন?
jrjc

উত্তর:


172

এই ডিএফ দেওয়া:

        date
0 2001-08-10
1 2002-08-31
2 2003-08-29
3 2006-06-21
4 2002-03-27
5 2003-07-14
6 2004-06-15
7 2003-08-14
8 2003-07-29

এবং, যদি এটি ইতিমধ্যে না হয়:

df["date"] = df["date"].astype("datetime64")

মাসের মধ্যে তারিখের গণনা প্রদর্শন করতে:

df.groupby(df["date"].dt.month).count().plot(kind="bar")

.dt আপনাকে ডেটটাইম বৈশিষ্ট্য অ্যাক্সেস করতে দেয়।

যা আপনাকে দেবে:

দলবদ্ধ তারিখ মাস

আপনি বছর, দিন, ইত্যাদি দ্বারা মাস প্রতিস্থাপন করতে পারেন।

উদাহরণস্বরূপ আপনি যদি বছর এবং মাসের পার্থক্য করতে চান তবে কেবল করুন:

df.groupby([df["date"].dt.year, df["date"].dt.month]).count().plot(kind="bar")

যা দেয়:

দলবদ্ধ তারিখ মাস বছর

আপনি কি চেয়েছিলেন? এটা কি পরিষ্কার?

আশাকরি এটা সাহায্য করবে !


4
আপনার যদি বেশ কয়েক বছর ব্যাপী ডেটা থাকে তবে সমস্ত 'জানুয়ারি' ডেটা একই কলামে প্রতি মাসের জন্য রেখে দেওয়া হবে।
ড্র্যাভিকো

কাজ করে তবে আমার জন্য (প্যান্ডাস 0.15.2) তারিখগুলি মূলধন D দিয়ে লিখতে হবে: df.groupby (df.Date.dt.month) .count ()। প্লট (ধরনের = "বার")
হারবুন

@ ড্রেভিকো: আশা করি আমি বিশ্বাস করি। @ হারবুন: dateবা Dateএখানে কলামের নাম রয়েছে, সুতরাং আপনার তারিখগুলি সহ কলামটিকে df.foo.dt.month
ফু

@ জেনার্জক আবার প্রশ্নটি দেখে আমার ধারণা, আপনি ঠিক বলেছেন। আমার মতো অন্যদের জন্য যারা বছরের সাথে আলাদা করতে হবে তাদের জন্যও কি groupbyকোনও কলামের ডেটা (যেমন: বছর এবং তারিখ) এর দুটি বৈশিষ্ট্যের সংমিশ্রণে যাওয়ার সহজ উপায় আছে ?
ড্র্যাভিকো

তারিখগুলি প্রস্তুত করার কোনও উপায় কি যাতে আমি তারিখের সাথে খেজুরের ইতিহাসের প্লট করতে seaborn.distplot () ব্যবহার করতে পারি?
প্যানক

11

আমি মনে করি রেজাল্ট আপনি যা খুঁজছেন তা হতে পারে। আপনার ক্ষেত্রে, করুন:

df.set_index('date', inplace=True)
# for '1M' for 1 month; '1W' for 1 week; check documentation on offset alias
df.resample('1M', how='count')

এটি কেবল গণনা করছে না প্লট নয়, সুতরাং আপনাকে তখন নিজের প্লট তৈরি করতে হবে।

রেজামাল পান্ডাস পুনরায় নমুনা ডকুমেন্টেশনের ডকুমেন্টেশন সম্পর্কিত আরও তথ্যের জন্য এই পোস্টটি দেখুন

আপনার মতোই আমিও একই সমস্যায় পড়েছি। আশাকরি এটা সাহায্য করবে.


4
howঅবচয় করা হয়। নতুন বাক্য গঠন হয়df.resample('1M').count()
ড্যান উইভার

7

রেন্ডার উদাহরণ

এখানে চিত্র বর্ণনা লিখুন

উদাহরণ কোড

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

"""Create random datetime object."""

# core modules
from datetime import datetime
import random

# 3rd party modules
import pandas as pd
import matplotlib.pyplot as plt


def visualize(df, column_name='start_date', color='#494949', title=''):
    """
    Visualize a dataframe with a date column.

    Parameters
    ----------
    df : Pandas dataframe
    column_name : str
        Column to visualize
    color : str
    title : str
    """
    plt.figure(figsize=(20, 10))
    ax = (df[column_name].groupby(df[column_name].dt.hour)
                         .count()).plot(kind="bar", color=color)
    ax.set_facecolor('#eeeeee')
    ax.set_xlabel("hour of the day")
    ax.set_ylabel("count")
    ax.set_title(title)
    plt.show()


def create_random_datetime(from_date, to_date, rand_type='uniform'):
    """
    Create random date within timeframe.

    Parameters
    ----------
    from_date : datetime object
    to_date : datetime object
    rand_type : {'uniform'}

    Examples
    --------
    >>> random.seed(28041990)
    >>> create_random_datetime(datetime(1990, 4, 28), datetime(2000, 12, 31))
    datetime.datetime(1998, 12, 13, 23, 38, 0, 121628)
    >>> create_random_datetime(datetime(1990, 4, 28), datetime(2000, 12, 31))
    datetime.datetime(2000, 3, 19, 19, 24, 31, 193940)
    """
    delta = to_date - from_date
    if rand_type == 'uniform':
        rand = random.random()
    else:
        raise NotImplementedError('Unknown random mode \'{}\''
                                  .format(rand_type))
    return from_date + rand * delta


def create_df(n=1000):
    """Create a Pandas dataframe with datetime objects."""
    from_date = datetime(1990, 4, 28)
    to_date = datetime(2000, 12, 31)
    sales = [create_random_datetime(from_date, to_date) for _ in range(n)]
    df = pd.DataFrame({'start_date': sales})
    return df


if __name__ == '__main__':
    import doctest
    doctest.testmod()
    df = create_df()
    visualize(df)

5

আমি (1) ম্যাটপ্লটলিবের সাথে ডেটাফ্রেম সরাসরি ব্যবহার না করে এবং (2) বৈশিষ্ট্যটি ব্যবহার করে এর মাধ্যমে কাজ করতে সক্ষম হয়েছি values। উদাহরণ দেখুন:

import matplotlib.pyplot as plt

ax = plt.gca()
ax.hist(column.values)

আমি ব্যবহার না করলে এটি কাজ করে না values, তবে কেন এটি কাজ করে তা আমি জানি না।


3

আপনি যখন যেমন আশা করেন ঠিক তেমন একটি হিস্টোগ্রাম নিতে চান তার জন্য এখানে একটি সমাধান। এটি গ্রুপবাই ব্যবহার করে না, তবে ডেটটাইম মানগুলি পূর্ণসংখ্যায় রূপান্তর করে এবং প্লটের উপর লেবেল পরিবর্তন করে। টিক লেবেল এমনকি লোকেশনে স্থানান্তর করতে কিছু উন্নতি করা যেতে পারে। এছাড়াও কার্নেলের ঘনত্বের অনুমানের প্লট (এবং অন্য কোনও প্লট) সাথে যোগাযোগ করাও সম্ভব।

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame({"datetime": pd.to_datetime(np.random.randint(1582800000000000000, 1583500000000000000, 100, dtype=np.int64))})
fig, ax = plt.subplots()
df["datetime"].astype(np.int64).plot.hist(ax=ax)
labels = ax.get_xticks().tolist()
labels = pd.to_datetime(labels)
ax.set_xticklabels(labels, rotation=90)
plt.show()

ডেটটাইম হিস্টোগ্রাম


1

আমি মনে করি যে সমস্যাটি সমাধান করার জন্য, আপনি এই কোডটি ব্যবহার করতে পারেন, এটি তারিখের টাইপকে প্রকারভেদে রূপান্তর করে:

df['date'] = df['date'].astype(int)
df['date'] = pd.to_datetime(df['date'], unit='s')

শুধুমাত্র তারিখ পাওয়ার জন্য, আপনি এই কোডটি যুক্ত করতে পারেন:

pd.DatetimeIndex(df.date).normalize()
df['date'] = pd.DatetimeIndex(df.date).normalize()

4
এটি অর্ডারড ডেটটাইম হিস্টোগ্রাম কীভাবে প্লট করবেন এই প্রশ্নের উত্তর দেয় না?
lollercoaster

আমি মনে করি

আপনি এই লিঙ্কটি

1

আমি ঠিক এই সঙ্গে সমস্যা ছিল। আমি ধারণা করি যেহেতু আপনি তারিখগুলি নিয়ে কাজ করছেন আপনি কালানুক্রমিক ক্রম সংরক্ষণ করতে চান (যেমনটি আমি করেছি)

কাজটি তখন হয়

import matplotlib.pyplot as plt    
counts = df['date'].value_counts(sort=False)
plt.bar(counts.index,counts)
plt.show()

দয়া করে, যদি কেউ আরও ভাল উপায় সম্পর্কে জানেন তবে দয়া করে কথা বলুন।

সম্পাদনা করুন: উপরের জিনের জন্য, এখানে উপাত্তের একটি নমুনা রয়েছে [আমি এলোমেলোভাবে পুরো ডেটাসেট থেকে নমুনা করেছি, তাই তুচ্ছ হিস্টোগ্রামের ডেটা।]

print dates
type(dates),type(dates[0])
dates.hist()
plt.show()

আউটপুট:

0    2001-07-10
1    2002-05-31
2    2003-08-29
3    2006-06-21
4    2002-03-27
5    2003-07-14
6    2004-06-15
7    2002-01-17
Name: Date, dtype: object
<class 'pandas.core.series.Series'> <type 'datetime.date'>

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-f39e334eece0> in <module>()
      2 print dates
      3 print type(dates),type(dates[0])
----> 4 dates.hist()
      5 plt.show()

/anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in hist_series(self, by, ax, grid, xlabelsize, xrot, ylabelsize, yrot, figsize, bins, **kwds)
   2570         values = self.dropna().values
   2571 
-> 2572         ax.hist(values, bins=bins, **kwds)
   2573         ax.grid(grid)
   2574         axes = np.array([ax])

/anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
   5620             for xi in x:
   5621                 if len(xi) > 0:
-> 5622                     xmin = min(xmin, xi.min())
   5623                     xmax = max(xmax, xi.max())
   5624             bin_range = (xmin, xmax)

TypeError: can't compare datetime.date to float

1

এই সমস্ত উত্তর অত্যধিক জটিল বলে মনে হচ্ছে, কমপক্ষে 'আধুনিক' পান্ডার সাথে এটি দুটি লাইন।

df.set_index('date', inplace=True)
df.resample('M').size().plot.bar()

4
এটি কেবলমাত্র যদি আপনার কাছে থাকে তবে এটি কাজ করে বলে মনে হয় DataFrame, তবে আপনার সমস্ত কিছু যদি হয় তবে তা নয় Series। আপনি কি এই ক্ষেত্রে একটি নোট যুক্ত বিবেচনা করবেন?
ডেভিড জেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.