teleren/devto huggingface dataset:
Understanding Python's slice notation
Tags: python, beginners, programming
Published: 2022-10-08 06:58:06

### Basic syntax

Python's slice notation is used to return a list or a portion of a list. The basic syntax is as follows:

```py
[start_at:stop_before:step]
```

Where `start_at` is the index of the first item to be returned (included), `stop_before` is the index of the element before which to stop (not included) and `step` is the stride between any two items.

All three of the arguments are optional, meaning you can omit any of them. For example:

```py
nums = [1, 2, 3, 4, 5]

nums[1:4]     # [2, 3, 4]   (start at 0, stop before 4)
nums[2:]      # [3, 4, 5]   (start at 0, stop at end of list)
nums[:3]      # [1, 2, 3]   (start at 0, stop before 3)
nums[1:4:2]   # [2, 4]      (start at 1, stop before 4, every 2nd element)
nums[2::2]    # [3, 5]      (start at 2, stop at end of list, every 2nd element)
nums[:3:2]    # [1, 3]      (start at 0, stop before 3, every 2nd element)
nums[::2]     # [1, 3, 5]   (start at 0, stop at end of list, every 2nd element)
nums[::]      # [1, 2, 3, 4, 5] (start at 0, stop at end of list)
```

As you can probably tell from the examples above, the default values are `start_at = 0`, `stop_before = len(nums)`, `step = 1`.

> An idiomatic way to shallow clone a list would be using `[:]` (e.g. `nums_clone = nums[:]`).

### Negative values

All three of the arguments also accept negative values. For `start_at` and `stop_before`, a negative value means counting from the end of the list instead of counting from the start. For example `-1` would represent the last element, `-2` the second last element etc. For example:

```py
nums = [1, 2, 3, 4, 5]

nums[1:-2]    # [2, 3]      (start at 1, stop before 2nd to last)
nums[-3:-1]   # [3, 4]      (start at 3rd to last, stop before last)
```

A negative `step` means that the list is sliced in reverse (from end to start). This also means that `start_at` should be greater than `stop_before` and that `stop_before` in the context of a reverse stride is more like `stop_after` if you are looking at the list non-reversed. For example:

```py
nums = [1, 2, 3, 4, 5]

nums[::-1]    # [5, 4, 3, 2, 1]   (reversed)
nums[4:1:-1]  # [5, 4, 3]   (reversed, start at 4, stop after 1)
nums[-1:1:-2] # [5, 3]      (reversed, start at last, stop after 1, every 2nd)
```

### Empty slices

Bear in mind that slice notation is very forgiving, so you'll get an empty list if the arguments' values are out of the list's range. For example:

```py
nums = [1, 2, 3, 4, 5]

nums[6:8]     # []
nums[:-10]    # []
```

---

_Do you like short, high-quality code snippets and articles? So do we! Visit [30 seconds of code](https://www.30secondsofcode.org/) for more articles like this one or follow us on [Twitter](https://twitter.com/30secondsofcode) for daily JavaScript, React and Python snippets!_ 👨‍💻
[Javascript] Performance of Set and Array
Tags: javascript, array, set
Published: 2022-10-08 06:57:32

이번주 회사에서 코드 리뷰를 하면서 기술 블로그로 쓰기 딱 좋은 주제가 생겼다.

object의 property 값이 중복되는지 체크하는 부분이었는데, 내가 작성한 로직은 아래와 같다.

1. Array에 해당 property 값들을 담아 놓음
2. [lodash](https://lodash.com/docs/4.17.15)의 `_.uniq()`로 Array에서 중복 값 제외
3. object와 Array의 length 비교 (length가 다르다면 중복 값이 존재함)

 
리뷰해주는 동료분께서, 중복값을 체크하려면 Set을 써도 되지 않겠냐고 의견을 주셨다. 한동안 [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)을 안쓰고 있어서 기억 저편에 있었다😅

#### Set을 사용하는 경우 로직:
1. Set에 해당 property 값들을 담아 놓음 (Set은 uniq한 값들만 저장됨)
2. object와 Array의 length 비교

Array와 가장 큰 차이는 중복값을 체크하는 코드가 필요없다는 것!!!
그러다 문득 Array와 Set의 퍼포먼스가 어느정도 차이가 나는지 궁금해졌다.

---

Array를 사용한 경우: 
```typescript
let isDuplicate: boolean = false;
const names: string[] = [];

console.time('use Array');

_.forEach(result, (item) => {
  names.push(item.name);
});

if (result.length !== _.uniq(names).length) {
  isDuplicate = true;
}

console.timeEnd('use Array');
```
<img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vbgi74ku54g0kuse7bbd.png" alt="image" width=200/>

Set을 사용한 경우: 
```typescript
let isDuplicate: boolean = false;
const names: Set<string[]> = new Set();

console.time('use Set');

_.forEach(result, (item) => {
  names.add(item.name);
});

if (result.length !== names.size) {
  isDuplicate = true;
}

console.timeEnd('use Set');
```
<img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nl207qgmg563zebqo4lc.png" alt="image" style="margin: 0;"/>

---

데이터의 수가 100개 미만인 지금 상황과 같은 경우, Set이 Array보다 약 0.01 ms 정도 빨랐다.
현재 코드에선 거의 차이가 안나는 수준이긴 하다.

그런데 만약 데이터가 1k, 10k 정도로 많아진다면?

|   | Array  | Set  |
|---|---|---|
| 1k  | ![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nduwvlera6sm8rang472.png) | <img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q82vwkqc43p5zvo0ffho.png" alt="image" style="margin: 0;"/> |
| 10k  | ![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acnifcxgkm86vqwdjd2o.png) | <img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/je34xhyclcxdx4cl4l8a.png" alt="image" style="margin: 0;"/> |
| 100k  | ![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b932mj0h584up7u57xlg.png)| ![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nztfognih93g75zt59tj.png)|

1,000개 까지는 눈에 띄게 차이가 나지 않지만, 10만개 이상의 많은 데이터의 경우 38ms 정도 차이가 난다. 이 땐, Set을 사용하는 것이 퍼포먼스 측면으로는 더 낫다고 볼 수 있겠다.

❗️이건 **Array**의 `push + lodash _.uniq() + Array.length`
**Set**의 `add + Set.size` 조합을 비교한 경우이기 때문에, 
데이터 삭제, index 추출 등 Array와 Set의 퍼포먼스는 각각 다 다를 수 있다.

현재 해당 기능의 로직상 10만개 이상의 데이터가 들어오는 경우는 거의 없지만, 코드의 가독성 측면에서 Set을 사용하는 게 더 낫다고 결론이 나왔다.😌😌

잊고 있었던 Set을 다시 상기 시키고, Array와 Set을 비교해 글까지 작성하게 해준 이번 코드 리뷰였다. 매일 배우는 즐거움과 성장할 기회가 주어지는 개발자라는 내 직업이 너무 행복함을 다시 한 번 느꼈다🥰
How to view fields in an unauthorized connector's action cards
Tags: okta, workflows, nocode
Published: 2022-10-08 06:36:59


You can view the `input` and `output` fields of a connector's action cards without having to create and authorize a pre-built connection first. This can be helping during flow development when you don't have the correct account or credentials to authorize a connector with.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s2jlelsyhk0raj1jhoob.png)

Note: This will **only work with action cards that have static input and output fields**. Action cards which support dynamic fields (such as selecting an existing Slack channel) cannot be viewed and will fail to load.

---

**Steps**
- Add a connector's action card to your flow
- Select the "gear" icon on the card
- Select "choose fields"
- Select the fields you want and click "Save"

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/koumdt12g6f90p9bu279.png)

The flow can be saved with unauthenticated actions cards, however you must first connect your apps and update your action cards before you can enable a flow!
PHP Operators
Published: 2022-10-08 06:23:28

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mbkqc4sz2oz6t0j58mxz.png)

- An operator is a special symbol that performs specific operations on one, two, or three operands and then returns a result. 
- Operators can be grouped according to the number of values they take.

- Unary operators take only one value, for example, ++ (the increment operator).

- Binary operators take two values, for example, arithmetic operators familiars like + (plus) and - (minus), and the majority of PHP operators.

To read more Visit the website:(https://tutorialsprog.com/php/php-operators)
Yarn or Npm
Published: 2022-10-08 06:23:17

Yarn (_Yet Another Resource Negotiator_) was developed in 2016 by facebook to replace Npm, the main idea for the design was to provide a package manager which offers many features that Npm lacked. Npm has however added many features and thus makes yarn more of an alternative than a replacement. 

Npm(_Node package manager_) is the default package manager for Node.js, it has a command line interface that enables install, removal, and management of Node.js packages. It is included by default with Node.js and it doesn't require additional installation steps.

**Comparison**

- Speed: as Yarn downloads packages, it caches them to avoid to avoid downloading same package twice. Npm downloads packages sequentially. Yarn is faster when downloading larger files while Npm one the other hand is slower when downloading larger files.

- Security: yarn verifies integrity of installed packages using checksum before the codes are executed. Npm verifies using the _SHA-512_ stored in the package-lock.json file.     

**Which one to Use**

Yarn is new and it is gaining popularity fast, it has features has features which are advanced such as _Plug’n’Play_ and _Zero-Install to offer_ that improves performance and security marginally but consumes more disk space.
Npm uses less disk space and it is preferred by developers who are used to how the older versions work and are happy with the current workflow.

In conclusion, it is upon the developers to choose the one which work well for them.
Git Submodule Examples
Published: 2022-10-08 05:53:40

# Git Submodule

- add remote repo into existing repo
- add existing repo folder as submodule

## What is submodule

In short, one git repo includes other git repos.

```sh
codespace (git repo, private)
├── Archived_projects (git repos)
└── Projects
    ├── project-foo (git repo)
    └── project-bar (git repo)
```

## add remote repo into existing repo as submodule

```shell
git submodule add https://github.com/qdriven/fluentqa-monorepo.git daily-toolkits/fluentqa-monorepo
```

[![asciicast](https://asciinema.org/a/VfzDpa9I0WrIhtGFJtMfJWqsU.svg)](https://asciinema.org/a/VfzDpa9I0WrIhtGFJtMfJWqsU)

the change now is in the .gitmodule file

```shell
[submodule "daily-toolkits/fluentqa-monorepo"]
	path = daily-toolkits/fluentqa-monorepo
	url = https://github.com/qdriven/fluentqa-monorepo.git
```

## add existing repo folder as submodule

Sometimes, there are already some github repo in a existing repo

```shell
> ls -al
total 24
drwxr-xr-x   7 patrick  staff   224 10  8 11:50 .
drwxr-xr-x  18 patrick  staff   576 10  8 11:50 ..
-rw-r--r--@  1 patrick  staff  6148  9 25 10:32 .DS_Store
-rw-r--r--   1 patrick  staff   304  9 25 10:51 README.md
drwxr-xr-x  14 patrick  staff   448  9 24 16:24 fluent-project-templates
drwxr-xr-x  15 patrick  staff   480 10  8 11:50 fluentqa-monorepo
```

fluent-project-templates is a git repo, and how to add fluent-project-templates into the parent git repo

1. add existing repo to .gitmodules file

```shell
git submodule add https://github.com/qdriven/gathering.git daily-toolkits/python-gathering
```

2. check .gitmodules file, new submodule is added 

```shell
[submodule "path/to/submodule1"]
    path = path/to/submodule/1
    url = git@github.com:user/submodule1
```
3. run command

```sh
git submodule sync
```

4. commit files

```shell
git add .
git commit -m "add submodules"
git push
```
Cannot find module 'lib/axios'- nuxt 2.15.8 + vite integration error
Tags: nuxt, vue, vite, errors
Published: 2022-10-08 05:26:36

**Vite** is a modern frontend build tool that provides an extremely fast development environment and bundles your code for production. It will change your development experience with super fast hot reloading 🚅.

But there is an issue with nuxt 2.15.8 in integration. You will get an error called - `Cannot find module 'lib/axios'`

So fix that, let's start from begging I mean from installation part- 
To install vite with simple command

[Official site link](https://vite.nuxtjs.org/getting-started/installation)
```bash 
npm i -D nuxt-vite
```

Add to buildModules in `nuxt.config.js`
```js
  buildModules: [
    'nuxt-vite'
  ],
```
And now you will get this error `Cannot find module 'lib/axios'`. This problem comes from vite version. Let's downgrade, then our error will be gone. 

In `package.json` file downgrade vite version `"nuxt-vite: 0.3.5"` to `"nuxt-vite": "^0.2.4"` 

Then again install all dependencies by
```bash 
npm install
```
Now you can run `npm run dev` and enjoy `vite` blessing fast speed.

If you are in 1st place I mean you are going to install `vite` you can install specific version by 
```js
npm install nuxt-vite@0.2.4
```
151 days streak on Leetcode🥳🥳🥳🥳
Tags: chiki1601, leetcode, programming, challenge
Published: 2022-10-08 05:19:44

I completed today 151 days strak on Leetcode.....🥳🥳🥳🥳
I am glad that my consistency is increased...and I become a regular person since 151 days...

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gby76fpak8dcdj1wkono.jpg)


Consisterncy is the key which makes you perfect!!!!
Working with Multiple Gitconfig
Tags: git, beginners
Published: 2022-10-08 05:48:33

---
title: Working with Multiple Gitconfig
published: true
date: 2022-10-08 04:57:59 UTC
tags: git,beginners
canonical_url: https://clavinjune.dev/en/blogs/working-with-multiple-gitconfig/
---

![Photo by @praveentcom on Unsplash](https://images.unsplash.com/photo-1647166545674-ce28ce93bdca?fm=webp&q=50&w=1920 "Photo by @praveentcom on Unsplash")

## Introduction

This article will be a quick tips if you're using multiple git config inside one local machine. For example if you're working on both Gitlab/Bitbucket/Github with different email/username/gpgsign, or you're working on your personal and work git account on the same machine.

## Setup Gitconfig Directory

This directory name would be anything, but for the sake of naming convention let's call it `~/.gitconfig.d/`.

```shell
$ mkdir -p "$HOME/.gitconfig.d/" && cd "$_"
$ pwd
/Users/clavianus.juneardo/.gitconfig.d
```

## Setup Each Gitconfig

Now you have create the directory, let's say you want to set your `personal` and `work` account:

### Setup Personal Gitconfig

```shell
$ git config --file=personal user.name "foo"
$ git config --file=personal user.email "foo@gmail.com"
$ git config --file=personal core.editor "vim"
...
```

By using `--file=personal` flag, the gitconfig will be configured inside `personal` file.

```shell
$ cat personal
[user]
	name = foo
	email = foo@gmail.com
[core]
	editor = vim
```

Now let's do the same with your work account.

### Setup Work Gitconfig

```shell
$ git config --file=work user.name "foo bar"
$ git config --file=work user.email "foo@company.com"
$ git config --file=work user.signingKey "ABCDEF012345"
$ git config --file=work commit.gpgsign true
$ git config --file=work core.editor "vim"
...

$ cat work
[user]
	name = foo bar
	email = foo@company.com
	signingKey = ABCDEF012345
[commit]
	gpgsign = true
[core]
	editor = vim
```

Now you have set both your account. Then, how to switch between each gitconfig?
Let's say you put all your company's git directory at `~/Works` and yours at `~/Personals`. You can switch easily by configure the global gitconfig using `includeIf`.

```shell
cat <<EOF > ~/.gitconfig
[includeIf "gitdir:~/Works/"]
  path = ~/.gitconfig.d/work
[includeIf "gitdir:~/Personals/"]"
  path = ~/.gitconfig.d/personal
EOF
```

## Conclusion

Now everytime you're inside `~/Works/` you are using the `~/.gitconfig.d/work`, and when you're inside `~/Personals/` you are using the `~/.gitconfig.d/personal`. 

You can check whether the gitconfig load properly or not by simply executing `git config user.email` command and see what email is showing up.

Thank you for reading!
Next Greater Elements -II
Published: 2022-10-08 04:44:31

Given a circular integer array nums (i.e., the next element of nums[nums.length - 1] is nums[0]), return the next greater number for every element in nums.

The next greater number of a number x is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn't exist, return -1 for this number.

 

Example 1:

Input: nums = [1,2,1]
Output: [2,-1,2]
Explanation: The first 1's next greater number is 2; 
The number 2 can't find next greater number. 
The second 1's next greater number needs to search circularly, which is also 2.


```js
var nextGreaterElements = function (nums) {
  // as it is circular array doubling the length of array
  let nArray = nums.concat(nums);
  // orignal array
  let n = nums.length;
  // dummy result array;
  let result = new Array(n).fill(-1);
  // temp arrray to hold values
  let stack = [];
  // looping till twice of array so that all element gets a fair chance to check for it next greater
  for (let i = 0; i < nArray.length; i++) {
    // doing mod so that we have index(s) always equal to lengtho of num
    // here playing with index(s) hence nums[stack[0]] ===> will give value
    while (stack.length && nums[i % n] > nums[stack[stack.length - 1]]) {
      result[stack.pop()] = nums[i % n];
    }
    stack.push(i % n);
  }
  return result;
};

console.log(nextGreaterElements([1, 2, 1]));


```
grifo cocina extraible
Published: 2022-10-08 04:42:17

¿Está buscando una manera de agregar un poco de clase y sofisticación a su cocina? Pues no busques más allá del Nivito **[grifo cocina extraible](https://www.nivito.es/rh-120-vi.html)**. Este lujoso grifo de cocina presenta un diseño elegante que seguramente llamará la atención en cualquier cocina. El grifo de cocina Nivito está fabricado con materiales de alta calidad, por lo que puede estar seguro de que durará muchos años. Y con sus controles fáciles de usar, podrá ajustar fácilmente la temperatura y el flujo del agua para satisfacer sus necesidades. Además, el grifo de cocina Nivito viene con un dispensador de jabón incorporado, lo que lo hace aún más cómodo de usar. Entonces, ¿por qué esperar más? Dale a tu cocina la actualización que se merece con el grifo de cocina Nivito.
16. Leetcode solution in CPP
Tags: cpp
Published: 2022-10-08 04:28:32

```cpp
class Solution {
 public:
  int threeSumClosest(vector<int>& nums, int target) {
    int ans = nums[0] + nums[1] + nums[2];

    sort(begin(nums), end(nums));

    for (int i = 0; i + 2 < nums.size(); ++i) {
      if (i > 0 && nums[i] == nums[i - 1])
        continue;
      // Choose nums[i] as the first num in the triplet,
      // and search the remaining nums in [i + 1, n - 1]
      int l = i + 1;
      int r = nums.size() - 1;
      while (l < r) {
        const int sum = nums[i] + nums[l] + nums[r];
        if (sum == target)
          return sum;
        if (abs(sum - target) < abs(ans - target))
          ans = sum;
        if (sum < target)
          ++l;
        else
          --r;
      }
    }

    return ans;
  }
};

```

#leetcode
#challenge
here is the link for the problem: 
https://leetcode.com/problems/3sum-closest/
How to access projects in multimodule Gradle project?
Tags: gradle, modularization, android, java
Published: 2022-10-08 04:26:57

---
title: How to access projects in multimodule Gradle project?
published: true
description: Using Gradle's typesafe project accessor to access project in multimodule project
tags: #gradle #modularization #android #java
cover_image: https://images.unsplash.com/photo-1505778276668-26b3ff7af103?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2061&q=80&w=640
# Use a ratio of 100:42 for best results.
---

In a multimodule Gradle project, you're likely to have.. many modules. Each module can have other modules as dependencies.

```kotlin
dependencies {
	implementation(project(":feature:feature-payment"))
	implementation(project(":lib:crypto"))
	implementation(project(":android-lib:navigation"))	
}
```

How would you remember the module name, if you have 100 modules?

![An example of multimodule project called nowinandroid](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/krshd3or6kyrfjbcvgr7.png)

Sure, you can type the module name manually, like in the above code snippet.
But is there a safer and faster way to access the project?
Yes, there is!

By using Gradle's `TYPESAFE_PROJECT_ACCESSORS`, we can access the projects in our project in a typesafe way.

If your project exists, the IDE will give autocomplete.

![Autocomplete](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x25c3afkpuvroum7s1xp.gif)

If your project doesn't exist, the IDE will give you an error.

## Setup

1. Make sure you're using Gradle 7.0 or higher
2. In your root project `build.gradle` file, add the following line of code.

```
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
```

## Result

Open your `build.gradle` or `build.gradle.kts`, the dependencies above will look like this.

```kotlin
dependencies {
	implementation(projects.feature.featurePayment)
	implementation(projects.lib.crypto)
	implementation(projects.androidLib.navigation)	
}
```

Notice that Gradle converts the module with kebab-case or snake_case to camelCase. From `feature-payment` to `featurePayment`.

## Summary

By using typesafe project accessors you can access modules in your project in a typesafe manner. Currently, Gradle still marks this feature as experimental. But you can use it in your project by enabling the `TYPESAFE_PROJECT_ACCESSORS` in the `build.gradle` file.

References:
- [Type-safe project accessors](https://docs.gradle.org/7.0/release-notes.html)
Beginner guide on python🐍🐼pandas
Tags: python, panda, datascience, machinelearning
Published: 2022-10-08 04:24:58



**What is pandas?**

Python pandas is an open-source library that is widely used for data analysis.
Pandas library is used for reading and manipulating data in ML and data science.

```
pip install pandas
```

_pip command to install pandas in your system_.

**What is DataFrame?**

A pandas DataFrame is a 2 dimensional data array or a table with rows and columns.

**Create Data Frame In pandas:**

```
import pandas as pd
car_dataset = {
'cars': ['Tata', 'Maruti', 'Tesla'], 'Model': ['Nano', 'i10', '11x3'], 'Range: [300, 315, 400]
}
car_df = pd.DataFrame(car_dataset)
print(car_df)
```

Basic column operation on Data Frame
You can easily access the data frame column using square brackets and also assign or update its values.
Below are some basic operations you can perform on a Data Frame Column.

```
#Accessing Single Column
print(car_df[['cars']])
# you can also use single square brackets to access single column
#Accessing Multiple Column
print(car_df [[ 'Model', 'Range']])
# Add New Column
car_df['new_column_name'] = [1, 2, 3] # new column value
# Delete Column
car_df.drop(columns=['new_col_name'], inplace=True)
# rename column
#Syntax: df.renamel columns={"oldName":"NewName"}, inplace=True)
car_df.rename(columns={ 'Model' : 'model'}, inplace=True)
```


**Read CSV File:**

A simple way to store big data sets is to use CSV files (Comma Separated Files).
CSV files is the common file type you will use while working in Machine Learning or Data Science.

```
import pandas as pd
df = pd.read_csv('Housing.csv') print(df)
# print(df.to_string())
# use to_string() to print the entire DataFrame.
```


**Peek Into The Data:**

To understand the high-level overview of the data, pandas offers multiple functions and some of them are:

```
import pandas as pd
 Read CSV File
df = pd.read_csv('Housing.csv')
#head of the data
print(df.head(10)) print first 19 rows of dataframe
#tall of the data
print(df.tail(10)) print last 10 rows of dataframe
#shape = To know the dimensions of the data print(df.shape)
#(545, 19) 11's means 545 rows and 13 columns
#Features
print(df.columns) # it return the columns name
#Index("price", "area", "bedrooms bathrooms, stories", "matnroad"
#guestroom", "basement, hotwaterheating', 'airconditioning,
#parking prefarea", furnishingstatus ], dtype="object")
#info
print(df.info())
prints info about the null values and the data types of each cols.

```

**Statistical Analysis Using Pandas:**
Pandas offer some functions which help you to dig deeper and find more useful insight from the data and some of the useful functions are:

```
# describe : returns statistical measures such as min and max values, mean, standard deviation and more.
df.describe()
# unique : return all the unique values in column.
df['columnName'].unique()
#value_count : returns the frequency of the values df['columnName'].value_counts()
# correlation : find the correlation among the features respectively.
df.corr()
```

Pandas also have functions to find other statistical measures like mean, median and, mode, etc.